簡體   English   中英

SpreadsheetLight c#

[英]SpreadsheetLight c#

電子表格 Light是否具有在從右到左的方向上創建Excel工作表的任何功能。 也就是說, 應出現在excel表格的右側。

SpreadSheetLight確實保留RightToLeft屬性,如果您將RightToLeft屬性設置為True打開現有工作簿,則可以修改現有工作簿以及Save或SaveAs,結果也將設置RightToLeft。

困難之處在於某些事情似乎很簡單,因為它存在於Excel中的單個復選框中,盡管每個值都忽略了大多數屬性,但每個工作表視圖都設置了該屬性。 由於SpreadSheetLight確實保留了此內容,因此意味着它確實讀取並保存了該內容,因此您可以進行實際更改。 但是,它沒有暴露,因此您需要使用反射。

這是一個快速而又骯臟的示例,說明如何在VB.net中為Workbook / SLDocument全局讀取和修改它,應該足夠容易地轉換為C#

Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports SpreadsheetLight

Public Module SlDocumentExtender
    <Extension>
    Public Sub SetRightToLeft(ByVal slDoc As SLDocument, ByVal rightToLeft As Boolean)
        Dim sheetViews = GetSheetViews(slDoc.GetSlws)
        If Not sheetViews.Any AndAlso rightToLeft Then 'Don't bother creating a default SheetView if false since it's the default
            slDoc.FreezePanes(1, 0)
            slDoc.UnfreezePanes()
            sheetViews = GetSheetViews(slDoc.GetSlws)
        End If
        sheetViews.ForEach(Sub(sv) SetRightToLeftSheetView(sv, rightToLeft))
    End Sub

    <Extension>
    Public Function GetRightToLeft(ByVal slDoc As SLDocument) As Boolean
        Dim sheetViews = GetSheetViews(slDoc.GetSlws)
        Return sheetViews.Any(Function(sv) GetRightToLeftSheetView(sv)) 'Empty collection will return false which is the default so we're good
    End Function

    <Extension>
    Public Function GetSlws(ByVal slDoc As SLDocument) As Object 'SLWorksheet
        Return slDoc.GetType.GetField("slws", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(slDoc)
    End Function

    Private Sub SetRightToLeftSheetView(ByVal sheetView As Object, ByVal rightToLeft As Boolean)
        GetRequiredType(sheetView, "SpreadsheetLight.SLSheetView").GetProperty("RightToLeft", BindingFlags.Instance Or BindingFlags.NonPublic).SetValue(sheetView, rightToLeft)
    End Sub

    Private Function GetRightToLeftSheetView(ByVal sheetView As Object) As Boolean
        Return GetRequiredType(sheetView, "SpreadsheetLight.SLSheetView").GetProperty("RightToLeft", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(sheetView)
    End Function

    Private Function GetSheetViews(ByVal slws As Object) As List(Of Object) 'List<SLSheetView>
        Return DirectCast(GetRequiredType(slws, "SpreadsheetLight.SLWorksheet").GetProperty("SheetViews", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(slws), IList).OfType(Of Object).ToList()
    End Function

    Private Function GetRequiredType(ByVal obj As Object, ByVal requiredType_FullName As String) As Type
        Dim type = obj.GetType
        If Not type.FullName.Equals(requiredType_FullName) Then
            Throw New NotSupportedException(String.Format("Type ""{0}"" is not supported, this method only handles only type ""{1}"".", type.FullName, requiredType_FullName))
        End If
        Return type
    End Function
End Module

我對此進行了深入檢查,發現SpreadsheetLight目前不支持從右到左的頁面布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM