针对从表格数据中提取指定内容并自动创建新表格的需求,核心方案是使用 Python 的 **pandas** 库读取源数据、进行筛选与转换,然后输出为新的 Excel 文件。这通常涉及数据过滤、列选取、计算新列、分组聚合等操作。以下是详细的步骤、代码示例以及一个结合了【参考资料】中提到的从 PDF 提取表格数据并创建 Excel 的完整应用场景 [ref_1][ref_4][ref_5][ref_6]。
### **核心流程与工具选择**
| 步骤 | 核心操作 | 推荐库/方法 | 备注 |
| :--- | :--- | :--- | :--- |
| **1. 读取源数据** | 从 Excel、CSV、PDF 等文件加载数据 | `pandas.read_excel()`、`pandas.read_csv()`、`pdfplumber`、`Spire.PDF` | 根据源文件格式选择 [ref_1][ref_4][ref_5][ref_6] |
| **2. 数据提取与处理** | 筛选、计算、分组、合并 | `pandas` 的 `DataFrame` 操作(如 `loc`、`query`、`groupby`) | 核心环节,提取“所需数据” |
| **3. 创建新表格并写入** | 将处理后的 `DataFrame` 写入新文件 | `DataFrame.to_excel()`、`pandas.ExcelWriter` | 控制输出格式与多工作表 [ref_3] |
### **场景一:从已有 Excel 中提取数据并生成新 Excel 文件**
这是最常见的情况,假设我们有一个销售数据表 `sales.xlsx`,需要提取销售额大于 1000 的记录,并计算其平均单价,生成一个新的汇总报告。
```python
import pandas as pd
# 1. 读取源Excel表格
source_df = pd.read_excel('sales.xlsx', sheet_name='Sheet1')
print("源数据预览:")
print(source_df.head())
# 2. 提取所需数据:条件筛选与列选择
# 示例:筛选“销售额”大于1000,且只保留“产品名称”、“销售额”、“数量”列
extracted_df = source_df.loc[source_df['销售额'] > 1000, ['产品名称', '销售额', '数量']]
# 3. 进行数据计算(例如:计算平均单价)
if not extracted_df.empty and '销售额' in extracted_df.columns and '数量' in extracted_df.columns:
extracted_df['平均单价'] = extracted_df['销售额'] / extracted_df['数量']
# 保留两位小数
extracted_df['平均单价'] = extracted_df['平均单价'].round(2)
# 4. 创建新表格并写入Excel文件
output_file = 'extracted_sales_report.xlsx'
extracted_df.to_excel(output_file, index=False, sheet_name='高销售额汇总')
print(f"数据提取完成,新表格已保存至: {output_file}")
print("新表格内容预览:")
print(extracted_df.head())
```
### **场景二:从多个工作表或文件中合并提取数据**
有时需要的数据分散在多个工作表或多个文件中,需要先进行合并 [ref_3]。
```python
import pandas as pd
import os
# 假设有多个季度销售Excel文件
input_files = ['sales_Q1.xlsx', 'sales_Q2.xlsx']
all_data_frames = []
for file in input_files:
if os.path.exists(file):
# 读取每个文件的所有工作表或指定工作表
# 方法A:读取指定工作表
# df = pd.read_excel(file, sheet_name='销售明细')
# 方法B:读取所有工作表并合并(适用于结构相同的多表)
xls = pd.ExcelFile(file)
for sheet_name in xls.sheet_names:
df = pd.read_excel(xls, sheet_name=sheet_name)
# 可选:给数据添加来源标识列
df['数据来源'] = f"{file}_{sheet_name}"
all_data_frames.append(df)
# 合并所有DataFrame
combined_df = pd.concat(all_data_frames, ignore_index=True)
# 提取所需数据:例如,计算各产品的年度总销售额
if '产品名称' in combined_df.columns and '销售额' in combined_df.columns:
summary_df = combined_df.groupby('产品名称', as_index=False)['销售额'].sum()
summary_df = summary_df.sort_values('销售额', ascending=False)
# 写入新表格
summary_df.to_excel('annual_sales_summary.xlsx', index=False)
print("多文件数据合并与汇总完成。")
```
### **场景三:从 PDF 中提取表格数据并生成 Excel(结合参考资料)**
根据【参考资料】,`pdfplumber` 和 `Spire.PDF for Python` 是提取 PDF 表格的常用库 [ref_1][ref_5]。这里以 `pdfplumber` 为例,展示从 PDF 提取表格并自动创建 Excel 文件的完整流程。
```python
import pdfplumber
import pandas as pd
def extract_tables_from_pdf_to_excel(pdf_path, excel_output_path):
"""
从PDF文件中提取所有表格,并合并写入到一个Excel文件的不同工作表中。
参数:
pdf_path (str): PDF文件路径。
excel_output_path (str): 输出的Excel文件路径。
"""
all_tables_data = {}
with pdfplumber.open(pdf_path) as pdf:
for page_num, page in enumerate(pdf.pages, start=1):
# 提取当前页的所有表格
tables = page.extract_tables()
for table_num, table in enumerate(tables, start=1):
if table: # 确保表格不为空
# 将表格数据转换为pandas DataFrame
# table 是一个列表的列表,每个子列表代表一行
df = pd.DataFrame(table[1:], columns=table[0]) # 假设第一行是表头
sheet_name = f"Page{page_num}_Table{table_num}"
all_tables_data[sheet_name] = df
print(f"已提取: {sheet_name}, 形状: {df.shape}")
if all_tables_data:
# 使用ExcelWriter将多个表格写入同一Excel文件的不同工作表
with pd.ExcelWriter(excel_output_path, engine='openpyxl') as writer:
for sheet_name, df in all_tables_data.items():
df.to_excel(writer, sheet_name=sheet_name, index=False)
print(f"所有表格已成功导出至: {excel_output_path}")
else:
print("未在PDF中发现表格。")
# 使用示例
extract_tables_from_pdf_to_excel('report.pdf', 'extracted_pdf_tables.xlsx')
```
此代码展示了如何遍历 PDF 每一页,提取其中的表格结构数据,并利用 `pandas` 的 `ExcelWriter` 将其组织到新 Excel 文件的不同工作表中,实现了从非结构化文档(PDF)到结构化数据(Excel)的自动化转换 [ref_1][ref_4][ref_6]。
### **场景四:复杂的数据转换与透视表生成**
有时“提取所需数据”意味着进行更复杂的聚合和重塑,例如生成数据透视表。
```python
import pandas as pd
# 读取源数据
df = pd.read_excel('sales_details.xlsx')
# 假设数据包含:区域(region)、销售员(salesperson)、产品类别(category)、销售额(amount)、日期(date)
# 需求:生成一个以“区域”为行、“产品类别”为列,汇总“销售额”的透视表
pivot_table = pd.pivot_table(df,
values='amount',
index='region',
columns='category',
aggfunc='sum',
fill_value=0, # 缺失值填充为0
margins=True, # 添加总计行/列
margins_name='总计')
print("生成的数据透视表:")
print(pivot_table)
# 将数据透视表写入新Excel文件
pivot_table.to_excel('sales_pivot_table.xlsx', sheet_name='区域-品类透视')
print("数据透视表已保存。")
```
### **场景五:基于提取的数据,按模板生成格式化报告**
如果需要新表格遵循特定格式,可以结合 `openpyxl` 在写入数据后进行样式调整,或使用 `pandas` 的 `ExcelWriter` 配合 `openpyxl` 引擎加载模板。
```python
from openpyxl import load_workbook
import pandas as pd
# 1. 提取数据
source_df = pd.read_excel('raw_data.xlsx')
processed_df = source_df[source_df['状态'] == '已完成'].copy()
processed_df['完成率'] = processed_df['已完成数'] / processed_df['总数'] * 100
# 2. 将数据写入一个预先设计好格式的模板
template_path = 'report_template.xlsx'
output_path = 'final_report.xlsx'
# 首先,将我们的数据保存到一个临时文件或直接用pandas写入模板(需小心覆盖)
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
# 将数据写入指定工作表,例如“Data”
processed_df.to_excel(writer, sheet_name='Data', index=False)
# 加载已写入数据的工作簿对象,以便后续样式操作
workbook = writer.book
worksheet = writer.sheets['Data']
# 3. 使用openpyxl进行后续格式化(示例:设置表头样式)
from openpyxl.styles import Font, PatternFill
header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
header_font = Font(color="FFFFFF", bold=True)
for cell in worksheet[1]: # 第一行是表头
cell.fill = header_fill
cell.font = header_font
worksheet.column_dimensions[cell.column_letter].width = 15
print(f"格式化报告已生成: {output_path}")
```
### **总结与最佳实践**
1. **明确提取规则**:在编码前,必须清晰定义“所需数据”的筛选条件(如数值范围、文本匹配、日期区间)和计算逻辑。
2. **处理异常**:在代码中增加异常处理(如 `try-except`),以应对文件不存在、数据格式错误、关键列缺失等情况。
3. **路径管理**:使用 `os.path` 模块检查文件路径,并使用绝对路径或配置化路径以提高脚本的健壮性。
4. **性能考虑**:对于大型 Excel 文件,`pandas` 的 `read_excel` 可以指定 `usecols` 参数仅读取必要的列,并使用 `chunksize` 进行分块读取以节省内存 [ref_2]。
5. **扩展应用**:此模式可以很容易地集成到自动化工作流中,例如,使用 Windows 任务计划程序或 Linux 的 crontab 定时执行脚本,或将其封装为 Web 服务(如使用 Flask 框架)供他人调用。
通过上述场景和代码示例,可以看到,利用 Python(尤其是 `pandas`)从源表格中提取数据并自动创建新表格是一个高效、灵活且可高度定制化的过程。无论是简单的筛选、跨文件/工作表的合并,还是从 PDF 等复杂文档中提取结构化表格,都可以通过组合不同的库来实现。