AttributeError : ‘MergedCell‘ object attribute ‘value‘ is read-only

网上搜到的都是说改openpyxl的worksheet.py源码,

加了这几句:

        min_col,min_row,max_col,max_row=cr.bounds
        for row in range(min_row,max_row+1):
             for col in range(min_col,max_col+1):
                 if col==min_col and row ==min_row:
                     continue
                 del self._cells[(row,col)]

我改了,发现没有效果,后来经过研究,可以通过以下两种办法来解决。

我的问题是需要写入第14,15列,然后每一行都有可能是合并过的,如果是合并过行,按照原先的直接赋值就会报错。

办法一:

判断第13列是否为None或者为""即可

    filePath="E:\\test\\download\\交易明细表-20240530165233.xlsx"
    # 用openpyxl读取数据
    # 打开工作簿,整个xlsx文件是一个workbook,然后包含多个sheet
    workbook = openpyxl.load_workbook(filePath)
    worksheet = workbook['sheet1']
    rowCount = list(worksheet.rows).__len__()
    print(f"rowCount={rowCount}")
    rowIndex = 1
    while rowIndex < rowCount:
        rowIndex+=1
        print(f"开始循环抽查交易明细第{rowIndex}行")
        expressUrl="testurl"
        expressStatus="teststatus"
        # 物流查询网站,excel从1开始

        cell13 = worksheet.cell(row=rowIndex, column=13)
        orderNo=cell13.value
        #必须判断前一行是否为None或者为"",否则因为合并过会导致写入失败
        # AttributeError : 'MergedCell' object attribute 'value' is read-only
        if orderNo:
            cell14 = worksheet.cell(row=rowIndex, column=14)
            cell14.value=expressUrl+str(rowIndex)
            cell15 = worksheet.cell(row=rowIndex, column=15)
            cell15.value=expressStatus+str(rowIndex)
    workbook.save(filePath)
    workbook.close()

办法二:

先取消所有的合并,数据写入后再合并

    merged_cell_range = list(worksheet.merged_cells.ranges)
    merged_cell_N = [cell for cell in merged_cell_range if cell.coord[0] == 'N']
    cellCount=merged_cell_N.__len__()
    for merged_cell in merged_cell_N:
            min_col, min_row, max_col, max_row = merged_cell.bounds  # 获取合并单元格的边界
            # 取消合并
            worksheet.unmerge_cells(str(merged_cell))

循环写入值之后,

  cell14 = worksheet.cell(row=rowIndex, column=14)
  cell14.value=expressUrl+str(rowIndex)
  cell15 = worksheet.cell(row=rowIndex, column=15)
  cell15.value=expressStatus+str(rowIndex)

再合并

    for merged_cell in merged_cell_N:
        min_col, min_row, max_col, max_row = merged_cell.bounds  # 获取合并单元格的边界
        # 重新合并
        worksheet.merge_cells(start_row=min_row, start_column=min_col, end_row=max_row, end_column=max_col)

最后再保存

workbook.save(filePath)
workbook.close()
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值