import os import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, Alignment, Border, Side, PatternFill from openpyxl.utils import get_column_letter
defgenerate_summary_report(hide_quantity=True): # 获取haocai文件夹中的所有Excel文件 folder_path = 'haocai' excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xls', '.xlsx'))] # 创建一个空的DataFrame用于存储汇总数据 summary_df = pd.DataFrame(columns=['耗材名称', '单位', '单价']) # 遍历每个Excel文件 for file in excel_files: # 提取年月标识(前4位数字) month_code = file[:4] # 读取Excel文件 file_path = os.path.join(folder_path, file) try: df = pd.read_excel(file_path) except Exception as e: print(f"读取文件 {file} 时出错: {e}") continue # 确保列名一致并去除空格 df.columns = df.columns.str.strip() # 检查必要列是否存在 required_columns = ['耗材名称', '单位', '单价', '出库数量', '出库金额'] ifnotall(col in df.columns for col in required_columns): print(f"文件 {file} 缺少必要列,跳过处理") continue # 为当前月份添加数量和金额列 summary_df[f'{month_code}_数量'] = pd.NA summary_df[f'{month_code}_金额'] = pd.NA # 遍历当前文件中的每一行 for _, row in df.iterrows(): try: product_name = str(row['耗材名称']) unit = str(row['单位']) price = float(row['单价']) quantity = float(row['出库数量']) amount = float(row['出库金额']) # 检查是否已存在于汇总表中 mask = (summary_df['耗材名称'] == product_name) & \ (summary_df['单位'] == unit) & \ (summary_df['单价'] == price) existing_rows = summary_df[mask] if existing_rows.empty: # 创建新行DataFrame new_row = pd.DataFrame([{ '耗材名称': product_name, '单位': unit, '单价': price, f'{month_code}_数量': quantity, f'{month_code}_金额': amount }]) # 使用concat合并 summary_df = pd.concat([summary_df, new_row], ignore_index=True) else: # 更新现有行 idx = existing_rows.index[0] summary_df.at[idx, f'{month_code}_数量'] = quantity summary_df.at[idx, f'{month_code}_金额'] = amount except Exception as e: print(f"处理文件 {file} 的一行时出错: {e}") continue # 确保金额列是数值类型 amount_columns = [col for col in summary_df.columns if'金额'in col] for col in amount_columns: summary_df[col] = pd.to_numeric(summary_df[col], errors='coerce') # 计算每个月的总金额 monthly_totals = summary_df[amount_columns].sum() # 添加总计行 total_row = {'耗材名称': '总计', '单位': '', '单价': ''} for col in summary_df.columns: if col in amount_columns: total_row[col] = monthly_totals[col] elif'数量'in col: total_row[col] = '' # 使用concat添加总计行 total_df = pd.DataFrame([total_row]) summary_df = pd.concat([summary_df, total_df], ignore_index=True) # 保存到Excel文件 output_file = '耗材出库统计总表.xlsx' try: # 先保存为Excel summary_df.to_excel(output_file, index=False, engine='openpyxl') # 美化Excel格式 wb = load_workbook(output_file) ws = wb.active # 设置标题行样式 header_fill = PatternFill(start_color="D3D3D3", end_color="D3D3D3", fill_type="solid") header_font = Font(bold=True, color="000000") thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin')) # 设置标题行格式 for cell in ws[1]: cell.font = header_font cell.fill = header_fill cell.border = thin_border cell.alignment = Alignment(horizontal='center', vertical='center') # 设置数据行格式 for row in ws.iter_rows(min_row=2): for cell in row: cell.border = thin_border cell.alignment = Alignment(horizontal='center', vertical='center') # 设置金额列的数值格式 if'金额'in ws.cell(row=1, column=cell.column).value: cell.number_format = '#,##0.00' elif'单价'in ws.cell(row=1, column=cell.column).value: cell.number_format = '0.00' # 设置总计行样式 total_row_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") for cell in ws[ws.max_row]: cell.fill = total_row_fill cell.font = Font(bold=True) # 设置列宽 ws.column_dimensions['A'].width = 30# 耗材名称 ws.column_dimensions['B'].width = 8# 单位 ws.column_dimensions['C'].width = 10# 单价 # 动态设置其他列宽 for i inrange(4, ws.max_column + 1): col_letter = get_column_letter(i) col_name = ws.cell(row=1, column=i).value if'数量'in col_name and hide_quantity: ws.column_dimensions[col_letter].hidden = True# 隐藏数量列 else: ws.column_dimensions[col_letter].width = 15 # 冻结首行 ws.freeze_panes = 'A2' # 保存修改 wb.save(output_file) print(f"汇总报表已生成,保存为: {output_file}") if hide_quantity: print("已隐藏所有数量列") except Exception as e: print(f"保存Excel文件时出错: {e}") if'wb'inlocals(): wb.close()
if __name__ == '__main__': # 调用时设置hide_quantity=True即可隐藏数量列 generate_summary_report(hide_quantity=True)
import os import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, Alignment
defgenerate_summary_report(): # 获取haocai文件夹中的所有Excel文件 folder_path = 'haocai' excel_files = [f for f in os.listdir(folder_path) if f.endswith('.xls') or f.endswith('.xlsx')] # 创建一个空的DataFrame用于存储汇总数据 summary_df = pd.DataFrame(columns=['耗材名称', '单位', '单价']) # 遍历每个Excel文件 for file in excel_files: # 提取年月标识(前4位数字) month_code = file[:4] # 读取Excel文件 file_path = os.path.join(folder_path, file) df = pd.read_excel(file_path) # 确保列名一致 df.columns = df.columns.str.strip() # 为当前月份添加数量和金额列 summary_df[f'{month_code}_数量'] = '' summary_df[f'{month_code}_金额'] = '' # 遍历当前文件中的每一行 for _, row in df.iterrows(): product_name = row['耗材名称'] unit = row['单位'] price = row['单价'] quantity = row['出库数量'] amount = row['出库金额'] # 检查是否已存在于汇总表中 existing_row = summary_df[(summary_df['耗材名称'] == product_name) & (summary_df['单位'] == unit) & (summary_df['单价'] == price)] if existing_row.empty: # 添加新行 new_row = { '耗材名称': product_name, '单位': unit, '单价': price, f'{month_code}_数量': quantity, f'{month_code}_金额': amount } summary_df = summary_df.append(new_row, ignore_index=True) else: # 更新现有行 idx = existing_row.index[0] summary_df.at[idx, f'{month_code}_数量'] = quantity summary_df.at[idx, f'{month_code}_金额'] = amount # 计算每个月的总金额 amount_columns = [col for col in summary_df.columns if'金额'in col] monthly_totals = summary_df[amount_columns].sum() # 添加总计行 total_row = {'耗材名称': '总计', '单位': '', '单价': ''} for col in summary_df.columns: if col in amount_columns: total_row[col] = monthly_totals[col] elif'数量'in col: total_row[col] = '' summary_df = summary_df.append(total_row, ignore_index=True) # 保存到Excel文件 output_file = '耗材出库统计总表.xlsx' summary_df.to_excel(output_file, index=False) # 美化Excel格式 wb = load_workbook(output_file) ws = wb.active # 设置标题行加粗 for cell in ws[1]: cell.font = Font(bold=True) # 设置对齐方式 for row in ws.iter_rows(): for cell in row: cell.alignment = Alignment(horizontal='center', vertical='center') # 设置列宽 ws.column_dimensions['A'].width = 40 ws.column_dimensions['B'].width = 10 ws.column_dimensions['C'].width = 10 for col inrange(4, ws.max_column + 1): ws.column_dimensions[chr(64 + col)].width = 15 # 保存修改 wb.save(output_file) print(f"汇总报表已生成,保存为: {output_file}")
if __name__ == '__main__': generate_summary_report()
使用说明:
确保所有出库明细Excel文件都放在haocai文件夹中
运行此Python程序
程序会生成一个名为耗材出库统计总表.xlsx的文件
程序功能:
自动识别文件夹中的所有Excel文件
从文件名中提取年月标识(如2412、2507)
按耗材名称、单位和单价进行汇总
为每个月创建数量和金额列
添加总计行显示每月总金额
自动美化Excel格式(加粗标题、居中对齐、调整列宽)
注意事项:
确保原始Excel文件的列名一致(如”耗材名称”、”单位”、”单价”等)
程序假设所有Excel文件都有相同的结构
需要安装以下库:
pandas
openpyxl
xlrd(用于读取.xls文件)
可以通过以下命令安装所需库:
1
pip install pandas openpyxl xlrd
时间: 2025-08-08T01:43:59
👤 用户
C:\Users\Notebook\Desktop\daima\re\07>haocai.py Traceback (most recent call last): File “C:\Users\Notebook\Desktop\daima\re\07\haocai.py”, line 102, in generate_summary_report() ~~~~~~~~~~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\Desktop\daima\re\07\haocai.py”, line 52, in generate_summary_report summary_df = summary_df.append(new_row, ignore_index=True) ^^^^^^^^^^^^^^^^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\generic.py”, line 6299, in getattr return object.getattribute(self, name) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^ AttributeError: ‘DataFrame’ object has no attribute ‘append’. Did you mean: ‘_append’?
File “C:\Users\Notebook\Desktop\daima\re\07\haocai.py”, line 107, in generate_summary_report() ~~~~~~~~~~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\Desktop\daima\re\07\haocai.py”, line 63, in generate_summary_report monthly_totals = summary_df[amount_columns].sum() File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\frame.py”, line 11670, in sum result = super().sum(axis, skipna, numeric_only, min_count, **kwargs) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\generic.py”, line 12506, in sum return self._min_count_stat_function( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ “sum”, nanops.nansum, axis, skipna, numeric_only, min_count, **kwargs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\generic.py”, line 12489, in _min_count_stat_function return self._reduce( ~~~~~~~~~~~~^ func, ^^^^^ …<4 lines>… min_count=min_count, ^^^^^^^^^^^^^^^^^^^^ ) ^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\frame.py”, line 11562, in _reduce res = df._mgr.reduce(blk_func) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\internals\managers.py”, line 1500, in reduce nbs = blk.reduce(func) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\internals\blocks.py”, line 404, in reduce result = func(self.values) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\frame.py”, line 11481, in blk_func return op(values, axis=axis, skipna=skipna, **kwds) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\nanops.py”, line 85, in _f return f(*args, **kwargs) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\nanops.py”, line 404, in new_func result = func(values, axis=axis, skipna=skipna, mask=mask, **kwargs) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\nanops.py”, line 477, in newfunc return func(values, axis=axis, **kwargs) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\nanops.py”, line 646, in nansum the_sum = values.sum(axis, dtype=dtype_sum) File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\numpy_core_methods.py”, line 52, in _sum return umr_sum(a, axis, dtype, out, keepdims, initial, where) TypeError: unsupported operand type(s) for +: ‘float’ and ‘str’
Traceback (most recent call last): File “C:\Users\Notebook\Desktop\daima\re\07\haocai.py”, line 113, in generate_summary_report() ~~~~~~~~~~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\Desktop\daima\re\07\haocai.py”, line 108, in generate_summary_report wb.save(output_file) ~~~~~~~^^^^^^^^^^^^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\workbook\workbook.py”, line 386, in save save_workbook(self, filename) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\writer\excel.py”, line 294, in save_workbook writer.save() ~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\writer\excel.py”, line 275, in save self.write_data() ~~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\writer\excel.py”, line 77, in write_data self._write_worksheets() ~~~~~~~~~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\writer\excel.py”, line 215, in _write_worksheets self.write_worksheet(ws) ~~~~~~~~~~~~~~~~~~~~^^^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\writer\excel.py”, line 200, in write_worksheet writer.write() ~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet_writer.py”, line 358, in write self.write_top() ~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet_writer.py”, line 103, in write_top self.write_cols() ~~~~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet_writer.py”, line 87, in write_cols self.xf.send(cols.to_tree()) ~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet\dimensions.py”, line 243, in to_tree for col in sorted(self.values(), key=sorter): ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet\dimensions.py”, line 237, in sorter value.reindex() ~~~~~~~~~~~~~^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet\dimensions.py”, line 181, in reindex self.min = self.max = column_index_from_string(self.index) ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^ File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\utils\cell.py”, line 132, in column_index_from_string raise ValueError(error_msg) ValueError: ‘[‘ is not a valid column name. Column names are from A to ZZZ Exception ignored in atexit callback <function _openpyxl_shutdown at 0x000001479E2AC860>: Traceback (most recent call last): File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\worksheet_writer.py”, line 32, in _openpyxl_shutdown os.remove(path) PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: ‘C:\Users\Notebook\AppData\Local\Temp\openpyxl.0l6ee5_2’
import os import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, Alignment from openpyxl.utils import get_column_letter
defgenerate_summary_report(): # 获取haocai文件夹中的所有Excel文件 folder_path = 'haocai' excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xls', '.xlsx'))] # 创建一个空的DataFrame用于存储汇总数据 summary_df = pd.DataFrame(columns=['耗材名称', '单位', '单价']) # 遍历每个Excel文件 for file in excel_files: # 提取年月标识(前4位数字) month_code = file[:4] # 读取Excel文件 file_path = os.path.join(folder_path, file) try: df = pd.read_excel(file_path) except Exception as e: print(f"读取文件 {file} 时出错: {e}") continue # 确保列名一致并去除空格 df.columns = df.columns.str.strip() # 检查必要列是否存在 required_columns = ['耗材名称', '单位', '单价', '出库数量', '出库金额'] ifnotall(col in df.columns for col in required_columns): print(f"文件 {file} 缺少必要列,跳过处理") continue # 为当前月份添加数量和金额列 summary_df[f'{month_code}_数量'] = pd.NA summary_df[f'{month_code}_金额'] = pd.NA # 遍历当前文件中的每一行 for _, row in df.iterrows(): try: product_name = str(row['耗材名称']) unit = str(row['单位']) price = float(row['单价']) quantity = float(row['出库数量']) amount = float(row['出库金额']) # 检查是否已存在于汇总表中 mask = (summary_df['耗材名称'] == product_name) & \ (summary_df['单位'] == unit) & \ (summary_df['单价'] == price) existing_rows = summary_df[mask] if existing_rows.empty: # 创建新行DataFrame new_row = pd.DataFrame([{ '耗材名称': product_name, '单位': unit, '单价': price, f'{month_code}_数量': quantity, f'{month_code}_金额': amount }]) # 使用concat合并 summary_df = pd.concat([summary_df, new_row], ignore_index=True) else: # 更新现有行 idx = existing_rows.index[0] summary_df.at[idx, f'{month_code}_数量'] = quantity summary_df.at[idx, f'{month_code}_金额'] = amount except Exception as e: print(f"处理文件 {file} 的一行时出错: {e}") continue # 确保金额列是数值类型 amount_columns = [col for col in summary_df.columns if'金额'in col] for col in amount_columns: summary_df[col] = pd.to_numeric(summary_df[col], errors='coerce') # 计算每个月的总金额 monthly_totals = summary_df[amount_columns].sum() # 添加总计行 total_row = {'耗材名称': '总计', '单位': '', '单价': ''} for col in summary_df.columns: if col in amount_columns: total_row[col] = monthly_totals[col] elif'数量'in col: total_row[col] = '' # 使用concat添加总计行 total_df = pd.DataFrame([total_row]) summary_df = pd.concat([summary_df, total_df], ignore_index=True) # 保存到Excel文件 output_file = '耗材出库统计总表.xlsx' try: # 先保存为Excel summary_df.to_excel(output_file, index=False, engine='openpyxl') # 美化Excel格式 wb = load_workbook(output_file) ws = wb.active # 设置标题行加粗 for cell in ws[1]: cell.font = Font(bold=True) # 设置对齐方式 for row in ws.iter_rows(): for cell in row: cell.alignment = Alignment(horizontal='center', vertical='center') # 设置列宽 ws.column_dimensions['A'].width = 40 ws.column_dimensions['B'].width = 10 ws.column_dimensions['C'].width = 10 # 动态设置其他列宽 for i inrange(4, ws.max_column + 1): col_letter = get_column_letter(i) ws.column_dimensions[col_letter].width = 15 # 保存修改 wb.save(output_file) print(f"汇总报表已生成,保存为: {output_file}") except Exception as e: print(f"保存Excel文件时出错: {e}") if'wb'inlocals(): wb.close()
if __name__ == '__main__': generate_summary_report()
import os import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, Alignment, Border, Side, PatternFill from openpyxl.utils import get_column_letter
defgenerate_summary_report(hide_quantity=True): # 获取haocai文件夹中的所有Excel文件 folder_path = 'haocai' excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xls', '.xlsx'))] # 创建一个空的DataFrame用于存储汇总数据 summary_df = pd.DataFrame(columns=['耗材名称', '单位', '单价']) # 遍历每个Excel文件 for file in excel_files: # 提取年月标识(前4位数字) month_code = file[:4] # 读取Excel文件 file_path = os.path.join(folder_path, file) try: df = pd.read_excel(file_path) except Exception as e: print(f"读取文件 {file} 时出错: {e}") continue # 确保列名一致并去除空格 df.columns = df.columns.str.strip() # 检查必要列是否存在 required_columns = ['耗材名称', '单位', '单价', '出库数量', '出库金额'] ifnotall(col in df.columns for col in required_columns): print(f"文件 {file} 缺少必要列,跳过处理") continue # 为当前月份添加数量和金额列 summary_df[f'{month_code}_数量'] = pd.NA summary_df[f'{month_code}_金额'] = pd.NA # 遍历当前文件中的每一行 for _, row in df.iterrows(): try: product_name = str(row['耗材名称']) unit = str(row['单位']) price = float(row['单价']) quantity = float(row['出库数量']) amount = float(row['出库金额']) # 检查是否已存在于汇总表中 mask = (summary_df['耗材名称'] == product_name) & \ (summary_df['单位'] == unit) & \ (summary_df['单价'] == price) existing_rows = summary_df[mask] if existing_rows.empty: # 创建新行DataFrame new_row = pd.DataFrame([{ '耗材名称': product_name, '单位': unit, '单价': price, f'{month_code}_数量': quantity, f'{month_code}_金额': amount }]) # 使用concat合并 summary_df = pd.concat([summary_df, new_row], ignore_index=True) else: # 更新现有行 idx = existing_rows.index[0] summary_df.at[idx, f'{month_code}_数量'] = quantity summary_df.at[idx, f'{month_code}_金额'] = amount except Exception as e: print(f"处理文件 {file} 的一行时出错: {e}") continue # 确保金额列是数值类型 amount_columns = [col for col in summary_df.columns if'金额'in col] for col in amount_columns: summary_df[col] = pd.to_numeric(summary_df[col], errors='coerce') # 计算每个月的总金额 monthly_totals = summary_df[amount_columns].sum() # 添加总计行 total_row = {'耗材名称': '总计', '单位': '', '单价': ''} for col in summary_df.columns: if col in amount_columns: total_row[col] = monthly_totals[col] elif'数量'in col: total_row[col] = '' # 使用concat添加总计行 total_df = pd.DataFrame([total_row]) summary_df = pd.concat([summary_df, total_df], ignore_index=True) # 保存到Excel文件 output_file = '耗材出库统计总表.xlsx' try: # 先保存为Excel summary_df.to_excel(output_file, index=False, engine='openpyxl') # 美化Excel格式 wb = load_workbook(output_file) ws = wb.active # 设置标题行样式 header_fill = PatternFill(start_color="D3D3D3", end_color="D3D3D3", fill_type="solid") header_font = Font(bold=True, color="000000") thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin')) # 设置标题行格式 for cell in ws[1]: cell.font = header_font cell.fill = header_fill cell.border = thin_border cell.alignment = Alignment(horizontal='center', vertical='center') # 设置数据行格式 for row in ws.iter_rows(min_row=2): for cell in row: cell.border = thin_border cell.alignment = Alignment(horizontal='center', vertical='center') # 设置金额列的数值格式 if'金额'in ws.cell(row=1, column=cell.column).value: cell.number_format = '#,##0.00' elif'单价'in ws.cell(row=1, column=cell.column).value: cell.number_format = '0.00' # 设置总计行样式 total_row_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") for cell in ws[ws.max_row]: cell.fill = total_row_fill cell.font = Font(bold=True) # 设置列宽 ws.column_dimensions['A'].width = 30# 耗材名称 ws.column_dimensions['B'].width = 8# 单位 ws.column_dimensions['C'].width = 10# 单价 # 动态设置其他列宽 for i inrange(4, ws.max_column + 1): col_letter = get_column_letter(i) col_name = ws.cell(row=1, column=i).value if'数量'in col_name and hide_quantity: ws.column_dimensions[col_letter].hidden = True# 隐藏数量列 else: ws.column_dimensions[col_letter].width = 15 # 冻结首行 ws.freeze_panes = 'A2' # 保存修改 wb.save(output_file) print(f"汇总报表已生成,保存为: {output_file}") if hide_quantity: print("已隐藏所有数量列") except Exception as e: print(f"保存Excel文件时出错: {e}") if'wb'inlocals(): wb.close()
if __name__ == '__main__': # 调用时设置hide_quantity=True即可隐藏数量列 generate_summary_report(hide_quantity=True)