首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpreadsheetLight c#

SpreadsheetLight c#
EN

Stack Overflow用户
提问于 2017-06-08 15:47:06
回答 2查看 869关注 0票数 0

spreadsheetLight是否具有在中从右向左方向中创建excel工作表的功能.也就是说,A 应该出现在excel工作表的右侧。

EN

回答 2

Stack Overflow用户

发布于 2017-06-28 12:26:48

SpreadSheetLight确实持久化了RightToLeft属性,如果您打开一个现有的工作簿,并将RightToLeft属性设置为True,您可以修改现有的工作簿和保存或保存,结果也将被设置为RightToLeft。

困难在于复杂的事情似乎很简单,因为它存在于Excel中的单个复选框中,属性被设置在每个工作表视图中,尽管对于这个值大多数被忽略。因为SpreadSheetLight确实坚持了这一点,这意味着它确实读取并保存回来,这样您就可以实际更改它;但是,它没有公开,所以您需要使用反射。

下面是一个快速而肮脏的示例,说明如何在VB.net中为工作簿/SLDocument全局读取和修改它,应该非常容易转换为C#

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-06-10 17:23:46

我已经对此进行了深入检查,并了解到SpreadsheetLight目前不支持从右到左的工作表布局。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44440243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档