1.引入依赖(非必选)
<!--通用组件 pgc-->
<dependency>
<groupId>com.github.mrpangu</groupId>
<artifactId>hzero-plus</artifactId>
<version>0.0.10.RELEASE</version>
</dependency>
2.RTF基础模板
不带图片
变量使用BI Publisher进行填充
3.流程
1.通过标准RTF模板和数据生成第一版Excel。
2.在第一版Excel上面通过POI添加自定义动态图片
4.学习XSSFClientAnchor
// 获取图片需要放置的位置
/*
* XSSFClientAnchor 参数
* @param dx1 左上侧所在单元格里面左上角X坐标
* @param dy1 左上侧所在单元格里面左上角Y坐标.
* @param dx2 右下侧所在单元格里面左上角X坐标.
* @param dy2 右下侧所在单元格里面左上角Y坐标.
* @param col1 图片左侧所在col
* @param row1 图片上侧所在row
* @param col2 图片由侧所在col
* @param row2 图片下侧所在row
* */
XSSFClientAnchor anchor= new XSSFClientAnchor(0, 0, 255, 255,
(short) 17, 30+size*2, (short) 22, 33+size*2);
5.相关代码
/**
* @param partFalg 区分标识,箱单传1,发票传2
* @param invoiceNum
* @param response
* @throws IOException
* @throws InvalidFormatException
*/
@ApiOperation(value = "下载箱单发票")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/invoice/download")
public void downloadFile(
@ApiParam(value = "箱单发票标识", required = true)
@RequestParam("partFalg")
Long partFalg,
@ApiParam(value = "发票号", required = true)
@RequestParam("invoiceNum")
String invoiceNum,
HttpServletResponse response
) throws IOException, InvalidFormatException {
log.info("------------------------开始下载---------------------");
// 下载生成的文件名
String fileName = null;
// 判断是生成箱单还是生成发票
if (ObjectUtil.equal(partFalg, 1L)) {
fileName = StrUtil.format("{}-Packing List.xlsx", invoiceNum);
} else {
fileName = StrUtil.format("{}-Invoice.xlsx", invoiceNum);
}
// 获取带放置图片URL数据
log.info("-----------------------箱单发票号为:{}--------------------------", invoiceNum);
ExportListinvoiceHead listinvoiceHead = new ExportListinvoiceHead();
listinvoiceHead.setInvoiceNum(invoiceNum);
ExportListinvoiceHead exportListinvoiceHead = exportListinvoiceHeadRepository.selectOne(listinvoiceHead);
Long headId = exportListinvoiceHead.getHeadId();
log.info("----------------------箱单发票headId为:{}----------------------", headId);
List<ExportListinvoiceLine> exportListinvoiceLines = exportListinvoiceLineRepository.selectByHeadId(headId);
int size = exportListinvoiceLines.size();
log.info("----------------------需要显示的行数:{}------------------------", size);
Long unitId = exportListinvoiceHead.getUnitId();
log.info("------------------------组织ID为:{}----------------------", unitId);
Dict dict = CommonUtils.getCompanyInfoByOrgId(unitId);
String sealUrl = dict.getStr("seal_url");
Assert.notNull(sealUrl, "公司的印章不存在!");
log.info("------------------------下载的URL为:{}-------------------------------", sealUrl);
// 配置下载相关的属性,对response做处理
DownLoadUtil.configDownload(response, fileName);
//输出流
ServletOutputStream outputStream = response.getOutputStream();
byte[] reportFile = null;
// 通过feign调用,获取报表生成的Excel文件
if (ObjectUtil.equal(partFalg, 1L)) {
reportFile = reportRomoteService.getInvoiceReportFile(BaseConstants.DEFAULT_TENANT_ID,
"8104d77fc80d4ef691128dabe3051c4c",
"XLSX",
invoiceNum,
"HCTM_EXPORT_LISTINVOICE",
"zh_CN"
);
} else if (ObjectUtil.equal(partFalg, 2L)) {
reportFile = reportRomoteService.getInvoiceReportFile(BaseConstants.DEFAULT_TENANT_ID,
"5feeb1cad29642e4aae7c937f3d0753f",
"XLSX",
invoiceNum,
"HCTM_EXPORT_INVOICE",
"zh_CN"
);
}
// 将生成的报表字节数组写入临时文件
// 创建临时文件
File file = new File("/data/temp/invoiceTemp.xlsx");
log.info("----------------------成功创建临时文件------------------------");
try {
// 将字节写入临时文件中
FileUtil.writeBytes(reportFile, file);
log.info("----------------------成功写入临时文件中------------------------");
// POI处理EXCEL放置图片
XSSFWorkbook workBook = new XSSFWorkbook(file);
// sheet 1工作表
Sheet sheetAt = workBook.getSheetAt(0);
//获取工作表名称
String sheetName = sheetAt.getSheetName();
log.info("工作表名称:" + sheetName);
//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
XSSFDrawing patriarch = (XSSFDrawing) sheetAt.createDrawingPatriarch();
// 获取图片需要放置的位置
/*
* XSSFClientAnchor 参数
* @param dx1 左上侧所在单元格里面左上角X坐标
* @param dy1 左上侧所在单元格里面左上角Y坐标.
* @param dx2 右下侧所在单元格里面左上角X坐标.
* @param dy2 右下侧所在单元格里面左上角Y坐标.
* @param col1 图片左侧所在col
* @param row1 图片上侧所在row
* @param col2 图片由侧所在col
* @param row2 图片下侧所在row
* */
XSSFClientAnchor anchor = null;
if (ObjectUtil.equal(partFalg, 1L)) {
anchor = new XSSFClientAnchor(0, 0, 255, 255,
(short) 17, 30+size*2, (short) 22, 33+size*2);
} else if (ObjectUtil.equal(partFalg, 2L)) {
anchor = new XSSFClientAnchor(0, 0, 255, 255,
(short) 15, 30+size*2, (short) 20, 33+size*2);
}
anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
InputStream inputStream = URLUtil.getStream(URLUtil.toUrlForHttp(sealUrl));
try {
patriarch.createPicture(anchor, workBook.addPicture(inputStream, XSSFWorkbook.PICTURE_TYPE_PNG));
workBook.write(outputStream);
} finally {
inputStream.close();
outputStream.close();
}
} finally {
// 删除临时文件
FileUtil.del(file);
log.info("--------------------------临时文件删除成功------------------------------");
}
}