我不知道这是否仍然与提出问题的人相关,但我正在处理同样的问题并找到了可能的解决方案。
- 打开原始文件(比如
1.xlsm
:)并用 openpyxl 变魔术;
- 另存为
2.xlsx
;
- 这两个文件实际上都是压缩文件:将它们解压缩到一个临时目录;
- 将文件从原始文件的目录复制到文件的目录
xlsx
:其中一个文件是宏 ( vbaProject.bin
),其中 2 个文件是必需的,因为它们描述了文件的类型等;
- 将属于该
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')