使用Python中的Pandas库,我们可以从源Excel文件中获取数据并将其插入到新的Excel文件中,然后命名并保存该文件。当您需要深入到特定数据和/或重新格式化报表的数据时,这很有用。

作为一个长期的VBA开发人员,发现Python的许多处理Excel文件和数据的库和工具已经相当改变了我们的生活。下面是一个基于vbi的工程实例,它可以用一个实际的代码替换下面的代码。

在这篇文章中,我不会讨论如何下载和安装Python或Pandas库。您可以很容易地在其他地方找到更好的文档。本例使用python3。

python Jinja2将excel循环填入word表格中_.net excel循环插数据

Python实战: 如何将数据从一个Excel文件移动到另一个?

python Jinja2将excel循环填入word表格中_数据帧_02

www.arkai.net

python Jinja2将excel循环填入word表格中_数组_03

用例

我们有一个Excel工作簿,包含了28家商店2019年的销售报告。文件中有6个不同的工作表,所有工作表都与不同的产品ID相关。每个工作表都是同一个模板,其中包含28个存储区中每个存储区的行名称和日历年每个月的列标题。

python Jinja2将excel循环填入word表格中_.net excel循环插数据_04

目标是从源文件中的每个工作表中提取每个商店的销售数据,并将数据放入新Excel文件中的三列:产品ID、门店ID和销售额(我们将指定一个月)。

步骤1-导入Pandas库

我将打开Visual Studio代码并创建一个新文件。我会把文件保存为'获取销售数据.py'并在顶部键入'import pandas as pd'。

我在这个解决方案中使用的Pandas库有几个非常有用的特性。DataFrame对象用于数据操作,ExcelFile类用于将表格Excel表解析为DataFrame对象。Pandas提供了这些工具和其他工具,用于在内存数据结构和几种不同格式(除了excel,如CSV、文本文件,甚至SQL数据库)之间读写数据。

python Jinja2将excel循环填入word表格中_数据帧_05

第2步-设置变量

下一步是创建三个变量。“电子表格文件”变量设置为源文件工作簿。“worksheet_file”变量将是源文件中的工作表,并将“appended_data”作为空数组。

python Jinja2将excel循环填入word表格中_数组_06

第3步-循环查看数据源Excel文件中的所有工作表

使用“for”循环,我将从源数据文件中的每个工作表中获取所需的数据。这种方法是完全可伸缩的,这意味着无论文件(同一模板)中有多少张工作表,也不管您添加、删除或更改工作表名称的频率如何,此脚本都将始终检查每个工作表。

我使用'sheet_name'作为工作簿中每个工作表的变量。在我保存对文件的更改后,我通过将变量“sheet_name”打印到终端来测试它。在集成终端中的VS代码(在文件所在的目录路径获取销售数据.py,我键入'pythongetSalesDate.py'保存更改并按Enter键后。请注意,每个标签名称在我们的月刊店_销售.xlsx文件打印到终端。

python Jinja2将excel循环填入word表格中_数组_07

步骤3.1-设置month列以从中提取销售数据

既然我已经设置了循环遍历工作簿中的每个工作表,我将获得我想要的确切数据。这首先从每个工作表获取所有数据并将其传递到数据帧。我将使用'df'作为数据帧的变量名。

此时,我还将把一个month变量设置为要获取数据的月份(表头)。我会调出8月份的数据。

步骤3.2-从源Excel文件获取初始数据帧

现在我将使用pandas.read_excel方法。我需要传递给方法的三个参数-源文件名、工作表名和列标题行。我将使用值2作为标题行,因为工作表中的标题行是Excel第3行,Pandas识别的行值是从零开始的索引(这意味着Excel中的第1行将是header=0值)。

python Jinja2将excel循环填入word表格中_数据_08

步骤3.3-将我的初始数据帧打印到终端进行检查

如果我想看看数据帧在其当前状态下是什么样子的,我可以用“print(df)”将其打印到我的终端。我真的会打“print”(df.header(5) “)”以将结果限制为每张工作表的前5行。注意Pandas默认情况下会在最左边添加一个索引列。

python Jinja2将excel循环填入word表格中_.net excel循环插数据_09

注意,dataframe包含表中的每一列,而那些不在store sales表之外的单元格将“NaN”显示为值。我将清理这些数据,只提取我需要的特定数据,并删除所有不需要或不需要的无关数据。

步骤3.4-将数据帧限制为“Store ID”和“August”列

接下来我要做的是添加一行代码,将数据帧中的数据限制为“Store ID”和“August”列。注意脚本下方集成终端中“print(df)”的结果。

python Jinja2将excel循环填入word表格中_数据帧_10

步骤3.5-过滤数据帧的行,只查找'August'列中大于$3000的值

下一步是将行限制为仅销售值大于3000美元的行。我可以用数据帧。何处方法来执行此操作。

python Jinja2将excel循环填入word表格中_数组_11

步骤3.6-从数据帧中删除具有“NaN”值的行

注意,在候机楼,我们现在有一排“NaN”。我们可以用dataframe.dropna()功能。一旦我这样做,保存文件,并再次运行它,我可以看到一个更干净的数据帧在终端。

python Jinja2将excel循环填入word表格中_.net excel循环插数据_12

步骤3.7-创建一个“产品标识”列并将其添加到数据帧中

接下来的两行代码将基于源工作簿文件中的每个工作表选项卡名在数据帧中创建一个“产品标识”列。然后,我将设置dataframes的最终列顺序,将我的新“Product ID”列作为第一列。当我再次运行脚本时,我看到数据帧的3列被打印到终端。

python Jinja2将excel循环填入word表格中_.net excel循环插数据_13

步骤3.8-将每个数据帧添加到数组

下一步是将每个dataframe作为元素添加到“appended_data”数组中。因为通过“for”循环的每次迭代都会创建一个新的数据帧,所以我可以使用append(df)方法将源工作簿中每个工作表中的每个连续数据帧追加到现有数组“appended_data”。

python Jinja2将excel循环填入word表格中_数据_14

步骤4-将附加的_数据数组中的所有数据帧连接到单个数据帧中

既然'for'循环已经将所有工作表中的数据拉到它们自己的数据帧中,这些数据帧已经添加到“appended_data”数组中,我需要将它们合并到一个数据帧中。我会用pandas.concat()实现这一目标的功能。

我将保存文件并再次运行它,将“附加的数据”打印到终端。结果证实,我现在有一个单独的数据帧,每个'Product ID'部分没有重复的标题行。

python Jinja2将excel循环填入word表格中_数据帧_15

步骤5-将数据帧导出到新的Excel文件

现在唯一要做的就是将现有的数据帧导出到一个新的Excel文件中。使用pandas.dataframe.to_ excel()函数,我将文件路径和文件名作为参数传递给函数。在第二个参数中,我输入'index=False',这样索引列就不会导出到新的电子表格文件中。

python Jinja2将excel循环填入word表格中_数组_16

第6步-运行完成的脚本并打开新文件

我将保存新的更改,运行脚本,并检查新创建文件的输出文件路径。

python Jinja2将excel循环填入word表格中_.net excel循环插数据_17

当我打开文件时,我将看到三列:“Product ID”、“Store ID”和“八月”,其中只有在“August”列中包含值大于3000的行。

python Jinja2将excel循环填入word表格中_数据帧_18

在不到20行代码中,您可以自动化一个甚至不需要打开Excel应用程序的过程,更不用说打开源数据文件了。此外,它还可以扩展到源文件中有多少工作表,并且脚本运行大约需要2-3秒。

您甚至可以使用Tkinter库开发桌面UI,通过从用户输入中传递列选择、文件路径和名称等参数,使脚本更加动态。但那是另一天的另一篇文章。

获取GitHub上的完整脚本代码:https://github.com/toddbrannon/get_excel_data/blob/master/getExcelData.py