Openpyxl 边界线在与另一条边界线的交点处中断
Openpyxl Border line breaks on intersection with another border line
我正在尝试创建一个 table 以使用 python 的第三方 excel 软件包 openpyxl 将数据制成表格。
代码的第一个 for 语句绘制了一条从单元格 'A5' 到单元格 'E5' 的行,
第二个 for 语句从单元格 'A6' 到单元格 'E6' 绘制另一行线
第三个 for 语句从单元格 'C5' 到单元格 'C9' 绘制一条列线
第四个 for 语句从单元格 'F5 到单元格 'F9'
绘制另一列
但是,从单元格 'C5' 到 'C9' 绘制的列边框似乎只是打破了
当它与从单元格 'A5 到 'E5' 和 'A6' 到 'E6' 的行相交时,以及
从 'C7' 而不是 'C5' 开始绘制。
虽然从单元格 'F5':'F9' 绘制的列边框线工作得很好。
(我会张贴正在创建的 table 的图片,但我的声誉不到 10)
我有什么地方做错了吗?
from openpyxl import Workbook
from openpyxl.styles import Border, Side
wb = Workbook()
ws = wb.active
ws.sheet_view.showGridLines = False
column_border = Border(left=Side(style='thin'))
row_border = Border(top=Side(style='thin'))
for col in ws['C5:C9']:
for cell in col:
cell.border = column_border
for col in ws['F5:F9']:
for cell in col:
cell.border = column_border
for row in ws['A5:E5']:
for cell in row:
cell.border = row_border
for col in ws['A6:E6']:
for cell in col:
cell.border = row_border
wb.save('a.xlsx')
问题是您覆盖了相交单元格的 Border 对象。您的前两个循环将单元格的 Border 对象设置为左侧的细线。接下来的两个循环将单元格的边框对象设置为顶部的细线 - 但这摆脱了创建顶线的原始边框对象。
我建议做的是创建两个添加边框对象的方法。这些方法将检查边界是否已经存在。如果是这样,它将增强它而不是取代它。然后在循环中调用这些方法而不是直接赋值。
此代码可能有效也可能无效,我当前的系统没有安装 OpenPyXL,我需要管理员权限才能安装它。
def add_row_boarder(row_cell):
if row_cell.border = None:
row_cell.border = row_border
else:
row_cell.border.top = Side(style='thin')
return row_cell
def add_col_boarder(col_cell):
if col_cell.border = None:
col_cell.border = col_border
else:
col_cell.border.left = Side(style='thin')
return col_cel
正如 Rob 所说,您正在覆盖某些单元格的边框。 documentation 提供了格式化一系列单元格的通用方法,但基本上您可以组合样式,因此 cell.border = cell.border + row_border
我正在尝试创建一个 table 以使用 python 的第三方 excel 软件包 openpyxl 将数据制成表格。 代码的第一个 for 语句绘制了一条从单元格 'A5' 到单元格 'E5' 的行, 第二个 for 语句从单元格 'A6' 到单元格 'E6' 绘制另一行线 第三个 for 语句从单元格 'C5' 到单元格 'C9' 绘制一条列线 第四个 for 语句从单元格 'F5 到单元格 'F9'
绘制另一列但是,从单元格 'C5' 到 'C9' 绘制的列边框似乎只是打破了 当它与从单元格 'A5 到 'E5' 和 'A6' 到 'E6' 的行相交时,以及 从 'C7' 而不是 'C5' 开始绘制。
虽然从单元格 'F5':'F9' 绘制的列边框线工作得很好。 (我会张贴正在创建的 table 的图片,但我的声誉不到 10) 我有什么地方做错了吗?
from openpyxl import Workbook
from openpyxl.styles import Border, Side
wb = Workbook()
ws = wb.active
ws.sheet_view.showGridLines = False
column_border = Border(left=Side(style='thin'))
row_border = Border(top=Side(style='thin'))
for col in ws['C5:C9']:
for cell in col:
cell.border = column_border
for col in ws['F5:F9']:
for cell in col:
cell.border = column_border
for row in ws['A5:E5']:
for cell in row:
cell.border = row_border
for col in ws['A6:E6']:
for cell in col:
cell.border = row_border
wb.save('a.xlsx')
问题是您覆盖了相交单元格的 Border 对象。您的前两个循环将单元格的 Border 对象设置为左侧的细线。接下来的两个循环将单元格的边框对象设置为顶部的细线 - 但这摆脱了创建顶线的原始边框对象。
我建议做的是创建两个添加边框对象的方法。这些方法将检查边界是否已经存在。如果是这样,它将增强它而不是取代它。然后在循环中调用这些方法而不是直接赋值。
此代码可能有效也可能无效,我当前的系统没有安装 OpenPyXL,我需要管理员权限才能安装它。
def add_row_boarder(row_cell):
if row_cell.border = None:
row_cell.border = row_border
else:
row_cell.border.top = Side(style='thin')
return row_cell
def add_col_boarder(col_cell):
if col_cell.border = None:
col_cell.border = col_border
else:
col_cell.border.left = Side(style='thin')
return col_cel
正如 Rob 所说,您正在覆盖某些单元格的边框。 documentation 提供了格式化一系列单元格的通用方法,但基本上您可以组合样式,因此 cell.border = cell.border + row_border