0

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

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

编辑:

我在十六进制阅读器中加载了一个文件,这里是: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 92 00 19 00 06 00 00 00 0 0 0 00 F0 0 F0 0 F0 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 220 0 0 02 00 0 2 0 0 0 02 00 0 2 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 04 08 00 00 05 23 2C 23 23 30 1E 04 04 0B 00 00 00 08 23 2C 23 23 23 30 2E 30 2E 30 30 30 1E 04 18 00 00 00 00 15 23 2C 23 23 30 330 5F F0 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 41 5F 20 3E 00E 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 2323 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 20 3B 25C D 22 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 2 302 1E 03 1B 1E 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 30 452 F0 2E 6D 6C 22 2d 23 2c 23 23 30 2e 30 30 22 f0 2e 2 2 22 1e 04 04 05 00 00 00 00 02 30 25 1E 04 04 04 04 04 04 05 00 00 05 30 2E 30 30 30 30 30 25 1E 04 04 04 0B 00 0008 30 2E 30 2E 30 30 30 30 30 45 2B 30 45 2B 30 45 2B 30 30 1E 04 0A 00 00 00 07 23 22 20 22 3F 2F 3F 3F 1E 04 09 00 00 00 06 23 22 20 22 22 3f 3f 3f 3f 3f 3f 3f 3f 3f 1e 04 0d 00 00 00 00 0A 64 64 64 2F 6D 6D 6D 6D 6D 2F 79 79 79 79 79 79 79 1E 04 0C 00 00 09 04 0C 00 00 09 09 1E 00 00 09 00 09 00 09 00 09 09 1E 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 1E04 0E 00 00 00 0B 68 3A 6D 6D 6D 5C 20 41 4D 2F 50 4D 1E 04 11 00 00 00 00 00 000E 68 3A 6D 6D 6D 6D 6D 3A 73 73 5C 20 41 4D 2F 50 4D 2F 50 4D 1E 04 04 04 04 04 07 00 00 00 00 00 04 68 3A 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 1E 04 0a 00 00 00 07 68 3A 6D 6D 3A 73 73 1E 04 13 00 00 00 00 10 64 64 64 2F 6D 6D 6D 6D 6D 2F 79 79 79 79 79 79 5C 20 68 3A 6D 6D 6D 6D 6D 6D 6D 6D 1E 04 04 0B 30 1E 04 08 00 00 00 05 6D 6D 3A 73 73 1E 04 04 04 04 00 00 00 00 01 40 1E 04 36 00 00 00 00 33 5f 2d 2d 2d 2d 2 da 20 23 2c 23 23 30 22 22 22 22 22 22 22 f0 22 f0 2e 2 2 22 22 22 5f 2d 3b 5c 2d 3b 5c 2d 2 dc 2 da 20 23 2 dc 2 da 20 23 2c 2 a 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 25 23 F F0 2 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 3E 00 2D 00 2A 04 3E 3E 00 2D 00 2A 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 2022 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 3C 2E 5F 2A 2D 2B 3 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 04 00 03 E 00 04 06 00 6 08 00 0D 3B 5F 2D 40 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

4

3 回答 3

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
于 2015-02-20T16:17:01.527 回答
1

使用 JOD 转换器。您有一个 Excel 4.0 文件;对于 Apache POI 来说太旧了。

于 2015-02-20T17:33:28.950 回答
0

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

于 2015-02-20T17:42:22.987 回答