OpenPyXL 为整列设置 number_format

OpenPyXL set number_format for the whole column

我正在将一些数据导出到 Excel,并且在导出到 Excel 文件时,我已经成功地格式化了列中每个填充的单元格:

import openpyxl
from openpyxl.utils import get_column_letter

wb = openpyxl.Workbook()
ws = wb.active

# Add rows to worksheet
for row in data:
    ws.append(row)

# Disable formatting numbers in columns from column `D` onwards
#   Need to do this manually for every cell
for col in range(3, ws.max_column+1):
    for cell in ws[get_column_letter(col)]:
        cell.number_format = '@'

# Export data to Excel file...

但这只会格式化每列中填充的单元格。此列中的其他单元格仍具有 General 格式。

如何将此列中的所有空单元格设置为 @,以便任何人在这个导出的 Excel 文件中编辑这些列中的单元格时,都不会遇到插入问题phone 数字为实际数字。

对于 openpyxl,您必须始终单独设置每个单元格的样式。如果您为列设置它们,那么 Excel 将在创建新单元格时应用它们,但样式 始终 仍然应用于单个单元格。

当您仅在该列的行上迭代到 max_cell 时,这些是唯一被重新格式化的单元格。虽然您无法重新格式化列,但您可以使用不同的方式至少为特定单元格设置格式:

last_cell = 100

for col in range(3, ws.max_column+1):
    for row in range(1, last_cell):
        ws.cell(column=col, row=row).number_format = '@'  # Changing format to TEXT

以下将格式化列中的所有单元格,最多 last_cell 您可以使用它,虽然它不是您所需要的,但已经足够接近了。

条件格式可以破解整个列的数字格式。在整个列上应用千位分隔符这对我有用:

diff_style = DifferentialStyle(numFmt = NumberFormat(numFmtId='4',formatCode='#,##0.00'))
rule1 = Rule(type="expression", dxf=diff_style)
rule1.formula = ["=NOT(ISBLANK($H2))"]  // column on which thousand separator is to be applied
work_sheet.conditional_formatting.add("$H2:$H500001", rule1)  // provide a range of cells