Python使用ExcelWriter为已有Excel文件添加格式报错求助
问题分析与解决方案
核心问题
- xlsxwriter不支持直接修改已有文件:你用
pd.ExcelWriter(path, engine='xlsxwriter')会直接创建新文件覆盖原文件,且此时writer.sheets为空,导致sheet = writer.sheets[r["name"]]返回None,触发NoneType object has no attribute set_column错误。 - 变量名不一致:函数参数是
dataset,循环里却用了data_set,会导致循环逻辑失效。 - 拼写错误:
set_solumn应为set_column。
方案一:用xlsxwriter重写数据并添加格式
如果可以接受重写文件,这种方式兼容性好,步骤是先读取原文件数据,再写入时添加格式:
import pandas as pd def format_file(dataset, path): try: # 创建ExcelWriter对象,准备写入新文件(或覆盖原文件) writer = pd.ExcelWriter(path, engine='xlsxwriter') book = writer.book for r in dataset: sheet_name = r["name"] df = r['data'] # 先将数据写入工作表 df.to_excel(writer, sheet_name=sheet_name, index=False) # 获取刚写入的工作表对象 sheet = writer.sheets[sheet_name] # 遍历列,设置格式(这里补全你的格式逻辑) for i, col_name in enumerate(df.columns): # 示例格式,替换成你的实际格式参数 align = 'center' num_format = '0.00' color = '#000000' width = 15 cell_format = book.add_format({ 'align': align, 'num_format': num_format, 'color': color }) # 设置列宽和格式(注意是set_column,拼写正确) sheet.set_column(i, i, width, cell_format) writer.close() return path except Exception as e: print(f"错误:{e}") return None
方案二:用openpyxl直接修改已有文件
如果只想修改已有文件的格式,不想重写数据,推荐用openpyxl引擎,它支持修改现有文件:
from openpyxl import load_workbook from openpyxl.styles import Alignment, Font, numbers def format_file(dataset, path): try: # 加载已有Excel文件 wb = load_workbook(path) for r in dataset: sheet_name = r["name"] # 获取目标工作表 sheet = wb[sheet_name] # 遍历列,设置格式(这里补全你的格式逻辑) for i, col_name in enumerate(r['data'].columns, start=1): # openpyxl列从1开始 # 示例格式,替换成你的实际参数 align = 'center' num_format = '0.00' color = '000000' width = 15 # 设置列宽 sheet.column_dimensions[chr(64 + i)].width = width # 创建格式样式 cell_alignment = Alignment(horizontal=align) cell_font = Font(color=color) cell_number_format = numbers.FORMAT_NUMBER_00 # 对应num_format='0.00' # 应用格式到整列(跳过表头的话从第2行开始) for row in sheet.iter_rows(min_row=1, max_row=sheet.max_row, min_col=i, max_col=i): for cell in row: cell.alignment = cell_alignment cell.font = cell_font cell.number_format = cell_number_format # 保存修改后的文件 wb.save(path) return path except Exception as e: print(f"错误:{e}") return None
内容的提问来源于stack exchange,提问作者Nick210000
相关产品推荐
相关产品推荐

