Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python openpyxl无法读取严格的Open XML电子表格格式:UserWarning:文件包含Sheet1的无效规范。这将被删除_Python_Python 3.x_Openpyxl - Fatal编程技术网

Python openpyxl无法读取严格的Open XML电子表格格式:UserWarning:文件包含Sheet1的无效规范。这将被删除

Python openpyxl无法读取严格的Open XML电子表格格式:UserWarning:文件包含Sheet1的无效规范。这将被删除,python,python-3.x,openpyxl,Python,Python 3.x,Openpyxl,我的一些用户(都使用Mac)已经将Excel上传到我的应用程序中,然后我的应用程序拒绝了它,因为该文件似乎是空的。经过一些调试后,我确定该文件是以严格的Open XML Spreedsheet格式保存的,并且openpyxl(2.6.0)不会发出错误,而是向stderr打印一条警告 若要复制,请打开一个文件,添加几行,然后另存为严格的open XML Speedsheet(*.xlsx)格式 这将打印以下警告,但不会引发任何异常: UserWarning: File contains an in

我的一些用户(都使用Mac)已经将Excel上传到我的应用程序中,然后我的应用程序拒绝了它,因为该文件似乎是空的。经过一些调试后,我确定该文件是以严格的Open XML Spreedsheet格式保存的,并且openpyxl(2.6.0)不会发出错误,而是向stderr打印一条警告

若要复制,请打开一个文件,添加几行,然后另存为严格的open XML Speedsheet(*.xlsx)格式

这将打印以下警告,但不会引发任何异常:

UserWarning: File contains an invalid specification for Sheet1. This will be removed
此外,工作簿似乎没有工作表:

assert workbook.get_sheet_names() == []
我现在有三个Mac用户遇到过这个问题。看起来Mac有时会默认使用这种严格的开放XML Spreedsheet格式。如果这是正常情况,那么openpyxl应该能够处理它。否则,如果openpyxl只抛出一个异常就好了。作为一种解决方法,我似乎可以做到以下几点:

import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
    workbook = openpyxl.load_workbook(filename=f)

if not workbook.get_sheet_names():
    raise Exception("The Excel was saved in an incorrect format")

使用R库openxlsx创建的XLSX文件也有类似的问题。来自一个简单python程序的示例错误消息,用于打开文件并从工作表中检索单个值:

警告(来自警告模块): 文件“C:\Python38\lib\site packages\openpyxl\reader\workbook.py”,第88行 警告(msg) UserWarning:文件包含无效的作物规范。这将被删除

我的第一个非常笨拙的解决方案:

  • 用Excel打开
  • 将文件另存为*.xls,这会触发有关兼容性的警告
  • 重新另存为*.xlsx
  • 如果您只需要读取文件,我的第二个解决方案就可以工作:

  • 设置只读限制:
    wb=load\u工作簿(文件名为'CAF\u LTAR\u crops\u out\u 0.3.xlsx',只读=True)
  • 广泛的教训似乎是XLSX文件规范没有在编程语言之间统一(正确地?)实现

    import openpyxl
    with open('excel_open_strict.xlsx', 'rb') as f:
        workbook = openpyxl.load_workbook(filename=f)
    
    if not workbook.get_sheet_names():
        raise Exception("The Excel was saved in an incorrect format")