在 openpyxl 中格式化 Excel 个文件
Formatting Excel files in openpyxl
在我的项目中,我创建了 .xlsx 文件并使用 ws.append([list]) 为其填充数据。像那样:
for line in inf:
current_line = line.strip().split(';')
ws.append(current_line)
Header 行也使用 .append() 方法添加。
接下来我需要做的是为 header 行应用一种样式(粗体),为整个 table 应用另一种样式(每个单元格应具有简单的边框)。
我尝试过不同的方法(主要是 openpyxl.readthedocs.io 和 Google 搜索),但是 none 对我有用。
有没有办法为第一行应用样式,并为文件中的所有现有单元格应用边框?困难在于我在每一行中有不同数量的列,以及未知数量的行(很多)。边框应根据最长行的宽度应用,如图所示。
我试过的一些方法:
col = ws.column_dimensions['A']
col.border = = Border(left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000')
)
row = ws.row_dimensions[1]
row.border = = Border(left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000')
)
这些甚至不适用于单个 row/column (1/'A')。
更新:
试过这个
row = 1
for line in inf:
curr_line = line.strip().split(';')
n_cols = len(curr_line)
ws.append(curr_line)
for col in range(1, n_cols + 1):
cell = ws.cell(row, col)
cell.border = cell_border
if row == 1: # Header Style
cell.font = Font(bold=True)
row += 1
结果。边界分布不知何故不均匀。有的排短,有的排长,看着不尽如人意。除此之外,一些单元格没有任何一个边框或根本没有边框。
我假设您正在尝试将单元格样式应用于“list”类型,而不是“openpyxl.cell.cell.Cell”类型.
下面是在假设下使用 openpyxl 添加样式的片段:
- current_line : 列表。
- Header 仅是第 1 行。
- 版本:Python3.8.1
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, Font
wb = load_workbook(filename="sample.xlsx", read_only=False)
ws = wb.active
data = [["H1", "H2", "H3", "H4", "H5", "H6"],[1,2,3,4,5,6,7],[11,12,13],[21,22,23,24,25,26,27],[31,32],[41,42,43,44,45],[51,52]]
cell_border = Border(left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000')
)
n_rows = len(data)
for row in range(1, n_rows + 1):
n_cols = len(data[row-1])
ws.append(data[row-1])
for col in range(1, n_cols + 1):
cell = ws.cell(row, col)
cell.border = cell_border
if row == 1: # Header Style
cell.font = Font(bold=True)
wb.save("sample.xlsx")
您可以根据自己的具体要求进行修改。
希望对你有帮助。
更新:
max_rows = 0
max_cols = 0
for line in inf:
current_line = line.strip().split(';')
ws.append(current_line)
max_rows += 1
row_size = len(current_line)
if row_size > max_cols:
max_cols = row_size
for row in range(1, max_rows + 1):
for col in range(1, max_cols + 1):
cell = ws.cell(row, col)
cell.border = cell_border
if row == 1: # Header Style
cell.font = Font(bold=True)
有关 openpyxl 单元格格式的更多详细信息 here。
在我的项目中,我创建了 .xlsx 文件并使用 ws.append([list]) 为其填充数据。像那样:
for line in inf:
current_line = line.strip().split(';')
ws.append(current_line)
Header 行也使用 .append() 方法添加。
接下来我需要做的是为 header 行应用一种样式(粗体),为整个 table 应用另一种样式(每个单元格应具有简单的边框)。
我尝试过不同的方法(主要是 openpyxl.readthedocs.io 和 Google 搜索),但是 none 对我有用。
有没有办法为第一行应用样式,并为文件中的所有现有单元格应用边框?困难在于我在每一行中有不同数量的列,以及未知数量的行(很多)。边框应根据最长行的宽度应用,如图所示。
我试过的一些方法:
col = ws.column_dimensions['A']
col.border = = Border(left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000')
)
row = ws.row_dimensions[1]
row.border = = Border(left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000')
)
这些甚至不适用于单个 row/column (1/'A')。
更新: 试过这个
row = 1
for line in inf:
curr_line = line.strip().split(';')
n_cols = len(curr_line)
ws.append(curr_line)
for col in range(1, n_cols + 1):
cell = ws.cell(row, col)
cell.border = cell_border
if row == 1: # Header Style
cell.font = Font(bold=True)
row += 1
结果。边界分布不知何故不均匀。有的排短,有的排长,看着不尽如人意。除此之外,一些单元格没有任何一个边框或根本没有边框。
我假设您正在尝试将单元格样式应用于“list”类型,而不是“openpyxl.cell.cell.Cell”类型.
下面是在假设下使用 openpyxl 添加样式的片段:
- current_line : 列表。
- Header 仅是第 1 行。
- 版本:Python3.8.1
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, Font
wb = load_workbook(filename="sample.xlsx", read_only=False)
ws = wb.active
data = [["H1", "H2", "H3", "H4", "H5", "H6"],[1,2,3,4,5,6,7],[11,12,13],[21,22,23,24,25,26,27],[31,32],[41,42,43,44,45],[51,52]]
cell_border = Border(left=Side(border_style='thin', color='FF000000'),
right=Side(border_style='thin', color='FF000000'),
top=Side(border_style='thin', color='FF000000'),
bottom=Side(border_style='thin', color='FF000000')
)
n_rows = len(data)
for row in range(1, n_rows + 1):
n_cols = len(data[row-1])
ws.append(data[row-1])
for col in range(1, n_cols + 1):
cell = ws.cell(row, col)
cell.border = cell_border
if row == 1: # Header Style
cell.font = Font(bold=True)
wb.save("sample.xlsx")
您可以根据自己的具体要求进行修改。 希望对你有帮助。
更新:
max_rows = 0
max_cols = 0
for line in inf:
current_line = line.strip().split(';')
ws.append(current_line)
max_rows += 1
row_size = len(current_line)
if row_size > max_cols:
max_cols = row_size
for row in range(1, max_rows + 1):
for col in range(1, max_cols + 1):
cell = ws.cell(row, col)
cell.border = cell_border
if row == 1: # Header Style
cell.font = Font(bold=True)
有关 openpyxl 单元格格式的更多详细信息 here。