[英]How to read merged cell values of an excel file with openpyxl / python?
[英]How to write in merged cell in Excel using `openpyxl` library?
我正在使用openpyxl
库在单独的单元格中写入现有的 Excel 文件。
如何在 Excel 合并单元格中写入一些文本?
错误AttributeError: 'MergedCell' object attribute 'value' is read-only
合并单元格时:
代码:
wb = openpyxl.load_workbook(filename=src)
for row in df_short.itertuples():
ws = wb[row.sheet]
try:
cell = 'N'+str(row.id)
ws[cell] = '=HYPERLINK("%s","#%s")' % (row.txt_path, row.txt)
使用以下代码,其中 ws 是工作表对象。
ws.cell(cells).value = 'Whatever you want it to be'
用合并块的左上角单元格替换单元格。 我通常将其保留为行和列。 所以 B1 将表示为 row = 1, column = 2。
值后 =
将您想要放置在单元格内的任何字符串或整数。
ws.merged_cells
将返回一个包含所有合并单元格位置的列表,例如:
In [6]: mgs = ws.merged_cells
In [7]: mgs
Out[7]: <MultiCellRange [B1:C1 D1:J1 K1:L1 M1:N1]>
In [8]: for ms in mgs:
...: print(ms)
...:
B1:C1
D1:J1
K1:L1
M1:N1
如果要为合并的单元格设置新值,则必须先取消合并,然后更改第一个子单元格的值,最后再次合并它们。 一个完整的例子:
In [1]: import openpyxl
In [2]: wb = openpyxl.load_workbook('demo.xlsx')
In [3]: ws = wb.active
In [4]: m_cells = ws.merged_cells
In [5]: m_cells
Out[5]: <MultiCellRange [B1:C1 D1:J1 K1:L1 M1:N1]>
In [6]: coo = m_cells.ranges[0].coord
In [7]: coo
Out[7]: 'B1:C1'
In [8]: ws.unmerge_cells(coo)
In [9]: ws['B1'] = 'New Value'
In [10]: ws.merge_cells(coo)
附加信息:
ws.merged_cells
将返回MultiCellRange
类型的对象,但不会返回列表,您应该使用.ranges
属性来获取包含CellRange
类型的对象的列表。
无法在ws.unmerge_cells()
使用CellRange
类型的对象,您必须使用.coord
属性来获取ws.unmerge_cells(str)
可以调用的str
类型。
包装功能
def mod_cell(merged_cell, new_value):
"""
Set new value to a merged_cell
:param merged_cell: Merged cell to modify, ws.merged_cells.ranges[x]
:param new_value: New value
:return:
"""
# Unmerge
coo = merged_cell.coord
ws.unmerge_cells(coo)
# Set new value to the first sub-cell
first_cell = ws.cell(row=merged_cell.left[0][0], column=merged_cell.left[0][1])
first_cell.value = new_value
# Merge again
ws.merge_cells(coo)
如果您愿意使用另一个 excel 库,那么xlwings
不会遇到您的问题,它可以让 Python 控制 excel。 xlwings 与 openpyxl 阅读 Excel 工作簿之间的差异。 注意xlwings
需要在您的计算机上安装 Excel,而openpyxl
不需要。
下面设置已经合并的单元格 A1 的值,没有问题。
import xlwings as xw
wb = xw.Book('myproject.xlsm')
sh = wb.sheets[0]
sh.range('A1').value = 'hello'
结果:
我在 python3.5 中对 conda 环境有这个确切的错误和解决方案是
conda install -c conda-forge openpyxl=2.5.14 -y
同样对于 pip3 环境:
pip3 install openpyxl==2.5.14 -y
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.