如何使用 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
在每个月之前重置值。
我正在尝试在我的代码中迭代多个 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
在每个月之前重置值。