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

时间:2018-11-25 22:15:21

标签: python excel pandas openpyxl xlsx

我正在使用Python 2.7openpyxl==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开箱即用。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

The Pineapple's answerJon Clements's comment的启发,我想出了一种解决方案,可以将数据读取到xlrd工作簿中,然后根据该功能创建openpyxl工作簿。这对我的用例很有帮助,因为我已经在应用程序的多个位置使用了openpyxl工作簿。这是代码:

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])