有没有办法使用 openpyxl 读取没有工作簿的 Excel 文件?

Posted

技术标签:

【中文标题】有没有办法使用 openpyxl 读取没有工作簿的 Excel 文件?【英文标题】:Is there a way to read Excel file without workbook with openpyxl? 【发布时间】:2019-04-27 14:13:07 【问题描述】:

我正在使用Python 2.7 & openpyxl==2.5.11

对于具有有效工作簿的文件,我正在使用以下代码阅读内容:

wb = openpyxl.load_workbook('my_file.xlsx', read_only=True)
ws = wb.worksheets[1]
rows = ws.rows

现在,一位测试人员向我提供了一个旧文件,该文件没有有效的工作簿部分并引发此错误:

IOError: File contains no valid workbook part

在这一行ws = wb.worksheets[1]

我在 openpyxl 文档中找不到如何读取此类文件的数据的示例。

我设法使用pandas 读取了文件: data = pandas.read_excel('my_file.xlxs')

有没有办法用openpyxl 读取文件,因为我已经在我的应用程序中使用了openpyxl,并且不想完全迁移到pandas,也不想在我的应用程序的不同位置同时使用两者。理想情况下,我想在所有应用程序服务中使用单个库进行 Excel 文件操作,如果可能的话,我想避免将表单 openpyxl 转换为 pandas,因为我无法估计转换需要多大的努力,也无法估计我的所有用例可以使用 pandas 开箱即用。

【问题讨论】:

您可以使用 Excel 本身吗?即你在Windows上吗? Python 可用于自动执行此操作。 @MartinEvans 不,我不在 Windows 上,也没有安装 Excel。我们的服务器是 Ubuntu,所以这看起来不像一个选项。 如果没有 workbook.xml 部分,则该文件不是有效的 OOXML 文件。 【参考方案1】:

这可能不是您要查找的内容,但您可以使用 pandas 读取 excel 文件,然后使用 openpyxl.utils.dataframe module 将其转换为 openpyxl 行。

示例实现

from openpyxl.utils.dataframe import dataframe_to_rows
import pandas as pd
from openpyxl import Workbook

# pandas code 
xl = pd.ExcelFile("dummydata.xlsx")
df = xl.parse(xl.sheet_names[0])

# openpyxl code
wb = Workbook()
ws = wb.active

for r in dataframe_to_rows(df, index=True, header=True):
    ws.append(r)

【讨论】:

看来我可以使用此修复程序来解决我的问题。但是,如果可能的话,我宁愿避免使用pandas(以避免有2个依赖项)。感谢您的回答,如果我找不到更清洁的解决方案,我会尝试将此修复程序集成到我的解决方案中。 @giliev 我认为pandas 下面也使用xlrd 库。用于阅读...您是否尝试过查看您的 .xlsx 是否成功读取?【参考方案2】:

受The Pineapple's answer 和Jon Clements's comment 的启发,我想出了一个解决方案,将数据读入xlrd 工作簿,然后作为函数的结果创建openpyxl 工作簿。这有助于我的用例,因为我已经在我的应用程序的多个位置使用了openpyxl Workbook。代码如下:

import xlrd
from openpyxl import Workbook


def open_excel_without_workbook_part(filename):
    xlrd_workbook = xlrd.open_workbook(filename=filename)
    xlrd_worksheet = xlrd_workbook.sheet_by_index(0)
    nrows = xlrd_worksheet.nrows
    ncols = xlrd_worksheet.ncols

    # create a xlsx file using openpyxl
    openpyxl_book = Workbook()
    openpyxl_worksheet = openpyxl_book.active

    for row in xrange(0, nrows):
        for col in xrange(0, ncols):
            openpyxl_worksheet.cell(row=row + 1, column=col + 1).value = xlrd_worksheet.cell_value(row, col)

    return openpyxl_book


if __name__ == '__main__':
    workbook = open_excel_without_workbook_part('file-without-valid-workbook.xlsx')

    sheet = workbook.worksheets[0]
    for row in sheet.rows:
        print '\t'.join([cell.value for cell in row])

【讨论】:

以上是关于有没有办法使用 openpyxl 读取没有工作簿的 Excel 文件?的主要内容,如果未能解决你的问题,请参考以下文章

跟踪可能无法保存工作簿的工作簿的登录/注销时间

openpyxl - 活动工作表被分组到选定的工作表

读取 Excel 单元格值而不是计算它的公式 -openpyxl

excel在***.xlsx中发现不可读取的内容。是不是恢复此工作簿的内容,点击是之后出现

openpyxl 操作文件

保存工作簿的 vba 例程没有预期的结果