You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Xlsxwriter切换工作表时如何重置写入行号?

解决Xlsxwriter切换月度工作表时行号不重置的问题

问题分析

你的代码使用全局变量sheetRow记录写入行号,但切换不同月份工作表时该变量不会自动重置,导致新工作表从之前的行号继续写入,而非从表头下方的第一行(行号1)开始。

解决方案

改用字典存储每个月份对应的行号,为每个工作表独立维护写入位置:

  1. 初始化字典,键为月份名称,值初始化为1(表头已写入行0);
  2. 写入对应月份交易数据时,从字典中获取该月份的当前行号;
  3. 写入完成后,仅递增该月份对应的行号值。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:05:08