浅谈openpyxl库,遇到批量合并单元格的问题
我就废话不多说了,大家还是直接看代码吧~
fromopenpyxlimportWorkbook fromopenpyxlimportload_workbook fromopenpyxl.stylesimportNamedStyle,Border,Side,Alignment #创建一个工作薄 wb=Workbook() #创建一个工作表(注意是一个属性) table=wb.active #excel创建的工作表名默认为sheet1,一下代码实现了给新创建的工作表创建一个新的名字 table.title='test' #合并C1D1 #法一 #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个单元格' #法一不适合批量添加 foriinrange(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'objectattribute'hyperlink'isread-only]
我尝试改用delete直接删除,然而这种方法只能删除内容,格式还是被锁定的。
找了很久没有结局方法,只好慢慢看源码。
大概是说,接触合并后,代码默认其他单元格应该是空值且不能被赋新值,也许是因为觉得解开只有要再合并??(不明白设疑初衷)
处理方法如下,大概思想是格式化该单元格的属性,即取消的read_only属性。
大概在源码的中workshet.py文件的大约620做添加如下代码:(#autho...开始,大家自己对照源码添加吧~~~)
........................ ifcr.coordnotinself.merged_cells: raiseValueError("Cellrange{0}isnotmerged".format(cr.coord)) self.merged_cells.remove(cr) #DeletestheMergedCellRange. #delself._merged_cell_range[cr.bounds] #autho:watson #aim:dealwiththebugaboutumerger #describe:Addthefollowingfivelinesofcodetoformattheattribute. min_col,min_row,max_col,max_row=cr.bounds forrowinrange(min_row,max_row+1): forcolinrange(min_col,max_col+1): ifcol==min_colandrow==min_row: continue delself._cells[(row,col)] defappend(self,iterable): """Appendsagroupofvaluesatthebottomofthecurrentsheet. ........................
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。