【问题标题】:Convert Excel 95 to Excel 97 Or Later将 Excel 95 转换为 Excel 97 或更高版本
【发布时间】:2010-06-25 16:10:58
【问题描述】:

所以我们使用第三方组件来打开并在 Excel 表上做一些工作。但是,该工具无法处理 Excel 95 文件。有谁知道可以将 Excel 95 文件转换为更高格式的工具?它可以指向外部应用程序...最好是基于命令行的东西。

另外:我们不能使用 Excel COM 互操作。

【问题讨论】:

  • 您是否尝试过使用自动化来启动 Excel 进程、加载 Excel 95 文件并保存为新格式?
  • 使用一些第三方组件,例如 aspose.cells
  • 我们已经有第三方组件,不打算再购买。

标签: c# excel


【解决方案1】:

您可以使用 Microsoft Access Database Engine 2010 打开它,然后使用 DocumentFormat.OpenXml.Packaging.SpreadsheetDocument 类将其写入 xlsx 文件。

Google for ado.Net excel c#,您会发现许多有关如何设置连接字符串和打开 Excel 文件的示例。 (例如http://sharpertutorials.com/accessing-excel-spreadsheets-within-c-adonet/

理论上,您应该能够遍历工作表和行/列,并以类似的方式将它们写入 xlsx 文件。

【讨论】:

    【解决方案2】:

    您可以使用一个小的 Excel 辅助宏来使用命令行 .Open 95-source 和 .SaveAs 另一种格式。您可以使用 kernel32/GetCommandLine 例程将 cmdline arg 放入您的应用程序中。

    为此,请创建一个工作簿“Converter.xls”并插入以下代码

    模块“ThisWorkbook”

    Private Sub Workbook_Open()
    Dim CmdRaw As Long, CmdLine As String, Idx As Integer
    Dim MyFile As Workbook
    
    
        CmdRaw = GetCommandLine
        CmdLine = CmdToSTr(CmdRaw)
        ' Msgbox CmdLine
        Idx = InStr(1, CmdLine, "/e/")
        Set MyFile = Workbooks.Open(Mid(CmdLine, Idx + 3, 99))
        MyFile.SaveAs "Test2003.xls", xlExcel7
        Application.Quit
    End Sub
    

    模块“模块1”

    Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long
    Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long)
    
    Function CmdToSTr(Cmd As Long) As String
    Dim Buffer() As Byte
    Dim StrLen As Long
    
       If Cmd Then
          StrLen = lstrlenW(Cmd) * 2
          If StrLen Then
             ReDim Buffer(0 To (StrLen - 1)) As Byte
             CopyMemory Buffer(0), ByVal Cmd, StrLen
             CmdToSTr = Buffer
          End If
       End If
    End Function
    

    最后,通过命令行从包含 95-XLS 的路径调用它

    C:\Progra~1\Micros~2\OFFICE11\excel Converter.xls /e/test95.xls
    

    test95.xls 将被打开并保存为 xlExcel7 格式的 test2003.xls。

    到目前为止,基本技术...现在您可以创造性地添加第二个 cmd 行参数(由“/”分隔 - 更智能地解析,等等

    重要提示:Excel 必须在“宽松的安全性”下运行,以避免在启动时出现宏警告消息 - 但是,只要您调试,警告消息就很好(禁用允许您返回代码;-))

    我在 Excel2003 上快速而肮脏地测试了这个

    希望有帮助

    【讨论】:

    • 如果已经安装了 Excel,那么互操作将是更好的方法,但正如问题中提到的那样。互操作不是一个选项,所以我假设安装 Excel 也不是一个选项。
    • 排除是针对 Excel COM 互操作的(原因可能是:不支持 VBA,仅需要 C#、.NET 框架等),而不是针对 Excel。所以这里有一个解决方案,你只需要 Excel 就可以了,再加上一种让你可以从命令行使用它的技术(批处理)
    • 是的,问题在于 Interop 在某些情况下不可靠 - 这是非常不可预测的。我们可以设置它并让它在某些用户的计算机上运行良好,但在其他用户的计算机上它会失败并显示错误“无法访问互操作”。
    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多