前言
这是一个根据科目余额表自动生成科目汇总表的Python脚本
一、 准备工作
表格的第一列是:科目代码、科目名称、期初借方、期初贷方、本年发生额借方、本年发生额贷方、期末借方、期末贷方。
需要注意的是,如果总科目下面有子科目,需要把总科目的合计删除。如果没有子科目,则不删除。
有子科目的顶级科目:
删除合计数:
二、 代码如下
import pandas as pd
import os
# 假设您的原始Excel文件名为"科目余额表.xlsx",并且您要分类的列是第一列
file_path = '科目余额表.xlsx'
sheet_name = 0 # 如果您的Excel有多个sheet,确保使用正确的sheet名
# 读取原始的Excel文件
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 创建一个字典来存储每个分类的DataFrame
groups = {}
# 遍历DataFrame的每一行
for index, row in df.iterrows():
# 获取A列的前四个字符,并确保它们是字符串形式
key = str(row.iloc[0])[:4]
# 检查key是否存在于groups字典中,如果不存在则初始化为空的DataFrame
if key not in groups:
groups[key] = pd.DataFrame()
# 使用pandas的append方法将行添加到对应的DataFrame中
groups[key] = pd.concat([groups[key], pd.DataFrame([row])], ignore_index=True)
writer = pd.ExcelWriter('科目分类.xlsx', engine='openpyxl')
# 遍历groups字典,将每个分类的数据保存到Excel的一个标签页中
for key, group_df in groups.items():
#1代表第3列开始求和,0代表从第2列
sum_df = group_df.iloc[0:, :].sum(axis=0).to_frame().T
# 给求和的DataFrame添加列名,如果有的话
if not sum_df.empty:
sum_df.columns = group_df.columns
# 将原始数据和求和结果保存到Excel的特定标签页中
group_df.to_excel(writer, sheet_name=key, startrow=0, index=False, header=True)
# 将求和结果写入到标签页的最后一行
sum_df.to_excel(writer, sheet_name=key, startrow=group_df.shape[0] + 1, index=False, header=False)
writer.close()
print("分类完成。\n----------------")
# 假设您的原始Excel文件名为"原始数据.xlsx"
grouping_path = '科目分类.xlsx'
# 使用pandas的ExcelFile类来读取整个Excel文件
xls = pd.ExcelFile(grouping_path)
# 创建一个空的DataFrame来存储汇总结果
summary_df = pd.DataFrame()
# 遍历Excel文件中的每个标签(sheet)
for sheet_name in xls.sheet_names:
# 读取每个标签(sheet)的数据
df_sheet = pd.read_excel(xls, sheet_name=sheet_name)
# 检查sheet是否有足够的行来包含求和结果
if len(df_sheet) > 1:
# 假定求和结果是在最后一行的第7列和第8列
summary_row = df_sheet.iloc[-1, [4,5,6,7]] # 列的索引是从0开始的,所以7和8列的索引是6和7
# 创建一个新的DataFrame来存储当前sheet的求和结果
sheet_summary_df = pd.DataFrame({
'项目': [sheet_name],
'本期借方': summary_row.iloc[0],
'本期贷方': summary_row.iloc[1],
'期末借方': summary_row.iloc[2],
'期末贷方': summary_row.iloc[3]
})
# 将当前sheet的求和结果追加到汇总的DataFrame中
summary_df = pd.concat([summary_df, sheet_summary_df], ignore_index=True)
# 显示汇总的DataFrame
print('科目汇总完成\n----------------')
print(summary_df)
# 如果需要,可以将汇总结果保存为新的Excel文件
summary_df.to_excel('科目汇总表.xlsx', index=False)
总结
挺好用的,缺点是输出结果不够直观,没有把科目名称也列出来,但没必要。