小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python帶格式拆分excel表單,copy庫功不可沒

 我的人生寶庫 2019-12-15

python拆分excel表單,將每個表單生成單獨的excel文件,網上這方面的文章很多。但是,有個細節(jié)鮮有人講,那就是如讓拆分后表格樣式與原表一致,不需拆分后手動設置。我們先看看帶格式拆分和不帶格式拆分的效果對比。

原表樣式:

python帶格式拆分excel表單,copy庫功不可沒

不帶格式拆分:

python帶格式拆分excel表單,copy庫功不可沒

帶格式拆分效果:

python帶格式拆分excel表單,copy庫功不可沒

對比效果一目了然,那么問題來了,如何實現python帶格式拆分表單呢?用copy庫是重點:

調用選擇文件對話框,選擇要拆分的文件

最初,寫了個將當前文件夾下的excel文件進行拆分功能。但實際使用時,總是復制生成的exe文件到文件夾,也很麻煩。于是優(yōu)化為調用文件對話框,選擇指定文件的方式,更符合日常習慣。

import tkinter.filedialog as a # 導入調用文件對話框的庫import osimport openpyxlimport copyif __name__ == '__main__': ff = a.askopenfilenames(filetypes=[('excel文件', '.xlsx')]) # 限定為只能選.xlsx文件 breakfile(ff) # 調用分解模塊進行分解

分解模塊代碼:


def breakfile(fn):    g = os.path.split(fn[0])[0]    for gg in fn:        g1 = os.path.splitext(os.path.split(gg)[1])[0]        wb = openpyxl.load_workbook(gg)    if len(wb._sheets) > 1:        for sht in wb._sheets:            wb1 = openpyxl.Workbook()            ws1 = wb1._sheets[0]            copyfile(sht, ws1)            f1 = os.path.join(g, g1 + '-' + sht.title + '.xlsx')            wb1.save(f1)

其中:save語句不能忘,不然看不到結果。


復制寫入單元格

def copyfile(sht, sht1): colwidth(sht, sht1) rowheight(sht, sht1) copycell(sht, sht1) for merg in sht.merged_cells: sht1.merge_cells(str(merg))

其中:for循環(huán)語句為根據原表合并單元格區(qū)域,將新表也設置相應的合并單元格。


根據原表設置新表列寬

def colwidth(s0, s1):    for k, co in enumerate(s0.iter_cols()):        k = chr(k+97).upper()        lk = s0.column_dimensions[k].width        if lk == 0:            lk = 8.38        s1.column_dimensions[k].width = lk

其中:if語句為當原表列寬為默認時,值為8.38,但系統(tǒng)顯示為0,所以要進行設置,當發(fā)現系統(tǒng)顯示列寬為0,則將值強制賦值為8.38,再對新表列寬進行設置。沒有這句整表設置列寬都無效。


根據原表設置新表行高

def rowheight(s0, s1): for i in range(1, s0.max_row+1): hg = s0.row_dimensions[i].height if hg == 0: hg = 15 s1.row_dimensions[i].height = hg

其中:if語句作用同上。

for循環(huán)用range(1, s0.max_row+1),若用設置列寬時for循環(huán)的

for k, co in enumerate(s0.iter_cols()):,會造成最后一行行高漏設置。


根據原表設置新表單元格值和格式

def copycell(s0, s1):    for i, row in enumerate(s0.iter_rows()):        for j, cell in enumerate(row):            s1.cell(i+1, j+1, cell.value)            s1.cell(i+1, j+1).number_format = cell.number_format            s1.cell(i+1, j+1).alignment = copy.copy(cell.alignment)            s1.cell(i+1, j+1).font = copy.copy(cell.font)            s1.cell(i+1, j+1).border = copy.copy(cell.border)            s1.cell(i+1, j+1).fill = copy.copy(cell.fill)

其中:s1.cell(i+1, j+1, cell.value):設置單元格值一致

s1.cell(i+1, j+1).number_format = cell.number_format:設置數據格式一致

s1.cell(i+1, j+1).alignment = copy.copy(cell.alignment):設置對齊方式一致

s1.cell(i+1, j+1).font = copy.copy(cell.font):設置字體一致

s1.cell(i+1, j+1).border = copy.copy(cell.border):設置表框線條一致

s1.cell(i+1, j+1).fill = copy.copy(cell.fill):設置單元格填充色一致

前面兩項,值和數據格式不需用copy庫,直接賦值即可。但其他字體、對齊方式、線框、顏色等不能直接賦值,要用copy才行。網上也查到過用copy代碼的文章,可惜的是,沒說全,我依葫蘆畫瓢寫出來不行。原因就是前面必須提前導入copy庫,所以第一段代碼里就有import copy語句。


生成exe文件后,運行效果:

python帶格式拆分excel表單,copy庫功不可沒

擴展功能:

根據該方法,可實現根據某個表格樣式,批量設置多個表格樣式的功能。

附錄完整代碼:

import tkinter.filedialog as aimport osimport openpyxlimport copydef colwidth(s0, s1): for k, co in enumerate(s0.iter_cols()): k = chr(k+97).upper() lk = s0.column_dimensions[k].width if lk == 0: lk = 8.38 s1.column_dimensions[k].width = lkdef rowheight(s0, s1): for i in range(1, s0.max_row+1): hg = s0.row_dimensions[i].height if hg == 0: hg = 15 s1.row_dimensions[i].height = hgdef copycell(s0, s1): for i, row in enumerate(s0.iter_rows()): for j, cell in enumerate(row): s1.cell(i+1, j+1, cell.value) s1.cell(i+1, j+1).number_format = cell.number_format s1.cell(i+1, j+1).alignment = copy.copy(cell.alignment) s1.cell(i+1, j+1).font = copy.copy(cell.font) s1.cell(i+1, j+1).border = copy.copy(cell.border) s1.cell(i+1, j+1).fill = copy.copy(cell.fill)def copyfile(sht, sht1): colwidth(sht, sht1) rowheight(sht, sht1) copycell(sht, sht1) for merg in sht.merged_cells: sht1.merge_cells(str(merg))def breakfile(fn): g = os.path.split(fn[0])[0] for gg in fn: g1 = os.path.splitext(os.path.split(gg)[1])[0] wb = openpyxl.load_workbook(gg) if len(wb._sheets) > 1: for sht in wb._sheets: wb1 = openpyxl.Workbook() ws1 = wb1._sheets[0] copyfile(sht, ws1) f1 = os.path.join(g, g1 + '-' + sht.title + '.xlsx') wb1.save(f1)def prfont(fn): for f in fn: wb = openpyxl.load_workbook(f) ws = wb.active fon = ws.cell(2, 3).font print(fon)if __name__ == '__main__': ff = a.askopenfilenames(filetypes=[('excel文件', '.xlsx')]) breakfile(ff)

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多