簡體   English   中英

Openpyxl 無法讀取 xlsx 文件,但如果我保存該文件,它會打開

[英]Openpyxl can't read xlsx file, but if i save the file, it opens

所以,我試圖用這一行用 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

這似乎是關於某些 Excel 文件的 Openpyxl 錯誤,在此處報告: https ://foss.heptapod.net/openpyxl/openpyxl/-/issues/1071

不幸的是,看起來沒有修復,只是您找到的解決方法:

在剛剛發布的 Excel 版本(版本 1803(內部版本 9126.2259 即點即用))中,Microsoft 修改了超鏈接在 Excel 文件中的存儲方式。 作為解決方法,您可以嘗試在 Google 表格或 LibreOffice 中打開並重新保存文件。 我在數據驗證方面遇到了類似的問題。
來源

原因可能是 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.

我面臨着同樣的問題。 我打算用pandas.read_excel()做一些事情,如果我不手動打開和保存 xlsx,它會返回Empty Dataframe 所以這是我的代碼,至少它現在可以工作......

import openpyxl
import pandas as pd

file_path = r’t.xlsx’
def foo():
    return pd.read_excel(file_path)

data = foo()
if data.emty:
    writer = openpyxl.load_workbook(file_path)
    writer.save(file_path) # simply re-save it
    data = foo()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM