昨天帮朋友处理一个Excel打印时分页问题,因为他这个表格内容很多,一共有4万条数据,人工分页会比较困难。相信大家也经常会碰到这种需求:样例表格如下,在打印时候要保证标题行和内容行不断开。
经过对比,采用宏并不是很便利,最后决定用Python脚本来处理,具体代码如下:
# 导入所需模块,主要是openpyxl,该模块仅支持xlsx格式需注意
import openpyxl
from openpyxl.worksheet.pagebreak import Break
# 加载需要处理的文档,大家可根据自己情况替换掉下面地址addr
addr='C:\\Users\\Desktop\\XXx.xlsx'
wb = openpyxl.load_workbook(addr)
# 加载文档中需要处理的表格对象,这里以名字为“c”的表格为例
ws1 = wb.get_sheet_by_name("c")
# 定义两个列表,初始加入0,后面用来存储 累加的行高和分页行号
row_high= []
row_high.append(0)
breaky =[]
breaky.append(0)
# ws1.max_row为表格中最大行号,下面遍历所有行
for i in range(ws1.max_row):
# row_high存储累计行高
row_high.append(row_high[-1]+ws1.row_dimensions[i+1].height)
# 判断第i行累计行高-上一次分页时累计行高
# 457.6是当前页面去除上下页边距后高度的磅值
# 我这里页面是A4横向(21x27),上下页边距均为2.5,剩下页面内容高度为16厘米,Excel中1厘米约为28.6磅,16x28.6=457.6
if row_high[i+1]-row_high[breaky[-1]] >457.6 :
# 再判断,将最接近的偶数行加入breaky列表
if i%2==0:
breaky.append(i)
else :
breaky.append(i-1)
# 从ws1.page+breaks中提取横向和纵向分页两个变量
next_page_horizon, next_page_vertical = ws1.page_breaks
# 遍历breaky列表,将分页行加入横向分页变量
for br in breaky:
next_page_horizon.append(Break(br))
# 将更改保存到指定文件
wb.save('C:\\Users\\1Desktop\\C.xlsx')
print("转换完毕!!!")
通过以上脚本可实现在最接近每页的偶数行后插入分页符,openpyxl使用中存在一些问题,如果发现列表索引错误,可能是部分行高无法获取,格式刷将对应行刷一下就好。如果说单个表格数据量特别巨大,可能会出现保存后出现文件无法正常打开的情况,此时可以将表格分为两部分来分页。