您好,登錄后才能下訂單哦!
如何在python中使用openpyxl實(shí)現(xiàn)帶格式復(fù)制表格?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
有合并單元格的,先把合并單元格復(fù)制過去,合并單元格用wm=list(zip(wbsheet.merged_cells))得出合并單元格列表,把其中的(<CellRange A1:A4>,) 替換成為A1:A4格式
再從新表中合并單元格
再用.has_style: #拷貝格式 測試是否有格式,再復(fù)制格式和數(shù)據(jù)
其中:
font(字體類):字號、字體顏色、下劃線等
fill(填充類):顏色等
border(邊框類):設(shè)置單元格邊框
alignment(位置類):對齊方式
number_format(格式類):數(shù)據(jù)格式
protection(保護(hù)類):寫保護(hù)
import os #找文件目錄 import win32com.client as win32 #操作excel文件 from tqdm import tqdm #進(jìn)度條顯示 from openpyxl import load_workbook # 讀取時導(dǎo)入這個 from openpyxl.styles import Font, Alignment #設(shè)置單元格格式 from openpyxl.utils import get_column_letter, column_index_from_string from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font from copy import copy path=input('輸入整理前原始路徑: ') if path=="": path=os.getcwd() xlsx_lists=[] xls_lists=[] for file in os.listdir(path): filename=os.path.join(path,file) if os.path.isfile(filename): #是目錄 if filename.endswith(".xls"): xls_lists.append(filename) if filename.endswith(".xlsx"): xlsx_lists.append(filename) source_file='原始數(shù)據(jù).xlsx' if os.path.exists(os.path.join(os.getcwd(),source_file)): os.remove(os.path.join(os.getcwd(),source_file)) choose="1" excel = win32.gencache.EnsureDispatch('Excel.Application') # while choose not in "1|2": # choose =input("xls轉(zhuǎn)為xlsx:1 xlsx轉(zhuǎn)為xls:2 ") if choose=="1": with tqdm(total=len(xls_lists),desc='寫文件數(shù) ',leave=True,unit='個',unit_scale=True,mininterval=0.5,bar_format=None) as pbar: for xls_list in xls_lists: pbar.update(1) wb = excel.Workbooks.Open(xls_list) wb.SaveAs(xls_list+"x", FileFormat = 51) #FileFormat = 51 is for .xlsx extension wb.Close() #FileFormat = 56 is for .xls extension pbar.close() else: with tqdm(total=len(xls_lists),desc='寫文件數(shù) ',leave=True,unit='個',unit_scale=True,mininterval=0.5,bar_format=None) as pbar: for xlsx_list in xlsx_lists: pbar.update(1) wb = excel.Workbooks.Open(xlsx_list) wb.SaveAs(xlsx_list[0:len(xlsx_list)-1], FileFormat = 56) #FileFormat = 51 is for .xlsx extension wb.Close() pbar.close() excel.Application.Quit() tag_file='拆分后表.xlsx' totaldata=pd.DataFrame() writer=pd.ExcelWriter(tag_file) totaldata.to_excel(writer, 'sheet') writer.save() book = load_workbook(tag_file) #能寫入已存在表中 wb = load_workbook('原始數(shù)據(jù).xlsx') for sheet in wb.sheetnames: print(sheet) wbsheet=wb[sheet] for num in range(3): name=wbsheet.cell(1,num*15+10).value wbsheet_new = book.create_sheet(name,0) wm=list(wbsheet.merged_cells) #開始處理合并單元格形式為“(<CellRange A1:A4>,),替換掉(<CellRange 和 >,)' 找到合并單元格 #print (list(wm)) if len(wm)>0 : for i in range(0,len(wm)): cell2=str(wm[i]).replace('(<CellRange ','').replace('>,)','') #print("MergeCell : %s" % cell2) wbsheet_new.merge_cells(cell2) for rows in range(40): wbsheet_new.row_dimensions[rows+1].height = wbsheet.row_dimensions[rows+1].height for col in range(14): wbsheet_new.column_dimensions[get_column_letter(col+1)].width = wbsheet.column_dimensions[get_column_letter(col+1)].width wbsheet_new.cell(row=rows+1,column=col+1,value=wbsheet.cell(rows+1,num*15+col+1).value) if wbsheet.cell(rows+1,num*15+col+1).has_style: #拷貝格式 wbsheet_new.cell(row=rows+1,column=col+1).font = copy(wbsheet.cell(rows+1,num*15+col+1).font) wbsheet_new.cell(row=rows+1,column=col+1).border = copy(wbsheet.cell(rows+1,num*15+col+1).border) wbsheet_new.cell(row=rows+1,column=col+1).fill = copy(wbsheet.cell(rows+1,num*15+col+1).fill) wbsheet_new.cell(row=rows+1,column=col+1).number_format = copy(wbsheet.cell(rows+1,num*15+col+1).number_format) wbsheet_new.cell(row=rows+1,column=col+1).protection = copy(wbsheet.cell(rows+1,num*15+col+1).protection) wbsheet_new.cell(row=rows+1,column=col+1).alignment = copy(wbsheet.cell(rows+1,num*15+col+1).alignment) wb.close() book.save('拆分后表.xlsx') book.close()
上例中,因?yàn)橐岩粋€表拆分為三個,所以要循環(huán)三次
補(bǔ)充:python-excel 之帶有格式及合并單元格樣式的表格復(fù)制
代碼如下:
from openpyxl import load_workbook def copy_excel(totle_excel,totle_sheetname,down_excel,down_sheetname): down = load_workbook(down_excel) totle = load_workbook(totle_excel) totle_sheet = totle[totle_sheetname] down_sheet = down[down_sheetname] # 兩個for循環(huán)遍歷整個excel的單元格內(nèi)容 for i, row in enumerate(down_sheet.iter_rows()): for j, cell in enumerate(row): totle_sheet.cell(row=i + 1, column=j + 1, value=cell.value) totle.save(totle_excel)
關(guān)于如何在python中使用openpyxl實(shí)現(xiàn)帶格式復(fù)制表格問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。