Python Xlsxwriter切换工作表时如何重置写入行号?
解决Xlsxwriter切换月度工作表时行号不重置的问题
问题分析
你的代码使用全局变量sheetRow记录写入行号,但切换不同月份工作表时该变量不会自动重置,导致新工作表从之前的行号继续写入,而非从表头下方的第一行(行号1)开始。
解决方案
改用字典存储每个月份对应的行号,为每个工作表独立维护写入位置:
- 初始化字典,键为月份名称,值初始化为1(表头已写入行0);
- 写入对应月份交易数据时,从字典中获取该月份的当前行号;
- 写入完成后,仅递增该月份对应的行号值。
修改后的完整代码
import csv import ast import os import datetime import calendar import xlsxwriter if not os.path.isfile("./categories.txt"): with open("./categories.txt", "w") as f: f.write("{}") f.close() workbook = xlsxwriter.Workbook('MyFinances.xlsx') bold = workbook.add_format({'bold': True}) # 创建12个月度工作表并写入表头 month_names = [calendar.month_name[i] for i in range(1, 13)] for month in month_names: worksheet = workbook.add_worksheet(month) worksheet.write('A1', 'Date', bold) worksheet.write('B1', 'Company', bold) worksheet.write('C1', 'Amount', bold) worksheet.write('D1', 'Category', bold) # 初始化每个月份的行号追踪器,初始行号为1(表头在第0行) row_tracker = {month: 1 for month in month_names} with open("categories.txt", "r+") as category_contents: categories = ast.literal_eval(category_contents.read()) with open("data (5).csv", "r", encoding="ISO-8859-1", newline="") as csv_file: csv_reader = iter(csv.reader(csv_file, delimiter=',')) next(csv_reader) # 跳过CSV表头 for row in csv_reader: date = row[1] month = calendar.month_name[datetime.datetime.strptime(date, "%d/%m/%Y").month] company = row[5].split("\t")[0].rstrip() amount = row[3] # 处理分类匹配与新增 if company in categories: category = categories[company].upper() else: print( f"公司{company}在{date}发生的金额为{amount}的交易未找到对应分类。") print("当前系统中的分类有:") for cat in set(categories.values()): print(cat) enterCat = input("请从上述列表选择分类,或输入新分类:") categories[company] = enterCat.upper() category = categories[company].upper() transaction = (date, month, company, amount, category) print(transaction) # 获取对应月份的工作表和当前行号 worksheet = workbook.get_worksheet_by_name(month) current_row = row_tracker[month] # 写入数据 worksheet.write(current_row, 0, date) worksheet.write(current_row, 1, company) worksheet.write(current_row, 2, amount) worksheet.write(current_row, 3, category) # 仅递增当前月份的行号 row_tracker[month] += 1 # 更新分类文件 category_contents.seek(0) category_contents.write(str(categories)) category_contents.truncate() category_contents.close() workbook.close()
关键改动说明
- 新增
row_tracker字典,为每个月份独立维护写入行号,避免全局变量的干扰; - 提前保存月份名称列表,简化字典初始化和后续调用;
- 写入数据时,从字典中获取当前月份的行号,写完后仅更新该月份的行号值,确保每个工作表都从行1开始写入数据。
内容的提问来源于stack exchange,提问作者mufferman1
相关产品推荐
相关产品推荐

