学习了一段时间的python了,第一次用来解决现实问题代码使用需要修改部分代码才能实现功能后期再完善吧,下面我们就来聊聊关于表格自动调整行高大小?接下来我们就一起去了解一下吧!
表格自动调整行高大小
学习了一段时间的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 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()