

在日常工作中,我们需要打印各种各样的excel文件,像是这样的文件,我们需要合理地进行页面打印区间,才可以得到一份完美的打印稿,哐哐哐!!化身为一只疯狂的打印鸡


那么你在打印时,肯定见过他们这些婀娜的姿态,对于办公软件老手的我们来说,这是基础操作了,分页预览下拉一拉又或者打印缩放调一调,但是现在是自动化的时代,那么我们应该如何应对呢

立马开始实战环节,我们需要对如下表单进行打印,通过分页预览我们可以清楚的了解到,它被默认分成了两页,熟练工的我们立马反应过来,手动拉一下调整为一页,那如果我们收到了很多诸如此类的文件呢?

我们直接上代码说,我们需要使用的包还是我们熟悉的openpyxl
代码部分:
import openpyxl
def function_excel(excel_path):
excel_file = openpyxl.load_workbook(excel_path)
all_sheets = excel_file.sheetnames #获取sheet页名称
for i in all_sheets:
sheetTmp = excel_file[i] # 获取工作表
sheetTmp.sheet_properties.pageSetUpPr.fitToPage = True # 自适应页面宽度
sheetTmp.page_setup.fitToHeight = False #无限制
sheetTmp.page_setup.fitToWidth = 1
excel_file.save(excel_path)这段代码帮助我们实现根据EXCEL内容将分页高度不限制,将宽度压缩到一页范围内,page_setup.fitToHeight属性值对应打印页面的页宽的设定,同理page_setup.fitToWidth对应页高,我们根据我们需求进行设置,但是这里我们需要注意一下,当文件内容量少的时候,设置过多的页宽/高是不会生效的,如果需要这样的划分该怎么办呀?别担心,继续往下看,慢慢道来

刚才上面我们也提到了,只是去调整页宽或者页高有时候,当页面内容过少时并不能完成我们的设定需求,例如我们对这组数据进行设置为3页宽,忽略页高进行设置,实际是不生效的,那么对于这类情况我们该如何进行设置呢

同样先上代码部分,根据内容按分块数进行划分:
import openpyxl
import re
from openpyxl.utils import column_index_from_string, get_column_letter
def function_excel(excel_path):
excel_file = openpyxl.load_workbook(excel_path)
all_sheets = excel_file.sheetnames #获取sheet页名称
for i in all_sheets:
sheetTmp = excel_file[i] # 获取工作表
count = sheetTmp.dimensions # 获取工作表已使用范围
# 划分区域
count_list = re.findall(r'\\d+', str(count))
last_column_name = re.findall(r':([A-Z]+)', str(count))
last_column_index = column_index_from_string(last_column_name[0])
split_num = 3 # 需要分块个数
temp = int(last_column_index/split_num)
start = 1
area_list = []
for j in range(1, split_num+1):
area_temp = str(get_column_letter(start)) + str(count_list[0]) + ":"
start += temp
if j == split_num:
area_temp = area_temp + str(last_column_name[0]) + str(count_list[1])
else:
area_temp = area_temp + str(get_column_letter(start)) + str(count_list[1])
start += 1
area_list.append(area_temp)
area = ",".join(area_list)
if temp != 0:
sheetTmp.print_area = area # 设置打印区域
else:
print("数据不足以分成{}块".format(split_num))
excel_file.save(excel_path)我们如果想要实现打印区域自由划分,主要是使用print_area方法进行设置,上述代码主要是分为两部分,一部分计算得出我们需要划分的块区,另一部分设置,即按照如下格式传入:
sheetTmp.print_area = "A1:D26,E1:H26,I1:K26"但是这里我们需要注意了,当我们运行完代码后,我们会得到一个这样的结果(如图)它和我们最终想要得到的效果其实是不符合的

这里我们就需要了解一下了,在Excel的“分页预览”页面中,虚线是 Excel 自动添加的分页符, 实线是手动添加的分页符,所以其实我们代码运行完添加手动分页符时,保留了原来的自动分页符

所以这里我也给出我的解决方案,很暴力的先将分页调整为一页宽,然后再进行区域的设置,添加的代码如下:
if temp != 0:
sheetTmp.sheet_properties.pageSetUpPr.fitToPage = True
sheetTmp.page_setup.fitToHeight = False
sheetTmp.page_setup.fitToWidth = 1
sheetTmp.print_area = area # 设置打印区域
else:
print("数据不足以分成{}块".format(split_num))这样子我们得到的结果就是我们需要的了(如下)我们可以看到我们已经正确地将分页设置好了

我们除了可能会遇到的打印范围设置以外,还会遇到一些其他参数的设置,例如文档整体太长时我们需要设置打印的方向等等
import openpyxl
def function_excel(excel_path, sheet_name):
excel_file = openpyxl.load_workbook(excel_path)
sheetTmp = excel_file[sheet_name]
sheetTmp.page_setup.orientation = "portrait" # 设置为纵向打印
sheetTmp.page_setup.orientation = "landscape" # 设置为横向打印2. 页面顺序
sheetTmp.page_setup.pageOrder = "downThenOver" # 打印顺序先列后行
sheetTmp.page_setup.pageOrder = "overThenDown" # 打印顺序先行后列3. 纸张大小选择
sheetTmp.page_setup.paperSize = '11' # A5纸
通过查看源码,可以获取对应的配置
# Paper size
PAPERSIZE_LETTER = '1'
PAPERSIZE_LETTER_SMALL = '2'
PAPERSIZE_TABLOID = '3'
PAPERSIZE_LEDGER = '4'
PAPERSIZE_LEGAL = '5'
PAPERSIZE_STATEMENT = '6'
PAPERSIZE_EXECUTIVE = '7'
PAPERSIZE_A3 = '8'
PAPERSIZE_A4 = '9'
PAPERSIZE_A4_SMALL = '10'
PAPERSIZE_A5 = '11'四、总结
讲了这么多关于打印区间的设置,来补充一个进一步的打印操作吧,这里介绍一个打印实现方式,代码如下:
import win32api
win32api.ShellExecute(0, "print", r"文件地址", None, ".", 0)
# 注:需要安装拓展pywin32通过设置好对应的文件地址,就可以实现我们默认的打印机进行文件的打印啦
看到这里你就可以结合使用影刀获取内容所在行列等指令去获取设置所需的参数,愉快地设置excel打印区域了,来搭建一个属于自己的打印工作流吧~