我不知道这是否仍然是相关的人提出的问题,但我正在处理同样的问题,并找到了一个可能的解决方案。打开原始文件(比如:1.xlsm)并使用openpyxl执行魔术
另存为2.xlsx
两个文件实际上都是压缩文件:将它们解压缩到一个临时目录
将文件从原始文件的目录复制到xlsx文件的目录:其中一个文件是宏(vbaProject.bin),其中两个文件是必需的,因为它们描述了文件的类型等
将属于xlsx目录的所有文件放回zip文件中,并将其从zip重命名为xlsm。此文件包含原始宏,并已使用openpyxl进行编辑
(可选)删除两个临时目录和2.xlsx文件。
示例代码:import openpyxl
import zipfile
from shutil import copyfile
from shutil import rmtree
import os
PAD = os.getcwd()
wb = openpyxl.load_workbook('1.xlsm')
#####
# do magic with openpyxl here and save
ws = wb.worksheets[0]
ws.cell(row=2, column=3).value = 'Edited' # example
#####
wb.save('2.xlsx')
with zipfile.ZipFile('1.xlsm', 'r') as z:
z.extractall('./xlsm/')
with zipfile.ZipFile('2.xlsx', 'r') as z:
z.extractall('./xlsx/')
copyfile('./xlsm/[Content_Types].xml','./xlsx/[Content_Types].xml')
copyfile('./xlsm/xl/_rels/workbook.xml.rels','./xlsx/xl/_rels/workbook.xml.rels')
copyfile('./xlsm/xl/vbaProject.bin','./xlsx/xl/vbaProject.bin')
z = zipfile.ZipFile('2.zip', 'w')
os.chdir('./xlsx')
for root, dirs, files in os.walk('./'):
for file in files:
z.write(os.path.join(root, file))
z.close()
#clean
os.chdir(PAD)
rmtree('./xlsm/')
rmtree('./xlsx/')
os.remove('./2.xlsx')
os.rename('2.zip', '2.xlsm')