openpyxl中的文本水平对齐方式

35

我想将两个合并单元格的文本对齐方式更改为居中。我找到了一些答案,但对我的情况不起作用:

currentCell = ws.cell('A1')
currentCell.style.alignment.horizontal = 'center' #TypeError: cannot set horizontal attribute
#or
currentCell.style.alignment.vertical = Alignment.HORIZONTAL_CENTER #AttributeError: type object 'Alignment' has no attribute 'HORIZONTAL_CENTER'

两种方法都不起作用,还有其他方法吗?

6个回答

69

是的,使用openpyxl可以实现这一点:

from openpyxl.styles import Alignment

currentCell = ws.cell('A1') #or currentCell = ws['A1']
currentCell.alignment = Alignment(horizontal='center')

希望这能对您有所帮助


12

这是最新版本的PIP(2.2.5)对我有效的解决方案。

    # center all cells
    for col in w_sheet.columns:
        for cell in col:
            # openpyxl styles aren't mutable,
            # so you have to create a copy of the style, modify the copy, then set it back
            alignment_obj = cell.alignment.copy(horizontal='center', vertical='center')
            cell.alignment = alignment_obj

更新:

从openpyxl版本2.4.0(约2016年)开始,.copy()方法对于StyleProxy对象已被废弃

尝试将最后两行更改为:

from copy import copy
alignment_obj = copy(cell.alignment)
alignment_obj.horizontal = 'center'
alignment_obj.vertical = 'center'
cell.alignment = alignment_obj

5

对于我来说,其他解决方案都不适用,因为我的解决方案需要使用openpyxl,而且至少在2.1.5版本中,无法直接设置cell.alignment。

from openpyxl.styles import Style, Alignment

cell = ws.cell('A1')
cell.style = cell.style.copy(alignment=Alignment(horizontal='center')) 

以上代码将当前的样式复制并替换对齐方式。您也可以创建全新的样式 - 任何未指定值都将使用默认值。更多信息请参见:https://openpyxl.readthedocs.org/en/latest/styles.html
cell.style = Style(alignment=Alignment(horizontal='center'),font=Font(bold=True))

# or - a tidier way

vals = {'alignment':Alignment(horizontal='center'),
        'font':Font(bold=True),
       }
new_style = Style(**vals)
cell.style = new_style

2
Style类已不再使用,您可以直接为各个样式元素赋值。例如,在此示例中,您将分别指定cell.font = Font(bold=True)cell.alignment = Alignment(horizontal='center')(而不是在示例中)以及cell.fill = PatternFill(fgColor='33489F', fill_type='solid') - hlongmore
@hlongmore 是否有可能一次性为整个列分配所有单元格? - AsheKetchum
1
@AsheKetchum 这是一个好问题,我自己也需要弄清楚。如果我发现可以的话,我会更新或添加新的评论。 - hlongmore

2
我发现以下代码是一种相当简单的方法来格式化工作表中的每个单元格:
tot_rows = ws.max_row #get max row number
tot_cols = ws.max_column #get max column number

cols = range(1,tot_cols) #turns previous variables into iterables
rows = range(1,tot_rows) 

for c in cols:
    for r in rows:
        ws.cell(row=r, column=c).alignment = Alignment(horizontal='center', vertical='center')

1

这是我第一次在这里发布任何内容。 所以我找到了一种使用openpyxl对齐文本的方法,Alignment

i=3
while i < 253:
    cellc = ws.cell(row=i, column= 3)
    cellc.alignment = Alignment(horizontal="right")
    i+=1

我将i设置为起始点,然后是我的列的长度


-2

您可以使用Python XlsxWriter库来实现此功能。

import xlsxwriter

workbook = xlsxwriter.Workbook('example.xlsx')
worksheet = workbook.add_worksheet()

cell_format = workbook.add_format({'align': 'center'})

worksheet.merge_range('A1:B1', "")
worksheet.write_rich_string('A1','Example', cell_format)

workbook.close()

这里我已经合并了单元格A1和B1,并添加了一个单元格格式参数,其中包括将对齐参数分配为居中。

enter image description here


7
问题标题为《openpyxl中的水平文本对齐》,强调是我的。请注意,我的备注并不意味着您没有回答部分问题,也不意味着提问者不能决定切换到其他库并批准您的答案。 - gboffi
@gboffi 我曾经使用过xlsxwriter,它具有出色的xls编写功能,这就是我建议使用它的原因。此外,由于它被提及为合并两个单元格并使其水平居中,我通过这种方式实现了这一点。因此,如果其他方法都不起作用,OP可以考虑切换库。 - Tanveer Alam
2
在这种情况下,我认为您必须使用xlsxwriter,因为Openpyxl不支持合并单元格的样式,因为规范没有定义如何处理它。 - Charlie Clark
1
@Tanveer:不需要使用write_rich_string()。你可以通过以下方式达到相同的效果:worksheet.merge_range('A1:B1', "Example", cell_format) - jmcnamara
2
@Charlie:我不确定是否有明确规定,但在实践中,合并范围的样式应用于范围中第一个单元格中的字符串/数字/公式,然后应用于其余范围的空单元格。我使用Openpyxl API在Pandas中实现了合并单元格处理。XlsxWriter在内部也是这样做的。 - jmcnamara
1
@jmcnamara 是的,我看过Excel的一些操作。我发现在读/写情况下创建的单元格存在问题:这些单元格中的任何值以及如何处理更复杂的格式,例如边框?我们有几个与此相关的错误 https://bitbucket.org/openpyxl/openpyxl/issue/348使用空白单元格方法,您甚至可以对单元格应用完全不同的格式,这表明它真的是一个hack。 :-( 我将向ECMA提交“缺陷报告”以获得澄清。 - Charlie Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接