使用openpyxl无法读取excel文件

时间:2016-05-12 13:47:53

标签: python excel openpyxl

我有一个类似最后一行的excel文件列表。它包含有关客户的私人信息(他的姓名,电话)。每个excel文件对应一个客户端。我需要制作一个excel文件,其中包含有关每个客户端的所有数据。我决定自动执行此操作,因此请查看openpyxl库。我编写了以下代码,但它无法正常工作。

import openpyxl
import os
import glob
from openpyxl import load_workbook
from openpyxl import Workbook
import openpyxl.styles
from openpyxl.cell import get_column_letter

path_kit = 'prize_input/kit'

#creating single document
prize_info = Workbook()
prize_sheet = prize_info.active

file_array_reciever = []

for file in glob.glob(os.path.join(path_kit, '*.xlsx')):
    file_array_reciever.append(file)

row_num = 1
for f in file_array_reciever:
    f1 = load_workbook(filename=f)
    sheet = f1.active
    for col_num in range (3, sheet.max_column):
        prize_sheet.cell(row=row_num, column=col_num).value = \
            sheet.cell(row=sheet.max_row, column=col_num).value

    prize_info.save("Ex.xlsx")

我收到此错误:

Traceback (most recent call last):
  File "/Users/zkid18/PycharmProjects/untitled/excel_test.py", line 43, in <module>
    f1 = load_workbook(filename=f)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/openpyxl/reader/excel.py", line 183, in load_workbook
    wb.active = read_workbook_settings(archive.read(ARC_WORKBOOK)) or 0
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/zipfile.py", line 1229, in read
    with self.open(name, "r", pwd) as fp:
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/zipfile.py", line 1252, in open
    zinfo = self.getinfo(name)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/zipfile.py", line 1196, in getinfo
    'There is no item named %r in the archive' % name)
KeyError: "There is no item named 'xl/workbook.xml' in the archive"

看起来读文件有问题 我不明白它在归档中获取名为'xl/workbook.xml'的项目的位置。

7 个答案:

答案 0 :(得分:1)

根据您使用的版本,这可能是openpyxl中的错误。例如,在1.6.1中引入了一个显示此行为的错误。恢复到1.5.8固定它。根据这个openpyxl ticket进行了修复;虽然机票没有说明修复程序何时交付,但它是在2013年初提交的。我升级到1.6.2并且错误消失了。

答案 1 :(得分:0)

您可以使用xlrd biblioteque

此脚本允许您将Excel数据转换为字典列表

import xlrd

workbook = xlrd.open_workbook('your_file.xlsx')
workbook = xlrd.open_workbook('your_file.xlsx', on_demand = True)
worksheet = workbook.sheet_by_index(0)
first_row = [] # The row where we stock the name of the column
for col in range(worksheet.ncols):
    first_row.append( worksheet.cell_value(0,col) )
# tronsform the workbook to a list of dictionnary
data =[]
for row in range(1, worksheet.nrows):
    elm = {}
    for col in range(worksheet.ncols):
        elm[first_row[col]]=worksheet.cell_value(row,col)
    data.append(elm)
print data

答案 2 :(得分:0)

我猜您的文件之前是.xls格式,您可以使用

try:
    f1 = load_workbook(filename=f)
except:
    print f

找到导致此错误的文件并在Excel中重新打开,然后另存为.xlsx。

答案 3 :(得分:0)

我发现这篇文章正在寻找解决类似问题的方法, ("There is no item named '[Content_Types].xml' in the archive")

对于我的脚本或文件,此错误消息都没有任何意义。 我的脚本添加了1张纸,并在现有的Excel文档中更新了5张纸。 当我的脚本运行时,我意识到我的代码有错误。我在运行中取消了脚本。

取消后,现有的Excel文件出现此错误。 用脚本找出错误,也许您损坏了Excel文件?

为解决这个问题,我正在考虑使用OpenPyXl发生错误时创建一个临时还原文件。

答案 4 :(得分:0)

我遇到了同样的问题,请确保您要读取的文件尚未在Excel中打开

答案 5 :(得分:0)

如果openpyxl仍然不起作用,请使用pandas。

$ pip install pandas xlrd

此代码有效:

import pandas as pd

df = pd.read_excel(file_path)

答案 6 :(得分:0)

选项1: 我通过添加read_only=True解决了这个问题:具体来说,替换

f1 = load_workbook(filename=f)

f1 = load_workbook(filename=f, read_only=True)

请注意:read_only=True可能会使您的代码非常变慢,具体取决于您的代码。如果您是这种情况,则可以尝试使用选项2。

选项2:在excel中打开有问题的工作簿,然后将其重新保存为Strict Open XML Spreadsheet (*.xlsx)