原文:
www.kdnuggets.com/2021/08/automate-microsoft-excel-word-python.html
照片由 Isaac Smith 提供,来源于 Unsplash
毫无疑问,Microsoft Excel 和 Word 是企业界和非企业界使用最广泛的两个软件。它们实际上与“工作”这个词几乎是同义的。我们几乎每周都会使用这两个软件的组合,或多或少地发挥它们的作用。虽然对于日常使用,自动化可能不必要,但有时自动化是必须的。特别是当你需要生成大量图表、数据、表格和报告时,选择手动方式可能会变得非常繁琐。不过,事情并不一定非得这样。实际上,你可以通过 Python 创建一个管道,轻松地将两者集成起来,生成 Excel 电子表格,然后将结果传输到 Word 中,几乎可以瞬间生成报告。
认识一下 Openpyxl,这可能是 Python 中最通用的绑定之一,使与 Excel 的接口简直就像散步一样轻松。凭借它,你可以读取和写入所有当前和遗留的 Excel 格式,即 xlsx 和 xls。Openpyxl 允许你填充行和列,执行公式,创建 2D 和 3D 图表,标记轴和标题,以及其他许多 功能 都会非常有用。然而,最重要的是,这个软件包使你能够遍历 Excel 中无数的行和列,从而免去你以前不得不进行的繁琐的数据处理和绘图工作。
然后就是 Python-docx,这个软件包对 Word 的作用就像 Openpyxl 对 Excel 的作用一样。如果你还没有研究过它们的 文档,那么你应该看看。Python-docx 毫不夸张地说是我自从开始使用 Python 以来,最简单、最自解释的工具包之一。它允许你通过自动插入文本、填充表格和将图像渲染到报告中来自动化文档生成,完全不需要任何额外的开销。
事不宜迟,让我们创建我们自己的自动化管道。请启动 Anaconda(或任何你选择的 IDE)并安装以下软件包:
pip install openpyxlpip install python-docx
首先,我们将加载一个已经创建的 Excel 工作簿(如下所示):
workbook = xl.load_workbook('Book1.xlsx')
sheet_1 = workbook['Sheet1']
图片由作者提供。
随后,我们将遍历电子表格中的所有行,通过将电流乘以电压来计算和插入功率值:
for row in range(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')
自动生成的 Excel 电子表格。图片由作者提供。
现在我们生成了图表,我们需要将其提取为图像,以便在我们的 Word 报告中使用。首先,我们将声明 Excel 文件的确切位置以及输出图表图像应该保存的位置:
input_file = "C:/Users/.../Book1.xlsx"
output_image = "C:/Users/.../chart.png"
然后使用以下方法访问电子表格:
operation = win32com.client.Dispatch("Excel.Application")
operation.Visible = 0
operation.DisplayAlerts = 0
workbook_2 = operation.Workbooks.Open(input_file)
sheet_2 = operation.Sheets(1)
随后,你可以遍历电子表格中的所有图表对象(如果有多个),并将它们保存到指定位置:
for x, chart in enumerate(sheet_2.Shapes):
chart.Copy()
image = ImageGrab.grabclipboard()
image.save(output_image, 'png')
passworkbook_2.Close(True)
operation.Quit()
现在我们生成了图表图片,我们必须创建一个模板文档,这个文档基本上是一个正常的 Microsoft Word 文档(.docx),按照我们希望报告的样子进行格式化,包括字体、字号、格式和页面结构。然后,我们只需创建自动内容的占位符,即表格值和图片,并用变量名声明,如下所示。
Microsoft Word 文档模板。图片由作者提供。
任何自动生成的内容都可以放在一对双大括号{{variable_name}}内,包括文本和图片。对于表格,你需要创建一个包含所有列的模板行,然后你需要在上面和下面各追加一行,使用以下标记:
第一行:
{%tr for item in *variable_name* %}
最后一行:
{%tr endfor %}
在上图中,变量名是
-
table_contents用于存储我们的表格数据的 Python 字典
-
索引用于字典键(第一列)
-
功率、电流和电压用于字典值(第二、第三和第四列)
然后我们将模板文档导入 Python,并创建一个字典来存储我们表格的值:
template = DocxTemplate('template.docx')
table_contents = []for i in range(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': 'Automated Report',
'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')
就这样,一个自动生成的 Microsoft Word 报告,其中包含数字和在 Microsoft Excel 中创建的图表。这样,你就有了一个完全自动化的管道,可以用来创建你可能需要的任何数量的表格、图表和文档。
自动生成的报告。图片由作者提供。
如果你想了解更多关于数据可视化和 Python 的内容,可以查看以下(附属链接的)课程:
本教程的源代码和模板可以在以下 GitHub 仓库中找到。
mkhorasani/excel_word_automation
此外,欢迎订阅 Medium,探索更多我的教程 在这里。
穆罕默德·霍拉萨尼 是数据科学家和工程师的混合体。后勤学家。直言不讳。现实政治。一点一点地摒弃教条。 阅读更多穆罕默德的文章。
原文。已获许可转载。
1. 谷歌网络安全证书 - 快速进入网络安全职业道路。
2. 谷歌数据分析专业证书 - 提升您的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持您的组织 IT