创建一个xlsx文件的副本,其中删除了所有公式

时间:2015-07-07 11:16:12

标签: python xlrd openpyxl xlutils

无法使用xlrd复制xlsx和xlsm文件,因为它说"格式化信息= True"尚未实施和 执行以下操作时,openpyxl内存不足:

import xlrd
from xlutils.copy import copy
from openpyxl import load_workbook

if file_format == 'xls':
        input_file=xlrd.open_workbook(input_file_location,formatting_info=True)
        wb = copy(input_file)
        wb.save(destination_file)
if file_format == 'xlsx' or file_format == 'xlsm' :
        input_file  =  load_workbook(input_file_location,data_only=True)
        input_file.save(destination_file)

1 个答案:

答案 0 :(得分:3)

如果您只想复制文件,那么只需使用shutil即可。还有一些openpyxl不支持的东西,比如丢失的图像和图表。而且,正如您所看到的,记忆是一个问题。每个单元使用大约45 kB的内存。

openpyxl文档非常清楚打开工作簿时使用的不同选项:data_only只读取任何公式的结果并忽略公式。

如果要复制工作表,请参阅https://bitbucket.org/openpyxl/openpyxl/issue/171/copy-worksheet-function

否则,您可以使用两个工作簿,一个处于只读模式,另一个处于只写模式。但是如果你想复制,最好在文件系统中完成。

如果您只想将值从一个工作簿复制到另一个工作簿,则可以组合只读和只写模式以减少内存占用。以下伪代码应该为您提供基础。

wb1 = load_workbook("file.xlsx", read_only=True, data_only=True)
wb2 = Workbook(write_only=True)
for ws1 in wb1:
    ws2 = wb2.create_sheet(ws1.title)
    for r1 in ws1:
        ws2.append(r1) # this might need unpacking to use values
wb2.save("copy.xlsx")