淺談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. ........................
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Python openpyxl模塊學習之輕松玩轉Excel
- 詳解Python操作Excel之openpyxl
- Python Excel處理庫openpyxl詳解
- Python使用openpyxl復制整張sheet
- Python 操作 Excel 之 openpyxl 模塊