【问题标题】:How to load in Python an xlsx that originally had .xls file extension?如何在 Python 中加载最初具有 .xls 文件扩展名的 xlsx?
【发布时间】:2015-09-21 14:35:38
【问题描述】:

我用xlrd处理.xls文件,用openpyxl处理.xlsx文件,效果很好。

然后我收到了一个表面上是 .xls 的文件,所以我尝试xlrd.open_workbook(),然后得到:

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '<?xml ve'

我查看this 问题,我推测我的文件虽然以扩展名.xls 结尾,但实际上必须是.xlsx。事实上,我可以在文本编辑器中查看它:

<?xml version="1.0" encoding="UTF-8"?>
                      <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
                       xmlns:x="urn:schemas-microsoft-com:office:excel"
                       xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
                       xmlns:html="http://www.w3.org/TR/REC-html40">
:
:
:

(出于隐私原因,我无法发布整个文件,但我们的分析可能不需要它)。

所以我推测,如果我只是将 (cp) 复制到 .xlsx,我应该可以使用 openpyxl.load_workbook() 打开它,但我得到:

BadZipfile: File is not a zip file

如果它实际上是一个 xls(不太可能)但不能用xlrd 打开,如果它实际上是一个 xlsx 但不能用openpyxl 打开,即使在我将cp 转换为 . xlsx,怎么办?

注意:如果我在 Excel 中打开 .xls,将其另存为 .xlsx,然后使用 openpyxl 重试,它确实可以正常加载,但这个手动步骤并不是我在执行我的程序。

【问题讨论】:

  • 你运行的是什么版本的 xlrd?
  • 在 excel 生成的文件和原始 xls 之间做一个文件差异?也许差异是你可以改变的东西
  • @Zenadix 谢谢,但是 1) xlrd 应该 打开它但不正是我的问题。 2) 文本编辑器可以打开 .xlsx(您在上面看到的 XML 是在文本编辑器中打开的 .xlsx 的复制粘贴)。使用任何 .xlsx 和任何高级文本编辑器自行尝试。 3) Excel 应该或不应该对文件做什么并不重要。重要的是它确实在 Excel 中打开。因此,它一个Excel文件。
  • @Pyderman 所以也许 Excel 可以读取您的文件,但这并不意味着您的文件是正确的 xlsxxls 文件。 Excel 也可以读取许多其他格式。 (阅读support.office.com/en-ca/article/…
  • 如果这是一个带有 .xls 扩展名的 .xlsx 文件,那么 openpyxl 将拒绝它并说不支持 xls 文件。你用的是什么版本的openpyxl?

标签: python python-2.7 excel-2010 xlrd openpyxl


【解决方案1】:

我遇到了类似的问题。原来它需要绝对文件路径。例如,“c:/dir/filename.xlsx”而不是“filename.xlsx”。相对路径适用于 osx,但不适用于 Windows。

【讨论】:

    【解决方案2】:

    我不在 OSX 上,所以没有测试。尽管缺乏支持,您也许可以使用 appscript 包打开有问题的文件并重新保存它。

    from appscript import *
    excel = app('Microsoft Excel')
    wb = excel.open('/path/to/file.xls')
    wb.save_as('/path/to/fileout.xlsx', file_format=k.XLSX_file_format)
    #not sure the exact name of k.excel_file
    

    【讨论】:

    • 有趣。不知道这个包。谢谢。
    • 不错的解决方案,但请注意,它仅适用于安装了 Microsoft Excel 的 OS X。
    • xlwings 库使用它与 MacOS 上的 Excel 一起工作
    【解决方案3】:

    有一点很清楚:您尝试打开的文件的格式与其扩展名所建议的格式不同。

    如您所知,Excel 文件格式包括(但不限于)xlsxlsx

    • Excel 2003 格式 (xls) 是一种二进制格式。这意味着如果您使用文本编辑器打开xls 文件,您只会看到乱码。

    • Excel 2007 格式 (xlsx) 完全不同。 xlsx 文件是一个 zip 文件,里面有一堆 XML 文件。您可以使用 zip 存档器来提取 xlsx 文件的内容。然后,您可以使用任何文本编辑器编辑 XML 文件。但是,直接使用文本编辑器打开 xlsx 文件就像使用文本编辑器打开 zip 文件一样:您只会看到乱码。

    可以使用文本编辑器打开文件(并阅读其内容)这一事实表明它既不是xls 文件也不是xlsx 文件。您的文件既不是二进制文件也不是 zip 文件,它是一个 plain XML 文件。

    而且,这个错误信息说明了很多。

    BadZipfile: File is not a zip file
    

    这意味着openpyxl 正在尝试将您的文件作为xlsx 文件打开,因此是zip 文件。但是当它尝试提取其内容时,它会失败,因为您的文件甚至不是 zip 文件。

    但如果文件既不是xlsx 文件也不是xls 文件,Microsoft Excel 如何读取它?我也想知道。经过一番研究,我相信你的文件有XML Spreadsheet 2003 file formatThis example 看起来与您发布的文件内容非常相似。由于 Microsoft Excel 支持这种格式,因此它可以读取您的文件也就不足为奇了。

    很遗憾,xlrdopenpyxl 等 Python 库仅支持 xlsxlsx 文件格式,因此它们将无法读取您的文件。我认为您只需手动将其转换为受支持的格式。

    【讨论】:

    • 出色的答案,只要我拒绝你的论点,你就会骑着我挥舞着拳头的 cmets。谢谢你。对 Stack Overflow 问题的模型响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2021-07-20
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多