自动调整整个表格行高

学习了一段时间的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 = '$' + str(rg_title_row) + ':$' + 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 + 1while i <= c[0]: st.cells(i, 1).row_height = st.cells(i, 1).row_height + c[1]/zoom #从rv是缩小比列之后的增加量,需要放大到缩小前增加量,除以缩放比列 i += 1#调整其它页面,每页包含表头r = c[0] + 1while 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 = nwb.save()app.quit()

推荐阅读