Excel 使用 panda 批量处理数据后文件损坏
Excel file gets corrupted after bulking data with panda
好吧,显然这是一个非常简单的任务,但出于某种原因,它给我带来了麻烦。
代码如下:
marcacoes = pd.read_excel(file_loc, sheet_name="MONITORAMENTO", index_col=None, na_values=['NA'], usecols ="AN")
x=0
while x < len(statusclientes):
if (statusclientes.iloc[x][0] == "Offline"):
p=marcacoes.iloc[x][0]
p=p+1
marcacoes.iat[x,0]= p
tel_off.append(telclientes.iloc[x][0])
if (statusclientes.iloc[x][0] == "Indefinido"):
tel_off.append(telclientes.iloc[x][0])
x=x+1
y=0
with pd.ExcelWriter(file_loc,mode='a',if_sheet_exists='replace') as writer:
marcacoes.to_excel(writer, sheet_name='MONITORAMENTO',startcol=37,startrow=5)
writer.save()
但有问题的部分是:
with pd.ExcelWriter(file_loc,mode='a',if_sheet_exists='replace') as writer:
marcacoes.to_excel(writer, sheet_name='MONITORAMENTO',startcol=37,startrow=5)
writer.save()
因为代码 运行 没有它也很好。
这些特定的行应该将数据框“marcacoes”转储到现有的 excel 文件中,替换文件中的另一个现有列,但是每当我 运行 这段代码时,现有的 excel 文件就会变成已损坏。
我很确定我在这里缺少 pandas 的一些基础知识,但我找不到解决此问题的文档。
编辑:
我试过以下代码:
wb = openpyxl.load_workbook(file_loc)
ws = wb['MONITORAMENTO']
startcol = 37
startrow = 5
k=0
while k < len(marcacoes):
ws.cell(startrow, startcol).value = marcacoes.iloc[k][0]
startrow +=1
k+=1
wb.save(file_loc)
但同样的事情发生了,现在它是由“wb.save(file_loc)”行引起的。
您可以尝试使用 openpyxl,例如:
from openpyxl import load_workbook
book = load_workbook(file_loc)
writer = pd.ExcelWriter(file_loc, engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
marcacoes.to_excel(writer, sheet_name='MONITORAMENTO', startcol=37, startrow=5)
writer.save()
我已经用过几次这种方法,总的来说效果不错。
还要确保您的起始文件没有损坏。损坏错误也可能是由图片、数据透视表、数据验证或外部连接引起的。
好的,我明白了。
实际问题来自加载工作簿。 documentation 说如果你想加载带有宏的 xlsm 文件,你必须在函数参数上指定。
wb = load_workbook(filename=file_loc, read_only=False, keep_vba=True)
现在可以正确保存,不会损坏。
好吧,显然这是一个非常简单的任务,但出于某种原因,它给我带来了麻烦。
代码如下:
marcacoes = pd.read_excel(file_loc, sheet_name="MONITORAMENTO", index_col=None, na_values=['NA'], usecols ="AN")
x=0
while x < len(statusclientes):
if (statusclientes.iloc[x][0] == "Offline"):
p=marcacoes.iloc[x][0]
p=p+1
marcacoes.iat[x,0]= p
tel_off.append(telclientes.iloc[x][0])
if (statusclientes.iloc[x][0] == "Indefinido"):
tel_off.append(telclientes.iloc[x][0])
x=x+1
y=0
with pd.ExcelWriter(file_loc,mode='a',if_sheet_exists='replace') as writer:
marcacoes.to_excel(writer, sheet_name='MONITORAMENTO',startcol=37,startrow=5)
writer.save()
但有问题的部分是:
with pd.ExcelWriter(file_loc,mode='a',if_sheet_exists='replace') as writer:
marcacoes.to_excel(writer, sheet_name='MONITORAMENTO',startcol=37,startrow=5)
writer.save()
因为代码 运行 没有它也很好。 这些特定的行应该将数据框“marcacoes”转储到现有的 excel 文件中,替换文件中的另一个现有列,但是每当我 运行 这段代码时,现有的 excel 文件就会变成已损坏。
我很确定我在这里缺少 pandas 的一些基础知识,但我找不到解决此问题的文档。
编辑:
我试过以下代码:
wb = openpyxl.load_workbook(file_loc)
ws = wb['MONITORAMENTO']
startcol = 37
startrow = 5
k=0
while k < len(marcacoes):
ws.cell(startrow, startcol).value = marcacoes.iloc[k][0]
startrow +=1
k+=1
wb.save(file_loc)
但同样的事情发生了,现在它是由“wb.save(file_loc)”行引起的。
您可以尝试使用 openpyxl,例如:
from openpyxl import load_workbook
book = load_workbook(file_loc)
writer = pd.ExcelWriter(file_loc, engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
marcacoes.to_excel(writer, sheet_name='MONITORAMENTO', startcol=37, startrow=5)
writer.save()
我已经用过几次这种方法,总的来说效果不错。
还要确保您的起始文件没有损坏。损坏错误也可能是由图片、数据透视表、数据验证或外部连接引起的。
好的,我明白了。
实际问题来自加载工作簿。 documentation 说如果你想加载带有宏的 xlsm 文件,你必须在函数参数上指定。
wb = load_workbook(filename=file_loc, read_only=False, keep_vba=True)
现在可以正确保存,不会损坏。