【问题标题】:How to program to save a bunch of ".xls" files in Excel如何编程在 Excel 中保存一堆“.xls”文件
【发布时间】:2015-02-21 01:42:22
【问题描述】:

我需要处理大量来自这个名为 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 00 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 23 23 30 2E 25 30 30 3B 5B F0 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 1 2E 0 22 E 0B 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 5 2E 30 2 30B 2 64 5D 5C 2D 23 2C 23 23 30 2E 30 30 22 F0 2E 2E 2E 2E 2E 2E 2E 04 04 04 05 00 00 00 02 30 25 1E 04 04 04 08 00 00 00 00 05 30 2E 30 30 30 30 25 1E 04 04 0B 00 00 00 00 00 08 30 2E 30 30 30 30 30 45 2B 30 30 30 1E 04 0A 00 00 07 23 22 20 22 3F 2F 2F 3F 3F 1E 04 09 00 00 00 00 06 23 22 20 22 22 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 1E 04 0D 00 00 0A 64 64 64 2F 6D 6D 6D 6D 6D 2F 79 79 79 79 79 79 1E 04 04 04 04 04 04 04 04 04 04 04 04 04 04 0C 00 00 00 09 64 64 2F 6D 6D 6D 6D 2F 79 79 1E 04 09 00 00 00 00 06 64 64 64 2F 6D 6D 6D 6D 6D 6D 6D 6D 1E 04 09 00 00 00 00 00 06 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 2F 79 79 79 79 1E 00 00 00 00 00 00 00 00 0B 68 3A 68 3A 6 DA 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 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 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 5C 20 41 4D 2F 50 4D 1E 04 11 00 00 00 0E 0E 68 3A 3A 6D 6D 3A 73 73 73 5C 20 41 4D 2F 50 4D 1E 04 04 04 04 04 04 04 68 3A 68 3A 6D 6D 6D 6D 6D 6D 1E 04 04 0A 00 00 00 00 00 00 07 68 3A 68 3A 6D 6D 6D 6D 6D 6D 6D 6D 6D 3A 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 04 08 00 00 05 6D 6D 6D 3A 73 73 1E 04 04 04 04 04 00 00 00 00 01 40 1E 04 36 00 00 33 5F 2D 2A 20 23 2C 23 2C 23 2C 23 2C 23 23 23 23 23 30 22 F0 2 2 2 2 2 22 5f 2d 3b 5f 2d 3b 5f 2d 3b 5f 2d 3b 5f 2d 3b 5f 2d 3b 5f 2d 3b 5f 2d 3b 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 2 00 33 30 5F 2D 2 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 0 40 3 5F 00 2D 0E 01 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 3 22 2F 2A 20 3F 22 2F 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 0 2C 23 E 23 3 E 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 6 35 6E 70 6 2 14 00 A0 00 00 00 0E 00 0D 4D 53 20 53 61 6E 73 20 53 65 72 69 66 31 00

【问题讨论】:

  • 它们是什么格式?
  • 它们是 xls,但不是 apache-poi 可以识别的正确形式。如果我不先将它们保存在 Excel 中,我会收到以下错误org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature: read 0x0010000700060409, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
  • 取一个文件,把后缀改成.zip,看看能不能解压。让我们知道。
  • 另外,检查它是否是纯文本。
  • 它们不是纯文本。 Less 不会打开它们(说它们是二进制文件) Excel 打开它们没有任何问题。我觉得header的(元数据)格式有点奇怪。

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


【解决方案1】:

您是否反对只使用 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

【讨论】:

  • 嗯,它绝对不是 OLE 复合文档。那些必须开始:Header Signature (8 bytes): Identification signature for the compound file structure, and MUST be set to the value 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1. 根据微软的 MS-CFB 二进制文件格式。
  • 在 0x09 0x04 0x06 上进行网络搜索提供了足够的证据让我认为这是一个 Excel 4.0 文件。很老了。
  • 看看这个 SO 帖子:stackoverflow.com/questions/802299/…
  • @BigBobby,完全不熟悉 VBA。是否必须打开excel才能运行此代码,或者它可以在excel之外自行运行?
  • 您在 Excel 中运行它。要使用我发布的代码,您需要 1) 在 Excel 中启用开发人员选项卡,以便您可以使用宏 (msdn.microsoft.com/en-us/library/bb608625.aspx)。 2) 创建一个新的电子表格并使用 SaveAs 启用宏(它将具有 .xlsm 文件扩展名而不是 .xlsx)。 3) 点击 Developer 选项卡中的 Visual Basic 按钮,调出 VBA 开发环境。 4) 将我的代码复制/粘贴到 VBA 编辑器中。 5) 单击运行按钮。然后,我的宏将打开您的所有其他 .xls 文件,并使用 Excel 中的 SaveAs 重新保存它们。
【解决方案2】:

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

【讨论】:

  • JODConverter 是否将 excel 4.0 转换为 97-2004 格式以便 Apache POI 可以读取?
  • 它将转换为 Open Office。你也可以试试 JACOB,它可以让你控制 OLE 应用,比如 Excel:sourceforge.net/projects/jacob-project
  • Apache POI 确实支持这样的旧 Excel 文件 (Excel 4),但仅用于提取为纯文本。您至少需要使用 POI 3.12 beta 1
  • @mbmast,解析 ods 格式、按行/单元格读取文本的最佳 Java API 是什么?
  • 我没有使用 OpenOffice 的经验。如果是我,我会先看 Apache:openoffice.org/api
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2023-01-03
    • 2023-03-09
    • 2013-05-08
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多