有合并单元格的,先把合并单元格复制过去,合并单元格用wm=list(zip(wbsheet.merged_cells))得出合并单元格列表,把其中的(<CellRange A1:A4>,) 替换成为A1:A4格式
再从新表中合并单元格
再用.has_style: #拷贝格式 测试是否有格式,再复制格式和数据
其中:
font(字体类):字号、字体颜色、下划线等
fill(填充类):颜色等
border(边框类):设置单元格边框
alignment(位置类):对齐方式
number_format(格式类):数据格式
protection(保护类):写保护
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
import os #找文件目录 import win32com.client as win32 #操作excel文件 from tqdm import tqdm #进度条显示 from openpyxl import load_workbook # 读取时导入这个 from openpyxl.styles import Font, Alignment #设置单元格格式 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 = '原始数据.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转为xlsx:1 xlsx转为xls:2 ") if choose = = "1" : with tqdm(total = len (xls_lists),desc = '写文件数 ' ,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 = '写文件数 ' ,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( '原始数据.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() |
上例中,因为要把一个表拆分为三个,所以要循环三次
补充:python-excel 之带有格式及合并单元格样式的表格复制
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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循环遍历整个excel的单元格内容 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) |
代码说明:
文件内容是从down_excel的down_sheetname复制到totle_excel的totle_sheetname
说明:
以上代码可以将格式以及合并单元格的样式均复制到另一张表
注意:
如果你是跨excel文件的复制且带有公式,不建议使用
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/weixin_45903952/article/details/105151210