通常,每周我们都会将两者结合起来,并以某种方式获得两全其美的效果。虽然正常的日常使用不需要自动化,但有时可能需要自动化。也就是说,当您要生成大量图表、图形、表格和报告时,如果您选择手动方法,它可能会变得极其繁琐。其实大可不必。事实上,有一种在Python中创建管道的方法,您可以在其中无缝集成两者,在Excel中生成电子表格,然后将结果传输到Word中,几乎可以立即生成报告。OpenpyxlOpenpyxl可以说是Python中最通用的包之一,它使得使用Excel界面变得非常容易。有了它,您可以读写所有当前和最早的excel格式,即xlsx和xls。Openpyxl允许您填充行和列、执行公式、创建2D和3D图表、标记轴和标题以及许多其他非常有用的功能。然而,最重要的是,这个包允许您在Excel中循环访问无限数量的行和列,避免您以前必须做的所有烦人的数字运算和绘图。Python-docx然后是Python-docx,这个包对Word就像Openpyxl对Excel。如果您还没有研究过他们的文档,您可能应该看一看。毫不夸张地说,Python-docx是我自从开始使用Python以来使用过的最简单、最一目了然的工具包之一。它允许您通过在报告中插入文本、填充表格和自动呈现图像来自动生成文档。事不宜迟,让我们创建自己的自动化管道。继续使用Anaconda(或您选择的任何其他IDE)并安装以下软件包:pipinstallopenpyxlpipinstallpython-docxMicrosoftExcelAutomation首先,我们将加载一个已经创建的Excel工作簿(如下所示):workbook=xl.load_workbook('Book1.xlsx')sheet_1=workbook['Sheet1']然后我们遍历电子表格中的所有行,通过电流乘以电压来计算并插入功率值:forrowinrange(2,sheet_1.max_row+1):current=sheet_1.cell(row,2)voltage=sheet_1.cell(row,3)power=float(current.value)*float(voltage.value)power_cell=sheet_1.cell(row,1)power_cell.value=power一旦完成,我们将使用计算出的幂值生成折线图,插入到指定单元格中,如下图:values=Reference(sheet_1,min_row=2,max_row=sheet_1.max_row,min_col=1,max_col=1)chart=LineChart()chart.y_axis.title='Power'chart.x_axis.title='Index'chart.add_data(values)sheet_1.add_chart(chart,'e2')workbook.save('Book1.xlsx')Nowwehavegenerated现在我们有了图表,我们需要将其提取为图像,以便我们可以在Word报告中使用它。首先,我们将确定Excel文件的确切位置,以及输出图表图像应保存的位置:input_file="C:/Users/.../Book1.xlsx"output_image="C:/Users/.../chart.png",然后使用以下方法访问电子表格:operation=win32com.client.Dispatch("Excel.Application")operation.Visible=0operation.DisplayAlerts=0workbook_2=operation.Workbooks.Open(input_file)sheet_2=operation.Sheets(1)您可以遍历电子表格中的所有图表对象(如果有多个)并将它们保存在指定位置,如下所示:forx,chartinenumerate(sheet_2.Shapes):chart.Copy()image=ImageGrab.grabclipboard()image.save(output_image,'png')passworkbook_2.Close(True)operation.Quit()MicrosoftWord自动化现在我们已经生成了图表图像,我们必须创建一个模板文档,它基本上是一个普通的MicrosoftWord文档(.docx),它是根据我们希望的报告外观量身定制的,包括字体、字体大小、格式和页面结构。然后,我们需要做的就是为我们的自动内容(即表值和图像)创建占位符,并使用变量名称声明它们,如下所示。任何自动内容都可以在双花括号{{variable_name}}内声明,包括文本和图像。对于表格,您需要创建一个包含所有列的模板行表,然后您需要在上方和下方添加一行,使用以下符号:第一行:{%trforiteminvariable_name%}最后一行:{%trendfor%}在上图中,变量名是:table_contents用于存储表数据的Python字典字典键的索引(第一列)功率、电流和电压的字典值(第二、三、四列)然后我们设置模板文档导入Python,并创建一个字典来存储表中的值:template=DocxTemplate('template.docx')table_contents=[]foriinrange(2,sheet_1.max_row+1):table_contents.append({'Index':i-1,'Power':sheet_1.cell(i,1).value,'Current':sheet_1.cell(i,2).value,'Voltage':sheet_1.cell(i,3).value})接下来,我们将导入之前由Excel生成的图表图像,并创建另一个字典来实例化模板文档中声明的所有占位符变量:image=InlineImage(template,'chart.png',Cm(10))context={'title':'AutomatedReport','day':datetime.datetime.now().strftime('%d'),'month':datetime.datetime.now().strftime('%b'),'year':datetime.datetime.now().strftime('%Y'),'table_contents':table_contents,'image':image}最后,我们将使用我们的渲染报告值表和图表图像:template.render(context)template.save('Automated_report.docx')结果是自动生成的MicrosoftWord报告,其中包含在MicrosoftExcel中创建的数字和图表。这样,您就有了一个完全自动化的管道,可用于创建尽可能多的表格、图表和文档。最后,完整的代码在这里:github/mkhorasani/excelwordautomation有兴趣的可以下载修改执行
