python - 在 python 中打开 xlsx 文件时出错

标签 python openpyxl xlrd

我正在尝试打开由另一个系统创建的 xlsx 文件(这是数据始终采用的格式,不受我的控制)。我尝试了 openpyxl (v2.3.2) 和 xlrd (v1.0.0) (以及 pandas (v0.20.1) read_excel 和 pd.ExcelFile(),两者都使用 xlrd,因此可能没有实际意义),我我遇到了错误;再加上没有从我的搜索中找到答案。如有任何帮助,我们将不胜感激。

xlrd代码:

import xlrd
workbook = xlrd.open_workbook(r'C:/Temp/Data.xlsx')

错误:

Traceback (most recent call last):

  File "<ipython-input-3-9e5d87f720d0>", line 2, in <module>
    workbook = xlrd.open_workbook(r'C:/Temp/Data.xlsx')

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\__init__.py", line 422, in open_workbook
    ragged_rows=ragged_rows,

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 833, in open_workbook_2007_xml
    x12sheet.process_stream(zflo, heading)

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 548, in own_process_stream
    self_do_row(elem)

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 685, in do_row
    self.sheet.put_cell(rowx, colx, None, float(tvalue), xf_index)

ValueError: could not convert string to float: 

openpyxl代码:

import openpyxl
wb = openpyxl.load_workbook(r'C:/Temp/Data.xlsx')

错误:

Traceback (most recent call last):

  File "<ipython-input-2-6083ad2bc875>", line 1, in <module>
    wb = openpyxl.load_workbook(r'C:/Temp/Data.xlsx')

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 234, in load_workbook
    parser.parse()

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\worksheet.py", line 106, in parse
    dispatcher[tag_name](element)

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\worksheet.py", line 243, in parse_row_dimensions
    self.parse_cell(cell)

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\reader\worksheet.py", line 188, in parse_cell
    value = _cast_number(value)

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 23, in _cast_number
    return long(value)

ValueError: invalid literal for int() with base 10: ' '

Pandas 代码:

import pandas as pd
df = pd.read_excel(r'C:/Temp/Data.xlsx', sheetname='Sheet1')

错误:

Traceback (most recent call last):

  File "<ipython-input-5-b86ec98a4e9e>", line 2, in <module>
    df = pd.read_excel(r'C:/Temp/Data.xlsx', sheetname='Sheet1')

  File "C:\Program Files\Anaconda3\lib\site-packages\pandas\io\excel.py", line 200, in read_excel
    io = ExcelFile(io, engine=engine)

  File "C:\Program Files\Anaconda3\lib\site-packages\pandas\io\excel.py", line 257, in __init__
    self.book = xlrd.open_workbook(io)

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\__init__.py", line 422, in open_workbook
    ragged_rows=ragged_rows,

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 833, in open_workbook_2007_xml
    x12sheet.process_stream(zflo, heading)

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 548, in own_process_stream
    self_do_row(elem)

  File "C:\Program Files\Anaconda3\lib\site-packages\xlrd\xlsx.py", line 685, in do_row
    self.sheet.put_cell(rowx, colx, None, float(tvalue), xf_index)

ValueError: could not convert string to float: 

就其值(value)而言,以下是输入文件的示例片段: Input file example

我猜测错误来自第一行超出第一列的空白 - 因为当我删除前两行和 时,错误消失了。我无法跳过前两行,因为我想提取单元格 A1 中的值。我还想强制读取的值是字符串类型,稍后将通过错误检查转换为 float 。谢谢!

==========

更新(美国东部时间 8 月 9 日上午 10 点):根据 Charlie 的建议,能够以只读模式打开 Excel 文件;并能够阅读大部分内容 - 但仍然在某个地方遇到错误。 新代码(抱歉,它不是很 Pythonic - 还是一个新手):

wb = openpyxl.load_workbook(r'C:/Temp/Data.xlsx', read_only=True)
ws = wb['Sheet1']
ws.max_row = ws.max_column = None

i=1
for row in ws.rows:
    for cell in row:
        if i<2000:
            i += 1
            try:
                print(i, cell.value)
            except:
                print("error")

错误:

Traceback (most recent call last):

  File "<ipython-input-65-2e8f3cf2294a>", line 2, in <module>
    for row in ws.rows:

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\worksheet\read_only.py", line 125, in get_squared_range
    yield tuple(self._get_row(element, min_col, max_col))

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\worksheet\read_only.py", line 165, in _get_row
    value, data_type, style_id)

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 36, in __init__
    self.value = value

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 132, in value
    value = _cast_number(value)

  File "C:\Program Files\Anaconda3\lib\site-packages\openpyxl\cell\read_only.py", line 23, in _cast_number
    return long(value)

ValueError: invalid literal for int() with base 10: ' '

========

Update2(10:35AM):当我读取文件没有 ws.max_row 和 ws.max_column 设置为 None 时,代码仅读取一列,没有错误。单元格 A66 中的值为“生成自:”。但是,当我读取 ws.max_row 和 ws.max_column 设置为 None 的文件时,这个特定的单元格会造成麻烦。但我可以读取之前的所有其他单元格,这对我来说效果很好,现在。谢谢,@Charlie。

最佳答案

听起来源文件可能已损坏,并且包含带有以数字形式输入的空字符串的单元格。您也许可以使用 openpyxl 的只读模式来跳过前两行。

关于python - 在 python 中打开 xlsx 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45576450/

相关文章:

Python:具有多个变量的颜色输出

python - 正则表达式在一行中找到 A 而不是 B

python - 使用 openpyxl 将公式从一个单元格复制到另一个单元格

python - 如何使用openpyxl设置图表标签的间隔单位

python xlrd : how to convert an extracted value?

python - 如何提取给定单元格的值?

Python 小数范围() 逐步值

python - Py2Exe: "error: invalid command: py2exe"

python - 将 Excel 文件流保存到 azure blob 存储

python - 在 csv 写入过程中返回一个字符