浅谈openpyxl库,遇到批量合并单元格的问题

我就废话不多说了,大家还是直接看代码吧~

from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import NamedStyle, Border, Side, Alignment 

# 创建一个工作薄
wb = Workbook()

# 创建一个工作表(注意是一个属性)
table = wb.active

# excel创建的工作表名默认为sheet1,一下代码实现了给新创建的工作表创建一个新的名字
table.title = 'test'

# 合并C1 D1
# 法一
# table.merge_cells('C1:D1')
# table.cell(row = 1,column = 3,value = 'pdf/mp3链接')
# 法二
table.merge_cells(start_row=1, start_column=3, end_row=1, end_column=4)
table.cell(1, 3).value = '合并2个单元格'
# 法一不适合批量添加
for i in range(2,10):
 table.merge_cells(start_row=i, start_column=3, end_row=i, end_column=4)

效果如下:

补充:python操作excel --openpyxl里的关于merge的一些bug

开始新的工作不久,工作内容依然是数据相关

新工作数据输出模式是用excel,大概是每天导出新数据并用excel体现,同时要保留之前的数据。

我来之前,同时写好了许多sql,然后就从Navicat里面复制粘贴到excel中。

我目前在做关于这个的自动化脚本,使用的库是openpyxl,下面说说关于这个的几个小bug。

1- 在 2.5.x版本中,当你合并单元格的时候

使用的是merge_cells(),然后,当你合并多个单元格的时候,之前合并的单元格的边框会消失。这个问题我再官网找到解决方案,稍有复杂,但是只要你更新到2.6.x版本,这个问题自动解决。

2- 2.6x版本中,使用unmerge_cell() 解开合并单元格后,除了左上角可以写入,其他被解开的单元格无法写入,会提示说 ‘read_only'这类的。

例如:你的 ("A1:D4") 是合并的,当你使用 work_sheet.unmerge_cell("A1:D4")后,会解开合并,

然后你却只能给A1赋值,不能给A2,A3,A4,B1....赋值,提示如下

=== > - Openpyxl ['MergedCell' object attribute 'hyperlink' is read-only]

我尝试改用delete直接删除,然而这种方法只能删除内容,格式还是被锁定的。

找了很久没有结局方法,只好慢慢看源码。

大概是说,接触合并后,代码默认其他单元格应该是空值且不能被赋新值,也许是因为觉得解开只有要再合并??(不明白设疑初衷)

处理方法如下,大概思想是格式化该单元格的属性,即取消的read_only属性。

大概在源码的中workshet.py文件的大约620做添加如下代码:(# autho...开始,大家自己对照源码添加吧~~~)

........................
 if cr.coord not in self.merged_cells:
  raise ValueError("Cell range {0} is not merged".format(cr.coord))

 self.merged_cells.remove(cr)
 # Deletes the MergedCellRange.
 # del self._merged_cell_range[cr.bounds]
 # autho : watson
 # aim : deal with the bug about umerger
 # describe : Add the following five lines of code to format the attribute.
 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)]

 def append(self, iterable):
 """Appends a group of values at the bottom of the current sheet.
........................ 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • python openpyxl模块的使用详解

    Python_Openpyxl 1. 安装 pip install openpyxl 2. 打开文件 ① 创建 from openpyxl import Workbook # 实例化 wb = Workbook() # 激活 worksheet ws = wb.active ② 打开已有 >>> from openpyxl import load_workbook >>> wb2 = load_workbook('文件名称.xlsx') 3. 储存数据 # 方式一:数据

  • python中openpyxl和xlsxwriter对Excel的操作方法

    前几天,项目中有个小需求:提供Excel的上传下载功能,使用模块:openpyxl 和 xlsxwriter,这里简单记录一下. 1.简介 Python中操作Excel的库非常多,为开发者提供了多种选择,如:xlrd. xlwt.xlutils.xlwings.pandas. win32com.openpyxl.xlsxwriter等等. 其中: 前三个一般混合使用,对Excel读写操作,适合旧版Excel,仅支持 xls 文件: win32com 库功能丰富,性能强大,适用于Windows:

  • python openpyxl筛选某些列的操作

    由于要复制excel 的某些单元格格式,需要对合并的单元格选出符合条件的 如下例是小于15的保留 然后在新表单中 wbsheet_new.merge_cells(cell2) wbsheet_new为新表单,cell2为筛选后保留的单元格,表达为I24:J24,K24:L24这样的格式 先正则筛选,筛选的结果为[('AO', 'AP')]这种list包含元组的表达方式,再用result[0][0]提取出第一个元素, 如果大于15列 column_index_from_string(result[

  • 详解Python openpyxl库的基本应用

    1.导入文件  wb(可自定义) = openpyxl.load_workbook(#输入文件位置#)  2.转换为可处理的对象  sheet(可自定义)= wb['表格中对应的那一张的名称'] 3.sheet.cell(row=i, column=j) .value 可以显示对应单元格的值 4.  wb.save['位置'] 保存表格 ''' # Created by Hailong Liu # for work # 2020.11.21 ''' import openpyxl #导入表格 w

  • python openpyxl 带格式复制表格的实现

    有合并单元格的,先把合并单元格复制过去,合并单元格用wm=list(zip(wbsheet.merged_cells))得出合并单元格列表,把其中的(<CellRange A1:A4>,) 替换成为A1:A4格式 再从新表中合并单元格 再用.has_style: #拷贝格式 测试是否有格式,再复制格式和数据 其中: font(字体类):字号.字体颜色.下划线等 fill(填充类):颜色等 border(边框类):设置单元格边框 alignment(位置类):对齐方式 number_format

  • 详解Python中openpyxl模块基本用法

    Python操作EXCEL库的简介 1.1 Python官方库操作excel Python官方库一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xlutils库复制和修改Excel文件,这三个库只支持到Excel2003. 1.2 第三方库openpyxl介绍 第三方库openpyxl(可读写excel表),专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易. 注意:如果文字编码是"gb2312" 读取后就会显示乱码,请

  • 解决使用openpyxl时遇到的坑

    最近在用python处理Excel表格是遇到了一些问题 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用 2, openpyxl 这个库, 在使用的时候一直报错, 看下面代码 from openpyxl import Workbook import datetime wb = Workbook() ws = wb.active ws['A1'] = 42 ws.append([1,2,3]) ws['A2'] = datetime.datetime.now() w

  • 浅谈openpyxl库,遇到批量合并单元格的问题

    我就废话不多说了,大家还是直接看代码吧~ from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.styles import NamedStyle, Border, Side, Alignment # 创建一个工作薄 wb = Workbook() # 创建一个工作表(注意是一个属性) table = wb.active # excel创建的工作表名默认为sheet1,一下代码实现了给新创建的工

  • 浅谈numpy库的常用基本操作方法

    NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数组,而这个一维数组中每个元素又是一个一维数组.所以这个一维数组就是NumPy中的轴(axes),而轴的数量--秩,就是数组的维数. 1.创建矩阵 Numpy库中的矩阵模块为ndarray对象,有很多属性:T,data, dtype,flags,flat,imag,real,size, itemsiz

  • 浅谈react.js 之 批量添加与删除功能

    最近做的CMS需要用到批量添加图片的功能:在添加文件的容器盒子内,有两个内容,分别是:添加按钮与被添加的选择文件组件. 结构分析: 被添加的组件,我们称为:UploadQiNiuFiles(七牛文件上传组件),含一个删除当前组件的删除按钮 添加按钮的事件 被添加组件存放的容器 做这个效果只需要明白三个方法的用途就OK: 直接绑定要删除组件的  deleteType(),它是调用删除index数量的方法  removeContent() //删除{qiniu}与{deleteQiNiu}内容,是把

  • Python批量合并有合并单元格的Excel文件详解

    合并单元格 合并单元格相信大家都会,比如下面这段简单的代码就可以实现: app='Word' word=win32.gencache.EnsureDispatch('%s.Application' % app) doc=word.Documents.Add() word.Visible=False #Title begin sel =word.Selection sel.Font.Name = u"微软雅黑" sel.Font.Size = 8 sel.Font.Bold = Fals

  • python使用openpyxl读取合并单元格的值

    目录 问题: 解决思路: 问题: 假设在test.xlsx的"Sheet1"工作表中,A1:D3区域的值如下: 要求给定指定的行.列以及对应的工作表作为参数,能够正确解析合并单元格,获取指定单元格的值. 如果直接根据行列获取对应单元格的值,则合并单元格非左上角的其他单元格都会获取到None值,如下: if __name__ == "__main__": wb = xl.load_workbook("test.xlsx") sheet_ = wb[

  • python之DataFrame实现excel合并单元格

    在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要根据A列的值,合并B.C列的对应单元格 pandas中的to_excel方法只能对索引进行合并,而xlsxwriter中,虽然提供有merge_range方法,但是这只是一个和基础的方法,每次都需要编写繁琐的测试才能最终调好,而且不能很好的重用.所以想自己写一个方法,结合dataframe和merge_range.大概思路是: 1.定义一个MY_DataFrame类,继承DataFrame类,这样能很

  • Python实现Excel自动分组合并单元格

    大家好,我们经常会有这样的需求.比如下图 我们需要把同一个省份的合并起来,如下图的效果 如何实现呢,这是原有的df 直观的操作是这样的: df.to_excel('test.xlsx',index=False) from openpyxl import load_workbook wb=load_workbook('test.xlsx') ws=wb.active() ws.merge_cells(start_row=2,end_row=8,start_column=1,end_column=1

  • Java导出Excel统计报表合并单元格的方法详解

    目录 前言 示例 注意事项 总结 前言 Apache POI是一种流行的API,允许程序员使用Java程序创建,修改和显示MS Office文件. 它是由Apache Software Foundation开发和分发的开源库,用于使用Java程序设计或修改Microsoft Office文件. 它包含将用户输入数据或文件解码为MS Office文档的类和方法. HSSF - 用于读取和写入MS-Excel文件的xls格式 示例 类似上面的需要合并表头的报表在日常的开发中也是经常遇到,这里总结下关

  • ASP.NET GridView 实现课程表显示(动态合并单元格)实现步骤

    GridView,ASP.NET中很常用的数据显示控件,这里,我将用这个控件来实现课程表的显示.首先说说课程表的显示与普通记录的显示有何不同?这里所说的普通记录是指直接从数据库中查询出来的.没有经过任何处理的记录.通常,我们用GridView显示这些普通记录,只需直接将这些记录表绑定到GridView中即可.但是,课程表的显示可不是这么简单,它需要将普通记录继续加工,需要根据记录中具体的数据来确定数据需要显示在哪一行.哪一列,而且需要根据课程开始时间和结束时间动态合并单元格,最后才是数据的显示.

  • JSP中动态合并单元格的实例代码

    废话不多说了,具体代码如下所示: <span style="font-size:14px;"> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <table width="100%" border="0" cellspacing="0" cellpadding="0&q

随机推荐