打印A4数据 引用easyExcel模板实现

Y.实现功能

1).批量数据填充
2).批量数据超过范围实现分页
3).不同类型数据引用不同模板
4).每页模板需插入特定数据条形码图片
5).分页实现引用多sheet方法实现
6).excel转pdf用于打印

Y. pom引用包

<!-- easyExcel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.5</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version>
</dependency><!--条形码-->
<dependency><groupId>e-iceblue</groupId><artifactId>spire.barcode.free</artifactId><version>2.6.2-RELEASE</version>
</dependency>
<!--pdf-->
<dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>8.5.2-RELEASE</version>
</dependency><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf</artifactId><version>4.8.1-RELEASE</version>
</dependency>
E. 模板配置


excel样例

S.实现代码
S-Y. excel合并单元格

继承AbstractMergeStrategy

public class ExcelMergeStrategy extends AbstractMergeStrategy {@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {if(relativeRowIndex==null ||relativeRowIndex==0){return;}int rowIndex = cell.getRowIndex();int colIndex = cell.getColumnIndex();sheet=cell.getSheet();Row preRow = sheet.getRow(rowIndex - 1);Cell preCell = preRow.getCell(colIndex);//获取上一行的该格List<CellRangeAddress> list = sheet.getMergedRegions();CellStyle cs = cell.getCellStyle();cell.setCellStyle(cs);for (int i = 0; i < list.size(); i++) {CellRangeAddress cellRangeAddress = list.get(i);if (cellRangeAddress.containsRow(preCell.getRowIndex()) && cellRangeAddress.containsColumn(preCell.getColumnIndex())) {int lastColIndex = cellRangeAddress.getLastColumn();int firstColIndex = cellRangeAddress.getFirstColumn();CellRangeAddress cra = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex(), firstColIndex, lastColIndex);sheet.addMergedRegion(cra);return;}}}}
S-E. 工具类

1). 生成条形码 barCodeUtil

/*** 生成条形码(类型=Code_128)* params barCodeString 生成条形码字符串* params widht 图宽* params height 图高* params showText 是否展示条形码下方字符串* @return 条形码的byte[]*/
@SneakyThrows
public static ByteArrayOutputStream barcodeImageToOutPutStream(String barCodeString, Integer widht, Integer height,Boolean showText) {BarcodeSettings settings = new BarcodeSettings();settings.setType(BarCodeType.Code_128);settings.setData(barCodeString);settings.setShowText(showText);settings.setShowTextOnBottom(true);
//        settings.setImageHeight(1.32f);
//        settings.setImageWidth(6.4f);settings.setAutoResize(true);//设置边框不可见settings.hasBorder(false);BarCodeGenerator barCodeGenerator = new BarCodeGenerator(settings);BufferedImage bufferedImage = barCodeGenerator.generateImage();if (height != null && widht != null) {bufferedImage = resize(bufferedImage, height, widht);}
//        String uuidString = UUID.randomUUID().toString();
//        File file = new File(uuidString + ".png");
//        ImageIO.write(bufferedImage,"png",file);
//        return file;ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "png", outputStream);
//        byte[] bytes = outputStream.toByteArray();
//        outputStream.close();//        String a = BarcodeScanner.scanOne(new ByteArrayInputStream(outputStream.toByteArray()));return outputStream;}

2). List分组 ListUtil
切分数组转成 List<List>

 /*** 将集合按len数量分成若干个list* @param list* @param len 每个集合的数量* @return*/
public static <T> List<List<T>> splitList(List<T> list, int len) {if (list == null || list.size() == 0 || len < 1) {return null;}List<List<T>> result = new ArrayList<List<T>>();int size = list.size();int count = (size + len - 1) / len;for (int i = 0; i < count; i++) {List<T> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));result.add(subList);}return result;
}/*** @param list* @return*/
public static <T> List<List<T>> averageAssign(List<T> list,int n){List<List<T>> result=new ArrayList<List<T>>();int remaider=list.size()%n;  //(先计算出余数)int number=list.size()/n;  //然后是商int offset=0;//偏移量for(int i=0;i<n;i++){List<T> value=null;if(remaider>0){value=list.subList(i*number+offset, (i+1)*number+offset+1);remaider--;offset++;}else{value=list.subList(i*number+offset, (i+1)*number+offset);}result.add(value);}return result;
}

3). 生成Pdf PdfUtil
excel转pdf

public class PdfUtil {public static boolean getLicense1() {boolean result = false;try {InputStream is = PdfUtil.class.getClassLoader().getResourceAsStream("license.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下com.aspose.cells.License aposeLic = new com.aspose.cells.License();aposeLic.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** excel转pdf 默认为a4纸大小* @param excelFileName * @param pdfFileName* @return*/public static Boolean excelToPdf(String excelFileName, String pdfFileName) {// 验证License 若不验证则转化出的pdf文档会有水印产生if (!getLicense1()) {return false;}try {//文件操作File file = new File(pdfFileName); // 新建一个空白pdf文档FileOutputStream os = new FileOutputStream(file);Workbook wb = new Workbook(excelFileName);// 原始excel路径FileOutputStream fileOS = new FileOutputStream(file);wb.save(fileOS, com.aspose.cells.SaveFormat.PDF);fileOS.close();return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** excel转pdf * @param excelFileName * @param pdfFileName* @param paperSizeType  纸张大小* @return*/public static Boolean excelToPdfV2(String excelFileName, String pdfFileName,int paperSizeType) {// 验证License 若不验证则转化出的pdf文档会有水印产生if (!getLicense1()) {return false;}try {//文件操作File file = new File(pdfFileName); // 新建一个空白pdf文档FileOutputStream os = new FileOutputStream(file);Workbook wb = new Workbook(excelFileName);// 原始excel路径int pageSize = wb.getWorksheets().getCount();for (int i = 0; i < pageSize; i++) {Worksheet worksheet = wb.getWorksheets().get(i);worksheet.getPageSetup().setPaperSize(paperSizeType);}FileOutputStream fileOS = new FileOutputStream(file);wb.save(fileOS, com.aspose.cells.SaveFormat.PDF);fileOS.close();return true;} catch (Exception e) {e.printStackTrace();}return false;}}
public String printPickingOrders(List<ServiceOrderPo> params) {// 第一页数量int firstNum = ServiceOrderConstants.ExcelValue.firstNum;// 平均数量int avgNum = ServiceOrderConstants.ExcelValue.avgNum;//excel模板String templateFileName = "C:\\Users\\Administrator\\Desktop\\excel\\模板.xlsx";File file = new File(templateFileName);// 定义模板sheet数量AtomicInteger num = new AtomicInteger(2);@Cleanup XSSFWorkbook workbook = new XSSFWorkbook(inputStream);//设置sheetNo1的模板名称 用于记录workbook.setSheetName(0, "模板1");//设置sheetNo2的名称 用于记录workbook.setSheetName(1, "模板2");@Cleanup XSSFWorkbook finalWorkbook = workbook;// 页数AtomicInteger size = new AtomicInteger(0);// sheet名后缀AtomicInteger sheetNum = new AtomicInteger(1);serviceOrderPos.forEach(serviceOrderPo -> {// 明细列表数据List<EntrustItemPo> entrustItemPos = entrustItemMap.get(serviceOrderPo.getServiceNo());if (CollectionUtils.isEmpty(entrustItemPos))return;// 当前单页数int pageSize = (entrustItemPos.size() - firstNum) > 0 ? (entrustItemPos.size() - firstNum) / avgNum + 2 : 1;// 3).不同类型数据引用不同模板  根据需求克隆sheet模板for (int i = 0; i < pageSize; i++) {if (!serviceOrderPo.getCrossBorderFlag()) {finalWorkbook.cloneSheet(1, "sheet" + (sheetNum.get()));} else {finalWorkbook.cloneSheet(0, "sheet" + (sheetNum.get()));}sheetNum.getAndIncrement();}for (int i = 0; i < pageSize; i++) {XSSFDrawing patriarch = finalWorkbook.getSheetAt(size.get() + 2).createDrawingPatriarch();// 生成条形码ByteArrayOutputStream barCodeImageFile = ExcelUtil.barcodeImageToOutPutStream(serviceOrderPo.getServiceNo(), 280, 80, false);//放置条形码位置XSSFClientAnchor anchor = new XSSFClientAnchor();if (!serviceOrderPo.getCrossBorderFlag()) {anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 5, 2, (short) 7, 3);} else {anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 5, 2, (short) 6, 3);}// 插入条形码patriarch.createPicture(anchor, finalWorkbook.addPicture(barCodeImageFile.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));size.getAndIncrement();}});// 删除模板sheet并 写入流finalWorkbook.removeSheetAt(1);finalWorkbook.removeSheetAt(0);ByteArrayOutputStream bos = new ByteArrayOutputStream();finalWorkbook.write(bos);byte[] bArray = bos.toByteArray();@Cleanup InputStream byteArrayInputStream = new ByteArrayInputStream(bArray);// 填充数据ExcelWriter  excelWriter =EasyExcel.write(filePath).withTemplate(byteArrayInputStream).registerWriteHandler(new ExcelMergeStrategy()).build();FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();serviceOrderPos.forEach(serviceOrderPo -> {// 明细列表数据List<EntrustItemPo> entrustItemPos = entrustItemMap.get(serviceOrderPo.getServiceNo());if (CollectionUtils.isEmpty(entrustItemPos))return;// 切分数据 新增多sheet分页List<List<EntrustItemPo>> groupList = ListUtil.splitList(entrustItemPos, avgNum);for (int i = 0; i < groupList.size(); i++) {WriteSheet writeSheet = EasyExcel.writerSheet("sheet" + (num.get() - 1)).build();writeSheet.setSheetNo(num.get() - 2);//填充到表头数据Map map = new HashMap<String, Object>();map.put("orderIdOut", serviceOrderPo.getRelationCode());map.put("billLadingNo", serviceOrderPo.getBillLadingNo());map.put("inStoreNo", String.join("\n", serviceNoMap.get(serviceOrderPo.getServiceNo())));map.put("serviceNo", serviceOrderPo.getServiceNo());map.put("printDate", printDate);map.put("currentSize", i + 1);map.put("pageSize", groupList.size());// 统计数据AtomicReference<Integer> totalPackageNumber = new AtomicReference<>(0);AtomicReference<BigDecimal> totalWeight = new AtomicReference<>(new BigDecimal(BigInteger.ZERO));AtomicReference<BigDecimal> totalVolume = new AtomicReference<>(new BigDecimal(BigInteger.ZERO));entrustItemPos.forEach(po -> {totalPackageNumber.updateAndGet(v -> v + po.getEntrustNum());totalVolume.set(totalVolume.get().add(Objects.isNull(po.getEntrustVolume()) ? BigDecimal.ZERO : po.getEntrustVolume()));totalWeight.set(totalWeight.get().add(Objects.isNull(po.getEntrustWeight()) ? BigDecimal.ZERO : po.getEntrustWeight()));});if (i == groupList.size() - 1) {map.put("totalData", "汇总数据");map.put("totalPackageNumber", totalPackageNumber.toString());map.put("totalWeight", String.valueOf(totalWeight));map.put("totalVolume", String.valueOf(totalVolume));map.put("tray", "托盘数量");map.put("trayNumber", entrustItemPos.size());}// 列表数据List<Map<String, Object>> paramsList = new ArrayList<>();groupList.get(i).forEach(detail -> {Map<String, Object> paramsMap = new MapUtils().put("stagingAreaCode", Objects.nonNull(stagingAreaMap.get(detail.getTrayNo())) ? stagingAreaMap.get(detail.getTrayNo()).getStagingAreaCode() : null).put("trayNo", detail.getTrayNo()).put("packageNumber", detail.getEntrustNum()).put("weight", detail.getEntrustWeight()).put("volume", detail.getEntrustVolume()).put("goldjetTrayFlag", detail.getGoldjetTrayFlag()).put("createTime", stagingAreaMap.get(detail.getTrayNo()).getCreateTime().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));paramsList.add(paramsMap);});excelWriter.fill(map, writeSheet);excelWriter.fill(paramsList, fillConfig, writeSheet);num.getAndIncrement();}});excelWriter.finish();// excel转pdfStirng pdfPath="C:\\Users\\Administrator\\Desktop\\excel\\"+UUID.randomUUID().toString().replace("-","")+".pdf";PdfUtil.excelToPdf(fileName, pdfPath);System.out.println(pdfPath);File file = new File(filePath);if (file.exists() && file.isFile()) {file.delete();}return null;
}

easyExcel应用相关推荐

  1. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel

    java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  2. easyexcel怎么设置表头宽度_easyexcel 自动设置列宽

    com.alibaba easyexcel 2.1.4 导出controller层代码 @RequestMapping("/download") public void downl ...

  3. Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...

  4. 史上最全的Excel导入导出(easyexcel版)

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/qq_32258777/article/details/89031479 喝水不忘挖井人,感谢阿里 ...

  5. easyexcel导入时读不到数据_EasyExcel简单使用--导入excel数据

    读Excel 1.依赖包 com.alibaba easyexcel 2.0.5 2.代码import java.io.File; import com.alibaba.excel.EasyExcel ...

  6. easyexcel工具类_阿里巴巴程序员常用的 15 款开发者工具

    从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展. 阿里巴巴将自身在各类业务场景下的技术积淀,通过开源.云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具, ...

  7. Apache POI和EasyExcel 第七集:EasyExcel的基本操作,读取和写入Excel,一行足矣

    Apache POI和EasyExcel 第七集:EasyExcel的基本操作,读取和写入Excel,一行搞定 一.资源 在这里设置lombok会遇到一个问题,以前在springboot那里都没遇到, ...

  8. Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式

    Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式 一.资源 代码实现中的带有计算公式的Excel(xls) 链接:https://pan.bai ...

  9. Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据

    Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据 一.资源 什么是Apache POI Apache POI 不同类型的数据的表格(xls) 链接: ...

  10. Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls、07版的xlsx)

    Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls.07版的xlsx) 一.资源 一个十分好用的日期类型处理包,和Java8搭配使用非常好 ...

最新文章

  1. Windows Azure Storage论文解读
  2. 重新想象 Windows 8 Store Apps (59) - 锁屏
  3. java mongo分组统计_探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics
  4. 物联网linux_Linux的未来,Google的物联网标准等
  5. docker存储--理解镜像文件系统aufs/device mapper、主机存储共享、容器间存储共享、分布式存储Flocker
  6. android在搭建框架时要注意,Android开发搭建应用框架步骤和注意的问题
  7. try-expect在集合处理中的应用
  8. 贝叶斯学派与频率学派有何不同?
  9. uniapp中获取元素页面信息的方法
  10. Win10家庭版禁用系统更新方法汇总及问题解决
  11. Golang8小时基础入门
  12. win10用win7的图片查看器
  13. Houdini14:动画入门
  14. 从契约演进看区块链的变革性
  15. java 文件下载示例_文件下载示例代码(JAVA)
  16. VScode写Go代码引用的包报错飘红
  17. iOS 保存图片到手机的几种方法--(OC)
  18. AJAX如何将参数带到并传给另一个页面?
  19. 随机宏基因组测序数据质量控制和去宿主的分析流程和常见问题
  20. python2.x 默认编码问题

热门文章

  1. YDOOK :STM32 : 什么是波特率?波特率Baudrate 的定义
  2. 「自然语言处理(NLP)」神经机器翻译(NMT)论文整理(一)
  3. 口语机器翻译(ST)相关算法、论文、数据集、代码库等资源分享
  4. 第3-7课:推箱子游戏
  5. CamStudiomdash;mdash;优秀免费的屏幕录像软件
  6. 计算Hausdorff distance MATLAB代码
  7. 波士顿房价分析作业总结
  8. woff字体文件怎么用到html,【webpack】font-awesome加载不到woff字体文件
  9. 软件项目管理 第12讲 软件项目跟踪
  10. ssas连接mysql_Web服务器(Websphere、Tomcat)使用olap4j连接多维数据库(Ssas)