element 表格单元格内容不换行_实例29_在Word表格中将上下行相同内容的单元格自动合并...
實(shí)例28講了如何在Excel文件中自動(dòng)合并上下行相同內(nèi)容的單元格,此例則講一講如何在Word文件中做類似的操作。因?yàn)樘幚鞥xcel和Word的模塊是不同的,所以合并單元格也有一些差異。相對(duì)來(lái)說(shuō),Word中的操作更麻煩一些。
在Excel中,我們手動(dòng)合并單元格后,合并的單元格中只保留1個(gè)值,而Word則全部保留。比如在word中,3個(gè)單元格的內(nèi)容都是“ABC”,合并之后就變成了“ABCABCABC”,這顯然不是我們想要的。下圖是原始文檔,要求將第2列和第3列中,上下相鄰單元格內(nèi)容一樣的合并。
還是先定義合并單元格函數(shù),以便后續(xù)多次調(diào)用。由于處理Word中表格的代碼與處理Excel不同,所以函數(shù)也要做微調(diào)。主要變化就是合并的函數(shù)表達(dá),對(duì)于word中的表格,表達(dá)式是table.cell(row1,col1).merge(table.cell(row2,col2)),意思是將第row1行col1列到row2行col2列之間的表格合并(row2,col2要分別大于等于row1和col1)。需要注意的是cell(0,0)表示第一行第一列的單元格,以此類推。如下函數(shù)是在例28的基礎(chǔ)上修改的。
#定義合并單元格的函數(shù) def Merge_cells(table,target_list,start_row,col):'''table: 是需要操作的表格target_list: 是目標(biāo)列表,即含有重復(fù)數(shù)據(jù)的列表start_row: 是開(kāi)始行,即表格中開(kāi)始比對(duì)數(shù)據(jù)的行(需要將標(biāo)題除開(kāi))col: 是需要處理數(shù)據(jù)的列'''start = 0 #開(kāi)始行計(jì)數(shù)end = 0 #結(jié)束行計(jì)數(shù)reference = target_list[0] #設(shè)定基準(zhǔn),以列表中的第一個(gè)字符串開(kāi)始for i in range(len(target_list)): #遍歷列表if target_list[i] != reference: #開(kāi)始比對(duì),如果內(nèi)容不同執(zhí)行如下reference = target_list[i] #基準(zhǔn)變成列表中下一個(gè)字符串end = i - 1 table.cell(start+start_row,col).merge(table.cell(end+start_row,col))start = end + 1if i == len(target_list) - 1: #遍歷到最后一行,按如下操作end = itable.cell(start+start_row,col).merge(table.cell(end+start_row,col))然后需要讀取word中相應(yīng)表格里的數(shù)據(jù),并提取出來(lái),以便作為是否合并的判斷基礎(chǔ)。使用Document打開(kāi)word文檔,先查看一下其中表格的個(gè)數(shù),以便我們鎖定要處理的表格。由于word里面可能有隱藏表格,或者一個(gè)表格中有一段去掉了邊框,讓人看起來(lái)像是兩個(gè)表格,直接在word中去數(shù)表格個(gè)數(shù)有時(shí)會(huì)不靠譜。
通過(guò)len(doc.tables)看到,這個(gè)文檔里面有2個(gè)表格。打開(kāi)word文檔,我們可以看到要處理的表格是第一個(gè),即doc.tables[0]。如果情況較為復(fù)雜,我們可以打印表格中第一行單元格的內(nèi)容進(jìn)一步確認(rèn)是否是我們需要處理的表格。確認(rèn)好表格的序號(hào)后,就可以開(kāi)始讀取內(nèi)容了。
from docx import Document doc = Document("收貨記錄.docx") print("這個(gè)工作表有 {} 個(gè)表格。n".format(len(doc.tables))) #查看表格中的個(gè)數(shù),以便鎖定我們要處理的表格print("第一個(gè)表格的第一行的單元格中的內(nèi)容如下:") for i in doc.tables[0].rows[0].cells: #讀取第一個(gè)表格的第一行的單元格中的內(nèi)容print(i.text) 》 這個(gè)工作表有 2 個(gè)表格。第一個(gè)表格的第一行的單元格中的內(nèi)容如下: 序號(hào) 供應(yīng)商名稱 貨物編碼 貨物型號(hào) 貨物說(shuō)明 數(shù)量 日期#讀取word文檔中的第一個(gè)表格的第二和第三列除標(biāo)題和尾部總數(shù)行的數(shù)據(jù) doc = Document("收貨記錄.docx") table = doc.tables[0] #已確定是第一個(gè)表格,其索引是0 supplier = [] #存儲(chǔ)供應(yīng)商名稱 pn = [] #存儲(chǔ)物料編碼 max_row = len(table.rows) #獲取第最大一行 print("表格共有{}行".format(max_row))#讀取第二行到29行,第2,3列中的數(shù)據(jù) for i in range(1,max_row-1):supplier_name = table.rows[i].cells[1].text #cells[1]指表格第二列supplier.append(supplier_name)for i in range(1,max_row-1):material_pn = table.rows[i].cells[2].text #cells[2]指表格第三列pn.append(material_pn)print("獲取到{}個(gè)供應(yīng)商名稱,{}個(gè)物料編碼。".format(len(supplier),len(pn)))>> 表格共有30行 獲取到28個(gè)供應(yīng)商名稱,28個(gè)物料編碼。以上程序,獲取了表格中第2列和第3列的數(shù)據(jù),并存入了列表supplier和pn。然后就可以開(kāi)始判斷,并合并單元格了。下面調(diào)用之前定義好的函數(shù)Merge_cells,傳入相應(yīng)的參數(shù),運(yùn)行即可完成單元格合并。
Merge_cells(table,supplier,1,1) #開(kāi)始合并行為2,索引為1;供應(yīng)商名稱是在2列,索引為1 Merge_cells(table,pn,1,2) #開(kāi)始合并行為2,索引為1;物料編碼是在3列,索引為2 doc.save("檢查.docx")到這一步,合并單元格算是完成了,但結(jié)果如下圖所示,原單元格中的內(nèi)容全部集中在一起,造成了重復(fù)內(nèi)容。我們需要重寫(xiě)這些單元格以覆蓋掉重復(fù)的內(nèi)容,即可得到我們想要的結(jié)果。
#重新往第2和第3列寫(xiě)入數(shù)據(jù),以覆蓋之前重復(fù)的數(shù)據(jù) for row in range(1,len(supplier)+1):table.cell(row,1).text = supplier[row-2]table.cell(row,2).text = pn[row-2] doc.save("收貨記錄-合并單元格.docx")為什么寫(xiě)入合并單元格的時(shí)候,也是將合并之前的每個(gè)單元格都寫(xiě)了一次(比如寫(xiě)入“供應(yīng)商HH”到第二行第1到6列的時(shí)候,寫(xiě)入了6次),為什么不會(huì)造成重復(fù)內(nèi)容呢?是因?yàn)槊繉?xiě)一次,就將原來(lái)的內(nèi)容清空了。最終結(jié)果如下,目標(biāo)達(dá)成!
如果您有需要處理的問(wèn)題,可發(fā)郵件到我郵箱:donyo@qq.com,一起探討解決方案。
以上在Jupyter notebook上完成,所用到的代碼及Excel 資料已上傳GitHub及百度網(wǎng)盤(pán), 歡迎下載到本地隨意玩。
Python版本:Python 3.6 64bit
操作系統(tǒng):Windows 7
GitHub:Office_Automation_by_Using_Python
百度Pan:“pan.baidu”加上“.com/s/1WXcoYts_uNJmccfJ0lrmWg” 提取碼: kry7
WeiXin:Python操作Office軟件高效工作
總結(jié)
以上是生活随笔為你收集整理的element 表格单元格内容不换行_实例29_在Word表格中将上下行相同内容的单元格自动合并...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql慢sql增加读写分离_MySQ
- 下一篇: mongodb查询不带表名_原创 | M