如何编程在Excel中保存一堆“.xls”文件

时间:2015-02-20 15:51:03

标签: java python excel apache-poi poi-hssf

我需要处理大量的.xls文件,这些文件来自这个名为Aperio的显微镜图像分析软件(在使用Aperio进行分析后,它允许您将数据导出为“只读”xls格式。仅适用于Mac上的Excel,在Windows机器上,由于文件受到保护,因此保存和另存为按钮显示为灰色。不幸的是,这些文件的标头不是标准的OLE2格式。因此,除非在Microsoft Excel中手动加载并逐个保存为.xls,否则无法使用Java API POI获取它们。

由于目录中有这么多,因此手动执行保存会非常痛苦。有没有办法编写Java程序来自动将这些文件保存为标准的xls文件?如果Java不可能,那么其​​他什么语言可以处理这种情况,Python?

编辑:

我在hex reader中加载了一个文件,这里是: 09 04 06 00 07 00 10 00 00 00 5C 00 04 00 05 4D 44 41 80 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 F0 F0 00 00 00 00 00 FF FF FF 00 00 00 00 00 FF FF FF 0C 00 02 00 01 00 0D 00 02 00 64 00 0E 00 02 00 01 00 0F 00 02 00 01 00 11 00 02 00 00 00 22 00 02 00 00 00 2A 00 02 00 00 00 2B 00 02 00 00 00 25 02 04 00 00 00 FF 00 1F 00 02 00 22 00 1E 04 0A 00 00 00 07 47 65 6E 65 72 61 6C 1E 04 04 00 00 00 01 30 1E 04 07 00 00 00 04 30 2E 30 30 1E 04 08 00 00 00 05 23 2C 23 23 30 1E 04 0B 00 00 00 08 23 2C 23 23 30 2E 30 30 1E 04 18 00 00 00 15 23 2C 23 23 30 5F F0 5F 2E 3B 5C 2D 23 2C 23 23 30 5F F0 5F 2E 1E 04 1D 00 00 00 1A 23 2C 23 23 30 5F F0 5F 2E 3B 5B 52 65 64 5D 5C 2D 23 2C 23 23 30 5F F0 5F 2E 1E 04 1E 00 00 00 1B 23 2C 23 23 30 2E 30 30 5F F0 5F 2E 3B 5C 2D 23 2C 23 23 30 2E 30 30 5F F0 5F 2E 1E 04 23 00 00 00 20 23 2C 23 23 30 2E 30 30 5F F0 5F 2E 3B 5B 52 65 64 5D 5C 2D 23 2C 23 23 30 2E 30 30 5F F0 5F 2E 1E 04 18 00 00 00 15 23 2C 23 23 30 22 F0 2E 22 3B 5C 2 D 23 2C 23 23 30 22 F0 2E 22 1E 04 1D 00 00 00 1A 23 2C 23 23 30 22 F0 2E 22 3B 5B 52 65 64 5D 5C 2D 23 2C 23 23 30 22 F0 2E 22 1E 04 1E 00 00 00 1B 23 2C 23 23 30 2E 30 30 22 F0 2E 22 3B 5C 2D 23 2C 23 23 30 2E 30 30 22 F0 2E 22 1E 04 23 00 00 00 20 23 2C 23 23 30 2E 30 30 22 F0 2E 22 3B 5B 52 65 64 5D 5C 2D 23 2C 23 23 30 2E 30 30 22 F0 2E 22 1E 04 05 00 00 00 02 30 25 1E 04 08 00 00 00 05 30 2E 30 30 25 1E 04 0B 00 00 00 08 30 2E 30 30 45 2B 30 30 1E 04 0A 00 00 00 07 23 22 20 22 3F 2F 3F 1E 04 09 00 00 00 06 23 22 20 22 3F 3F 1E 04 0D 00 00 00 0A 64 64 2F 6D 6D 2F 79 79 79 79 1E 04 0C 00 00 00 09 64 64 2F 6D 6D 6D 2F 79 79 1E 04 09 00 00 00 06 64 64 2F 6D 6D 6D 1E 04 09 00 00 00 06 6D 6D 6D 2F 79 79 1E 04 0E 00 00 00 0B 68 3A 6D 6D 5C 20 41 4D 2F 50 4D 1E 04 11 00 00 00 0E 68 3A 6D 6D 3A 73 73 5C 20 41 4D 2F 50 4D 1E 04 07 00 00 04 68 3A 3A 6D 1E 04 0A 00 00 00 07 68 3A 6D 6D 3A 73 73 1E 04 13 00 00 00 10 64 64 2F 6D 6D 2F 79 79 79 79 5C 20 68 3A 6D 6D 1E 04 0B 00 00 00 08 23 23 30 2E 30 45 2B 30 1E 04 08 00 00 00 05 6D 6D 3A 73 73 1E 04 04 00 00 00 40 1E 04 36 00 00 00 33 5F 2D 2A 20 23 2C 23 23 30 22 F0 2E 22 5F 2D 3B 5C 2D 2A 20 23 2C 23 23 30 22 F0 2E 22 5F 2D 3B 5F 2D 2A 20 22 2D 22 22 F0 2E 22 5F 2D 3B 5F 2D 40 5F 2D 1E 04 36 00 00 00 33 5F 2D 2A 20 23 2C 23 23 30 5F F0 5F 2E 5F 2D 3B 5C 2D 2A 20 23 2C 23 23 30 5F F0 5F 2E 5F 2D 3B 5F 2D 2A 20 22 2D 22 5F F0 5F 2E 5F 2D 3B 5F 2D 40 5F 2D 1E 04 3E 00 00 00 3B 5F 2D 2A 20 23 2C 23 23 30 2E 30 30 22 F0 2E 22 5F 2D 3B 5C 2D 2A 20 23 2C 23 23 30 2E 30 30 22 F0 2E 22 5F 2D 3B 5F 2D 2A 20 22 2D 22 3F 3F 22 F0 2E 22 5F 2D 3B 5F 2D 40 5F 2D 1E 04 3E 00 00 00 3B 5F 2D 2A 20 23 2C 23 23 30 2E 30 30 5F F0 5F 2E 5F 2D 3B 5C 2D 2A 20 23 2C 23 23 30 2E 30 30 5F F0 5F 2E 5F 2D 3B 5F 2D 2A 20 22 2D 22 3F 3F 5F F0 5F 2E 5F 2D 3B 5F 2D 40 5F 2D 31 00 14 00 A0 00 00 00 08 00 0D 4D 53 20 53 61 6E 73 20 53 65 72 69 66 31 00 14 00 A0 00 00 00 0E 00 0D 4D 53 20 53 61 6E 73 20 53 65 72 69 66 31 00

3 个答案:

答案 0 :(得分:2)

您是否反对使用Excel宏执行此操作? VBA并不是非常优雅,但它适用于与Excel文件操作相关的所有事情。这将是搜索.xls文件的目录,创建新目录以及在新目录中重新保存这些.xls文件的代码:

Sub Resave_Files()

    ' Directory to search for .xls files.
    file_directory = "C:\Bobby\Temp"

    ' Create a temporary directory to save files.
    temp_directory = ActiveWorkbook.Path & "\Temp"
    If Dir(temp_directory, vbDirectory) = "" Then
         MkDir temp_directory
    End If

    ' Resave each .xls file in the temporary directory.
    Dim fs, f
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(file_directory)
    For Each f1 In f.Files
        If (Right(f1.Name, Len(".xls")) = ".xls") Then
            wb_name = ActiveWorkbook.Name
            Set data_wb = Workbooks.Open(f1.Name)
            New_Name = temp_directory + "\" + Left(f1.Name, InStr    (f1.Name, ".xls") - 1) + "_new.xlsx"
            data_wb.SaveAs Filename:=New_Name
            data_wb.Close SaveChanges:=False
        End If
    Next

End Sub

答案 1 :(得分:1)

使用JODConverter。你有一个Excel 4.0文件;对于Apache POI而言太旧了。

答案 2 :(得分:0)

好吧,既然你提到了Python的可能性,你可以使用xlrd来读取文件(它声称支持非常旧的Excel文件)。将它们写回来可以使用xlwt完成。为方便起见,xlutils提供了一个复制工具来桥接xlrdxlwt。所有这些都被描述为here。值得注意的是,该页面上的PDF被称为教程,但它也可作为所有三个软件包的实际手册。