python使用win32com复制Excel图表
需求
需求:制作一个含有图表和公式的excel表模板,根据模板复制N份excel表,并重命名表名,将数据填入到对应excel表中,每个表中的图表和公式根据数据实时更新。。
win32com安装
安装win32com需要安装pywin32
pip install pywin32
代码详细使用说明
首先要制作好一个模板excel表,并含有公式和图表
import pythoncom,win32com,os
newFileName='pythoncomdemo.slsx'
pythoncom.CoInitialize()#initialization
# current_address = os.path.abspath('.')
# excel_address = join(current_address,newFileName)
# print excel_address
# xl_app = win32com.client.gencache.EnsureDispatch("Excel.Application")
# # xl_app.Visible = True
# wb = xl_app.Workbooks.Open(excel_address)
xl_app = win32com.client.DispatchEx('Excel.Application')#Start a new excel.if already open a excel,still start a new.
# xl_app = win32com.client.Dispatch('Excel.Application')#Start a new excel.if already open a excel ,do not start a new.
absPath = os.path.abspath(newFileName)
wb = xl_app.Workbooks.Open(absPath)
for i in range(0,10):#生成10个excel表
sht = wb.Worksheets('tempture') #获得模板表
new_sht_name = 'newsheet%s'%i #新表名称为'newsheet%s'%i
sht.Copy(Before=sht)#复制新表位于在模板表前面,且为活动表
wb.ActiveSheet.Name = new_sht_name#给当前活动表重命名
copyshett=wb.Worksheets(new_sht_name)#获得新表
#print copyshett.Range("L22").Value
wb.Save()#保存excel
wb.Close()#关闭excel
pythoncom.CoUninitialize()#Release resources
以上代码复制了10个模板表,使用win32com可以将图表一起复制。使用openpyxl对excel表进行数据的填写。以下为将数据写入excel表的代码
from openpyxl import load_workbook
workbook = load_workbook(newFileName, data_only=False)#data_only=False为以公式形式读写excel,可不写;data_only=True为以数值形式读写excel
sheetnames = workbook.get_sheet_names()
ws1 = workbook.get_sheet_by_name(sheetnames[0])#Get the first table
workbook.remove_sheet(workbook.get_sheet_by_name(tempsheet))#根据表名删除excel表
ws1['C3'] = 12#往C3单元格写入数字12
ws1[chr(65) + str(7)]='chr'#往A7单元格中写入字符串chr
ws1['D1']='=IF(LEN(B'+str(7)+')>0, ROW()-8)'#往B7写入公式,数字为当前行数减去8
ws1.cell(row=3,column=5).value='hebingdanyuange'
ws1.cell(row=3, column=5).alignment = Alignment(horizontal="center", vertical="center")#E3单元格居中显示
ws1.merge_cells(start_row=3, start_column=5, end_row=3, end_column=6)#合并单元格E3:G3
ws1.cell(row=3, column=5).fill = PatternFill("solid", fgColor="DC143C")#合并单元格颜色为红色
value=ws1['L22'].value#获得单元格L22的值
workbook.save(newFileName)#保存excel,括号中输入新的excel名称可以另存为新excel
workbook.close()
以下为win32com往excel中读写数据
ws1.Range('C3').Value = 'win32com'#往excel中写入数据
value=ws1.Range("L22").Value#获得L22单元格的值
xl_app.Worksheets('SUMMARY').Activate()#指定sheet为活动sheet
注:在使用workbook = load_workbook(newFileName, data_only=False)读取含有公式的单元格值时读取到的是公式;若使用workbook = load_workbook(newFileName, data_only=True)读取到的是None时,需要使用win32com打开并保存关闭后即可读取到公式计算后的数值。