鱼C论坛

 找回密码
 立即注册
查看: 285|回复: 5

[已解决]openpyxl不能填写到合并单元格,报错

[复制链接]
发表于 2024-7-31 16:48:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
D:\PYTHON_NEW\pythonProject\.venv\Scripts\python.exe "D:\PYTHON_NEW\pythonProject\提取python excel\11增加单元格数据  测试生成管线对应的工艺卡的填充数据.py"
Traceback (most recent call last):
  File "D:\PYTHON_NEW\pythonProject\提取python excel\11增加单元格数据  测试生成管线对应的工艺卡的填充数据.py", line 86, in <module>
    copy_template_to_new_file(pipeline_number, template_file, target_folder)
  File "D:\PYTHON_NEW\pythonProject\提取python excel\11增加单元格数据  测试生成管线对应的工艺卡的填充数据.py", line 59, in copy_template_to_new_file
    sheet3['A8'] = 11
    ~~~~~~^^^^^^
  File "D:\PYTHON_NEW\pythonProject\.venv\Lib\site-packages\openpyxl\worksheet\worksheet.py", line 317, in __setitem__
    self[key].value = value
    ^^^^^^^^^^^^^^^
AttributeError: 'MergedCell' object attribute 'value' is read-only

Process finished with exit code 1

--------------
对合并单元格,不允许编辑数据。
最佳答案
2024-8-1 17:31:56


可以对左上角赋值,这样就不会报错了~
import openpyxl

def write_xlsx(xlsx_file):
    workbook = openpyxl.load_workbook(xlsx_file)
    sheet = workbook['Sheet1']

    # 获取合并单元格信息
    merged_cells = sheet.merged_cells.ranges

    # 检查单元格是否为合并单元格,并对左上角单元格赋值
    cell_address = 'F5'
    if any([cell_address in merged_cell for merged_cell in merged_cells]):
        # 获取合并区域
        for merged_cell in merged_cells:
            if cell_address in merged_cell:
                # 对左上角单元格赋值
                top_left_cell = merged_cell.min_row, merged_cell.min_col
                sheet.cell(row=top_left_cell[0], column=top_left_cell[1], value="是合并的单元格,测试赋值,嘿嘿~")
                break
    else:
        sheet[cell_address] = "不是合并的单元格"

    output_path = f"test_output.xlsx"
    workbook.save(output_path)

write_xlsx("test.xlsx")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-1 08:54:24 | 显示全部楼层
网上找到的比较靠谱的办法 是先取消合并单元格   写入之后  再合并

还有一种是修改openpyxl的源代码  取消只读属性,不过这个貌似不怎么好弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 17:31:56 | 显示全部楼层    本楼为最佳答案   


可以对左上角赋值,这样就不会报错了~
import openpyxl

def write_xlsx(xlsx_file):
    workbook = openpyxl.load_workbook(xlsx_file)
    sheet = workbook['Sheet1']

    # 获取合并单元格信息
    merged_cells = sheet.merged_cells.ranges

    # 检查单元格是否为合并单元格,并对左上角单元格赋值
    cell_address = 'F5'
    if any([cell_address in merged_cell for merged_cell in merged_cells]):
        # 获取合并区域
        for merged_cell in merged_cells:
            if cell_address in merged_cell:
                # 对左上角单元格赋值
                top_left_cell = merged_cell.min_row, merged_cell.min_col
                sheet.cell(row=top_left_cell[0], column=top_left_cell[1], value="是合并的单元格,测试赋值,嘿嘿~")
                break
    else:
        sheet[cell_address] = "不是合并的单元格"

    output_path = f"test_output.xlsx"
    workbook.save(output_path)

write_xlsx("test.xlsx")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-2 10:00:38 | 显示全部楼层
大佬这个想法我马上去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-2 10:16:43 | 显示全部楼层
我试了,取消合并单元格后,还是写不进去
D:\PYTHON_NEW\pythonProject\.venv\Scripts\python.exe "D:\PYTHON_NEW\pythonProject\提取python excel\11增加单元格数据  测试生成管线对应的工艺卡的填充数据.py"
Traceback (most recent call last):
  File "D:\PYTHON_NEW\pythonProject\提取python excel\11增加单元格数据  测试生成管线对应的工艺卡的填充数据.py", line 87, in <module>
    copy_template_to_new_file(pipeline_number, template_file, target_folder)
  File "D:\PYTHON_NEW\pythonProject\提取python excel\11增加单元格数据  测试生成管线对应的工艺卡的填充数据.py", line 60, in copy_template_to_new_file
    sheet3['C8'] = 11
    ~~~~~~^^^^^^
  File "D:\PYTHON_NEW\pythonProject\.venv\Lib\site-packages\openpyxl\worksheet\worksheet.py", line 317, in __setitem__
    self[key].value = value
    ^^^^^^^^^^^^^^^
AttributeError: 'MergedCell' object attribute 'value' is read-only

Process finished with exit code 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-2 10:37:16 | 显示全部楼层
 workbook_new = load_workbook(new_file_path)

          for sheet3 in workbook_new:
              #sheet_name.cell(8,1,"好的")
              #sheet_name.cell(9,1,"不好")
              if 'H' in sheet3.title:
                #sheet3['C8'] = "11"
                #sheet3['C9'] = "12"
                sheet3.cell(8,3).value = "985"
                sheet3.cell(9, 3).value = "211"

          workbook_new.save(new_file_path)

代码通过了,我估计之前的错误是因为我把SHEETNAME IN WS.SHEETNAMES的方法取得名字和命名单元格的方法WS.CELL(I,J).VALUE混用了导致报错
改为sheet in wb  sheet.title取名字就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 00:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表