Openpyxl 无法读取 xlsx 文件,但如果我保存文件,它会打开

问题描述 投票:0回答:3

所以,我尝试使用 openpyxl 用这一行打开一个 excel 文件

wb_bs = openpyxl.load_workbook(filename=filepath)

并收到此错误:


C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\styles\stylesheet.py:214: UserWarning: Workbook contains no default style, apply openpyxl's default
  warn("Workbook contains no default style, apply openpyxl's default")
Traceback (most recent call last):
    wb_bs = openpyxl.load_workbook(filename=url_nova, data_only=True)
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 315, in load_workbook
    reader.read()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 280, in read
    self.read_worksheets()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 228, in read_worksheets
    ws_parser.bind_all()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\_reader.py", line 434, in bind_all
    self.bind_cells()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\_reader.py", line 337, in bind_cells
    for idx, row in self.parser.parse():
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\_reader.py", line 149, in parse
    obj = prop[1].from_tree(element)
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\serialisable.py", line 87, in from_tree
    obj = desc.expected_type.from_tree(el)
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\serialisable.py", line 103, in from_tree
    return cls(**attrib)
TypeError: __init__() got an unexpected keyword argument 'address'
PS C:\Users\T-Gamer\Python programs\cmtrat\Cmtrat Helper> & C:/Users/T-Gamer/AppData/Local/Programs/Python/Python38-32/python.exe "c:/Users/T-Gamer/Python programs/cmtrat/Cmtrat Helper/excel_scripts/ostest.py"
C:\Users\T-Gamer\Python programs\cmtrat\Cmtrat Helper\excel_scripts\copias\diario_padrao.xlsx
C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\styles\stylesheet.py:214: UserWarning: Workbook contains no default style, apply openpyxl's default
  warn("Workbook contains no default style, apply openpyxl's default")
Traceback (most recent call last):
    wb_bs = openpyxl.load_workbook(filename=url_nova, data_only=True)
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 315, in load_workbook
    reader.read()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 280, in read
    self.read_worksheets()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\reader\excel.py", line 228, in read_worksheets
    ws_parser.bind_all()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\_reader.py", line 434, in bind_all
    self.bind_cells()
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\_reader.py", line 337, in bind_cells
    for idx, row in self.parser.parse():
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\_reader.py", line 149, in parse
    obj = prop[1].from_tree(element)
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\serialisable.py", line 87, in from_tree
    obj = desc.expected_type.from_tree(el)
  File "C:\Users\T-Gamer\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\serialisable.py", line 103, in from_tree
    return cls(**attrib)
TypeError: __init__() got an unexpected keyword argument 'address'

事情是:

  • 如果我创建 .xlsx 文件,它将打开
  • 如果我从这个特定来源(我需要的来源)下载文件并尝试立即打开它,则会生成错误。
  • 如果我在打开并保存 .xlsx 文件(无更改)后运行代码,它就可以工作。

我想这与excel版本冲突有关,但我已经尝试了所有方法,但似乎没有任何效果。

openpyxl==3.0.5 python==3.8.5

python excel openpyxl
3个回答
4
投票

这似乎是有关某些 Excel 文件的 Openpyxl 错误,报告如下:https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1071

不幸的是,看起来没有解决办法,只有您找到的解决方法:

在刚刚发布的 Excel 版本(版本 1803(内部版本 9126.2259 即点即用))中,微软修改了超链接在 Excel 文件中的存储方式。作为解决方法,您可以尝试在 Google Sheets 或 LibreOffice 中打开并重新保存该文件。我在数据验证方面遇到了类似的问题。
来源


1
投票

原因可能是 MS-Windows 的安全防护:每当您从外部源(互联网)下载 MS-Office 文件时,MS-Windows 都会在该文件中插入一个标志,标记该文件只能在受保护的视图中打开。该保护将保持不变,直到您启用编辑并在设置安全标志的情况下保存文件。

打开新下载的 MS-Office 文件时出现的警告文本:

PROTECTED VIEW
Be careful - files from the Internet can contain viruses.
Unless you need to edit, it's safer to stay in Protected View.

0
投票

我最近也遇到了同样的问题。

当我研究它时,我确实发现了一些东西,我认为我需要分享,以防有帮助。

问题可能是由于格式不兼容造成的。

让我们看看,

我刚刚从互联网下载了一个

A_old.xlsx

如果我打开它并保存它(不做任何其他事情),我会得到

A_new.xlsx


阅读
A_old.xlsx

当我尝试用以下方式阅读

A_old.xlsx
时:

sheets = pd.read_excel(xls_path, sheet_name=None, header=0, engine="openpyxl")

它确实读出了诸如床单名称之类的内容。但如果我想读取工作表的内容,我会得到一个空的数据帧。还有警告:

UserWarning: Workbook contains no default style, apply openpyxl's default

阅读
A_new.xlsx

但是,即使没有任何警告,相同的代码也可以与

A_new.xlsx
完美配合。


所以,
A_old.xlsx
A_new.xlsx

之间一定有一些区别

用winrar打开这两个文件对比一下就知道原因了(有些不重要的文件就不列出来了):

A_old.xlsx

/_rels
/docProps
    app.xml
    core.xml
/xl
    /worksheets
        /sheet1.xml
        /sheet2.xml
        /sheet3.xml
    /sharedStrings.xml
    /styles.xml
    /workbook.xml
[Content_Types].xml

A_new.xlsx

/_rels
/docProps
    app.xml
    core.xml
    custom.xml (*)
/xl
    /theme
        /theme1.xml (*)
    /worksheets
        /sheet1.xml (*)
        /sheet2.xml (*)
        /sheet3.xml (*)
    /sharedStrings.xml (*)
    /styles.xml (*)
    /workbook.xml (*)
[Content_Types].xml (*)

我用(*)标记了一些更改的文件。

显然,
A_old.xlsx
A_new.xlsx
每个文件的格式风格不同,尽管它们都是xlsx文件。

微软好像在某个时候以某种方式改变了xlsx的格式,但我在网站上没有找到任何通知。

最重要的更改是
sheet?.xml
文件和
sharedStrings.xml
A_new.xlsx
中进行了很大的更改,这些文件是内容编码方式的重要部分。

这应该就是我们无法读取

A_old.xlsx
(因为编码/解码算法不同)而成功读取
A_new.xlsx
的原因。

(我尝试替换

sheet?.xml
中的
sharedStrings.xml
A_old.xlsx
,并且有效)

顺便说一句,

theme
文件夹应该解释我们收到警告的原因:

UserWarning: Workbook contains no default style, apply openpyxl's default

解决方案:

虽然我们现在找到了原因。好像python/pandas/openpyxl引擎没有能力处理像

A_old.xlsx
这样的文件解码。

所以要么我们自己写一个,应该不复杂,但确实需要一些时间,要么我们就接受它。抱歉,我没有找到任何简单的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.