Bootstrap

使用python 修改word中的图表

 问题:

现有一个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)
结果:

;