问题:
现有一个excel表格数据与一个word模板,需要将excel表格中的数据填写到word模板中。
初始设置:
代码:
from docx import Document
import pandas as pd
import win32com
from win32com.client import Dispatch
from docx.enum.table import WD_TABLE_ALIGNMENT,WD_ALIGN_VERTICAL
# 将数字转化为大写字母
def number_to_letter(number):
if 1 <= number <= 26:
return chr(number + 64)
else:
return ''
# 修改word中的图表
def update_graph_in_word(doc_path,sheet_path,graph_name,graph_site):
'''
修改word中的图表
doc_path:要修改的图表的word路径
sheet_path:源数据的数据表路径
graph_name:sheet_path 中的源数据表的表名
graph_site:word中要修改的图表的位置(位置标记从0开始,例如0,1,2...)
'''
app = win32com.client.Dispatch('Word.Application')
app.Visible = False
app.DisplayAlerts = 0
# 读取源数据
data = pd.read_excel(sheet_path,sheet_name=None,header=None)
chart_data = data[graph_name]
chart_data = chart_data.fillna(0.0)
row,column = chart_data.shape
chart_data = tuple(tuple(x) for x in chart_data.values.tolist())
# 读取目标word
doc = app.Documents.Open(doc_path)
shape = doc.InlineShapes[graph_site]
chart = shape.Chart
worksheet = chart.ChartData.Workbook.Worksheets("Sheet1")
end_letter = number_to_letter(column)
# 设置数据源的结束范围
chart.SetSourceData("Sheet1!$A$1:"+'$'+end_letter+'$'+str(row)) # 设置数据源范围
# print(worksheet.Range("A1:"+end_site).value)
worksheet.Range("A1:"+end_letter+str(row)).value = chart_data
chart.ChartData.Workbook.Close()
doc.Save()#开始替换表格
doc.Close()
app.Quit()
print(graph_name+'已替换')
doc_path = r'E:\data\test.docx'
sheet_path = r'E:\data\test.xlsx'
# 使用excel中的Sheet1数据修改word文档中的第1个位置的图表
update_graph_in_word(doc_path,sheet_path,'Sheet1', 0)