自动调整表格行高到铺满每一页纸张(excel如何调整行高自动打满一页)

小编:迷魂雪 更新时间:2022-10-06

学习了一段时间的python了,第一次用来解决现实问题。代码使用需要修改部分代码才能实现功能。后期再完善吧!

#功能:自动调整表格行高到铺满每一页纸张,让中间的页面不出现大面积空白地带! # 最近这年把,接到的调整表格打印格式的任务有点多,每次的表格动不动就几十上百页,每次都调一大晚上,眼睛都快瞎了。 # 我实在是不能忍,WPS又没有自带这个功能,用VBA应该比较简单。但是最近在学Python,好吧,就它了,开干! # 缺点就是需要部署环境:Python3.X,安装xlwings模块。 # 2022-4-7至2022-4-9,花了我三天时间,终于实现了基本功能,实例应用的时候需要修改部分代码, # 这个后面再完善喽,搞成适应于所有实例的代码,给它干到VBA里面去。 #=========================================思路=============================================================== # '''第一步,设置纸张方向、规格等,设置页边距 # 第二步,代码上场;设置纸张类型、页边距 # 第三步,自适应行高;表头栏及之前行自适应行高后+X # 第四步,获取表头栏行高之和 # 第五步,从第一行开始计算行高,直到行高之和大于纸张高度减去上下页边距之和(返回值Y) # 第六步,调整第一页行高,第一页行高,表头栏及之前行高不调整,剩下的行高调整到自适应行高+(Y-表头栏及之前行高之和)/剩下的行数 # 第七步,调整第二页及之后的行高,表头栏不调整,调整方法参照第六步''' #PS:循环开始前限制循环在第一行至最后一栏数据行,先获取最后一行行号 import xlwings as xw #导入Xlwigns模块 #======================================自定义函数区========================================================== Unit_conv = 0.03527 #单位换算,1磅=0.03527厘米 #1.纸张规格,输入纸张大小及方向确定纸张高度(单位:磅) def paper_specifications(paper_size = "A4", paper_direction = "shu"): paper = {"A0":(841, 1189), "A1":(594, 841), "A2":(420, 594), "A3":(297, 420), "A4":(210, 297)} paper1 = paper[paper_size] if paper_direction == "shu": paper_height = paper1[1]/(10*Unit_conv) else: paper_height = paper1[0]/(10*Unit_conv) return(paper_height) #2.表头及之前行高调整并返回相应值,输入表头行号 def title_h(rg_title_row): t_height_sum = 0 i = 1 while i <= rg_title_row: st.cells(i,1).rows.autofit() st.cells(i,1).row_height = st.cells(i,1).row_height + 15 t_height_sum = t_height_sum + st.cells(i,1).row_height #表头及之前行高之和 i += 1 rg_title_rh = st.cells(rg_title_row,1).row_height #表头行高 return([t_height_sum, rg_title_rh]) #3.累加行高之和直至超出页面,输入表头高度、上下页边距、开始行号、最后行号、缩放比例、纸张高度,返回当前页最后一行行号以及每行需要增加的行高值 def ad_page(rg_title_rh, page_up, page_down, rg_row, rg_lastrow, zoom, paper_height): ts = 0 i = rg_row while i <= rg_lastrow: st.cells(i,1).rows.autofit() ts = ts + st.cells(i,1).row_height if ((rg_title_rh+ts)*zoom + page_up + page_down) >= paper_height: break i += 1 r = i - 1 ts1 = 0 n = rg_row while n <= r: ts1 = ts1+st.cells(n,1).row_height n += 1 rx = paper_height - ((rg_title_rh+ts1)*zoom + page_up + page_down) rv = rx/(r - rg_row + 1) return([r, rv]) #=====================================参数输入区==================================================================== rg_title_row = int(input("请输入表头行号:")) page_up = float(input("请输入上页边距(厘米):"))/Unit_conv #单位:磅 page_down = float(input("请输入下页边距(厘米):"))/Unit_conv #单位:磅 zoom = float(input("请输入缩放比例:")) #在0——1之间取值 #打开表格并获取最后一行数据行号 app = xw.App(visible=True, add_book=False) wb = app.books.open(r'G:\desktop\rowheight_test.xlsx') #工作表路径,,实例中需要手动修改代码 st = wb.sheets("城南街道") #工作表选择,实例中需要手动修改代码 rg_lastrow = st.used_range.last_cell.row #获取表格最后一栏数据 st.api.PageSetup.Zoom = zoom*100 #设置打印页面缩放比例 print_title = '#39; + str(rg_title_row) + ':#39; + str(rg_title_row) st.api.PageSetup.PrintTitleRows = print_title #设置打印标题栏(表头) #====================================开工吧!小代码!!!==================================================================== a = paper_specifications(paper_size="A4", paper_direction="heng") #获取纸质规格并存在变量a内 b = title_h(rg_title_row) #调整表头栏及之前栏目的行高并存储行高值在列表b内 #调整第一页 c = ad_page(b[0], page_up, page_down, rg_title_row + 1, rg_lastrow, zoom, a) i = rg_title_row + 1 while i <= c[0]: st.cells(i, 1).row_height = st.cells(i, 1).row_height + c[1]/zoom #从rv是缩小比列之后的增加量,需要放大到缩小前增加量,除以缩放比列 i += 1 #调整其它页面,每页包含表头 r = c[0] + 1 while r <= rg_lastrow: c1 = ad_page(b[1], page_up, page_down, r , rg_lastrow, zoom, a) n = r while n <= c1[0]: st.cells(n, 1).row_height = st.cells(n, 1).row_height + c1[1]/zoom #rv是缩小比列之后的增加量,需要放大到缩小前增加量,除以缩放比列 n += 1 r = n wb.save() app.quit()