如何使用 Openpyxl 遍历单独的工作表以更改其属性

How to iterate through separate sheets to change their properties using Openpyxl

我正在尝试在我的代码中迭代多个 sheet,因此我可以一次性格式化所有 sheet 以满足我的需要。我需要这个用于我正在创建的计划器。但是,我的尝试不起作用。它只能正确格式化“January”sheet。默认“Sheet”,其他月份不格式化。你能帮我解决这个问题吗?

import numpy as np
from openpyxl import Workbook
from openpyxl.styles import Alignment, Font

wb = Workbook()
jan = wb.create_sheet("January")
feb = wb.create_sheet("February")
mar = wb.create_sheet("March")
apr = wb.create_sheet("April")
may = wb.create_sheet("May")
jun = wb.create_sheet("June")
jul = wb.create_sheet("July")
aug = wb.create_sheet("August")
sep = wb.create_sheet("September")
octo = wb.create_sheet("October")
nov = wb.create_sheet("November")
dec = wb.create_sheet("December")

months = np.array([jan, feb, mar, apr, may, jun, jul, aug, sep, octo, nov, dec])

num = 1
for m in range(12):
      for row in range(1, 33):
        months[m].row_dimensions[num].height = 30
        num = num + 1
        for col in range(1, 4):
            months[m].cell(row, col).alignment = Alignment(horizontal="center", vertical="center", wrap_text="center")
            months[m].cell(row, col).font = Font(size="15")

wb.save("sample.xlsx")

此外,我是 Python 和 Openpyxl 的新手,所以这可能不是最有效的方法,或者我编写的代码可能有些愚蠢,如果有请告诉我。

您的问题是您在 for 循环之前初始化了 num,然后在您的循环中递增它而没有重置它。如果您向下滚动 2 月、3 月等的表格,您会发现格式确实存在,它只是比您预期的向下 33*m 行。您可以通过将 num=1 放入 for 循环来解决此问题。

for m in range(12):
    num = 1
    for row in range(1, 33):
        months[m].row_dimensions[num].height = 30
        num = num + 1
        for col in range(1, 4):
            months[m].cell(row, col).alignment = Alignment(horizontal="center", vertical="center", wrap_text="center")
            months[m].cell(row, col).font = Font(size="15")

但是,当您已经有递增变量 - row 时,您正试图递增 num。两个变量具有相同的值,因此不需要 num,您可以将其替换为 row

for m in range(12):
    for row in range(1, 33):
        months[m].row_dimensions[row].height = 30
        for col in range(1, 4):
            months[m].cell(row, col).alignment = Alignment(horizontal="center", vertical="center", wrap_text="center")
            months[m].cell(row, col).font = Font(size="15")

您还可以设置工作表的格式,使行数与该月的天数(加上标题行)一样多。一个完整的工作示例显示了这一点:

from openpyxl import Workbook
from openpyxl.styles import Alignment, Font
from calendar import monthrange

# Create workbook
wb = Workbook()

# List of the months
months = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
    ]

# Create a sheet for each month
month_sheets = [wb.create_sheet(month) for month in months]

# Formatting sheets
for i, sheet in enumerate(month_sheets):
    days_in_month = monthrange(2021, i+1)[1]    # The year input only matters for February (leap years)
    for row in range(1, days_in_month+2):       # +2 to allow for heading row as well
        sheet.row_dimensions[row].height = 30
        for col in range(1, 4):
            sheet.cell(row, col).alignment = Alignment(horizontal="center", vertical="center", wrap_text="center")
            sheet.cell(row, col).font = Font(size="15")

wb.save("sample.xlsx")

问题是你在所有月份之前设置 num = 1 - 所以在 January 中它格式化第 1-33 行,在 February 中它格式化第 34-66 行,等等

您应该在 for m in range(12): 中使用 num = 1 在每个月之前重置值。