#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import openpyxl
from openpyxl.reader.excel import load_workbook
from openpyxl.styles.borders import Border, Side
import yaml
import jpype
class ExcelToImage:
# 设置EXCEL表格为全边框
BORDER = Border(
left=Side("thin", "FF000000"),
right=Side("thin", "FF000000"),
top=Side("thin", "FF000000"),
bottom=Side("thin", "FF000000"),
vertical=Side("thin", "FF000000"),
horizontal=Side("thin", "FF000000")
)
def __init__(self, cfg):
self.file_in = cfg['file_in']
self.file_out = cfg['file_out']
self.capture_area = cfg['capture_area']
self.pic_dir = cfg['pic_dir']
self.pic_type = cfg['pic_type']
def excel_cell_border(self, file_in, capture_area, file_out):
""" 将需要截图的区域设置边框并另存为其他文件 .
:param file_in: 用于截图的EXCEL文件
:param capture_area: 截图区域 {'Sheet1': ['B2:O11']}
:param file_out: 截图区域设置边框后的输出文件
"""
'''
#案例模板
file_in = 'demo.xlsx'
capture_area = {'Sheet1': ['B2:O11', 'B17:O26']}
capture_area = {'Sheet2': ['B2:C5']}
file_out = r'D:\excel_to_img_java\datas\tmps\demo_out.xlsx'
'''
# 加载EXCEL文件
wb = openpyxl.load_workbook(file_in)
# 设置边框
for key_sheet, value_cellarea in capture_area.items():
sheet = wb[key_sheet] # 获取sheet表
for area in value_cellarea:
start, end = area.split(":")
for row in sheet[start:end]:
for cell in row:
cell.border = self.BORDER
# 另存为其他文件
wb.save(file_out)
def excel_screenshot(self, file_name, capture_area, pic_dir,pic_type):
""" 使用excel.jar包进行截图 .
:param file_name: 截图的EXCEL文件
:param areas: 截图区域
:param pic_dir: 截图存储目录
:param pic_type: 图片类型 png jpg bmp
"""
# 设置参数
#file_name = r'D:\pythoncode\my_module\my_excel_to_image\datas\tmps\报表_out.xlsx'
#capture_area = {'Sheet1': ['B2:O11', 'B17:O26', 'B31:J39', 'U2:AJ12', 'T14:AE27', 'R30:AC39', 'AN3:AW11', 'AK15:AQ27', 'AI30:AX43']}
#pic_dir = 'datas/tmps'
#pic_type = 'png'
# 调用jar处理截图
jars = "lib/excel.jar"
jpype.startJVM(jpype.getDefaultJVMPath(),"-ea", "-Xmn128m", "-Xms512M", "-Xmx512M","-Djava.class.path={0}".format(jars))
#jpype.attachThreadToJVM() # 解决多线程问题
# java初始化配置
License = jpype.JClass("com.aspose.cells.License")
l = License()
l.setLicense("lib/license.xml")
Workbook = jpype.JClass("com.aspose.cells.Workbook")
ImageFormat = jpype.JClass("com.aspose.cells.ImageFormat")
ImageOrPrintOptions = jpype.JClass("com.aspose.cells.ImageOrPrintOptions")
SheetRender = jpype.JClass("com.aspose.cells.SheetRender")
# 实例化工作簿
book = Workbook(file_name)
# 保存为html文件
#book.save("datas/out.html",12)
# 设置图片质量
imgOptions = ImageOrPrintOptions()
imgOptions.setQuality(100)
imgOptions.setOnePagePerSheet(True)
#设置分辨率
imgOptions.setHorizontalResolution(800)
imgOptions.setVerticalResolution(600)
# 设置图片格式
if pic_type == 'jpg':
imgOptions.setImageFormat(ImageFormat.getJpeg())
elif pic_type == 'png':
imgOptions.setImageFormat(ImageFormat.getPng())
elif pic_type == 'bmp':
imgOptions.setImageFormat(ImageFormat.getBmp())
CalculationOptions = jpype.JClass(
"com.aspose.cells.CalculationOptions")
opt = CalculationOptions()
sheet_ct = 1
for dic_key, dic_value in capture_area.items():
# 获取sheet
sheet = book.getWorksheets().get(dic_key)
# 对sheet中的公式进行计算
sheet.calculateFormula(opt, True)
# 设置区域
pageSetup = sheet.getPageSetup()
# 去掉边距
pageSetup.setBottomMargin(0.)
pageSetup.setLeftMargin(0.)
pageSetup.setRightMargin(0.)
pageSetup.setTopMargin(0.)
# 区域
for index, area in enumerate(dic_value):
pageSetup.setPrintArea(area)
sr = SheetRender(sheet, imgOptions)
for page in range(sr.getPageCount()):
# Generate an image for the worksheet
if index > 8: # 比如index = 9
index = index * 10 # 9*10 = 90 +1 ==91,92,93
sr.toImage(page, os.path.join(pic_dir, "%d.%s" %(sheet_ct*10+(index+1),pic_type)))
sheet_ct = sheet_ct + 1
jpype.shutdownJVM() # 不要关闭否则第二次无法启动
def run(self):
# 1.获取参数
file_in = self.file_in
file_out = self.file_out
capture_area = self.capture_area
pic_dir = self.pic_dir
pic_type = self.pic_type
# 2.对截图Sheet设置边框,并另存为文件
#self.excel_cell_border(file_in, capture_area, file_out)
# 3.对指定区域截图
self.excel_screenshot(file_in, capture_area, pic_dir,pic_type)
if __name__ == '__main__':
cfg = {}
cfg["file_in"] = 'data_report.xlsx'
cfg["file_out"] = 'datas/tmps/data_report_out.xlsx'
cfg["capture_area"] = {'Sheet1': ['B10:P36']}
cfg["pic_dir"] = 'datas/tmps'
cfg["pic_type"] = 'png'
ss = ExcelToImage(cfg)
ss.run()