我不知道這是不是仍然相關,一個誰問問題,但我正在處理同樣的問題,並找到了一個可能的解決方案。
1)打開原始文件(比如:1.xlsm)和做魔術openpyxl
2)保存爲2.xlsx
3)這兩個文件實際上是壓縮文件:提取到臨時dirs
4)將文件從原始文件的目錄複製到xlsx文件的目錄中:其中一個文件是宏(vbaProject.bin),其中2個文件是必需的,因爲它們描述的是檔案等
5)把所有的屬於xlsx目錄的文件返回到zip文件並將其從zip重新命名爲xlsm 此文件包含原始宏並已用openpyxl編輯
可選:6)刪除兩個臨時目錄和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')
它沒有爲我工作。這是我的代碼'wb = load_workbook('template.xlsm',keep_vba = True);' – AnujAroshA
如果這個分支不起作用 - 那麼,就沒有辦法使用'openpyxl'工作。 – alecxe