学习了一段时间的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()