将Excel 95转换为Excel 97或更高版本

时间:2010-06-24 19:05:24

标签: c# excel

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

另外:我们不能使用Excel COM Interop。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

你可以使用一个小的Excel助手宏来。使用命令行打开你的95源和.Save作为另一种格式。您可以使用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

模块“Module1”

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必须在“宽松安全”上运行以避免启动时出现宏警告消息 - 但是只要您调试警告消息就是GREAT(禁用允许您返回代码;-))

我快速&脏在Excel2003上测试了这个

希望有所帮助