Java读取Excel模板并动态添加数据 您所在的位置:网站首页 怎么复制表格模板内容 Java读取Excel模板并动态添加数据

Java读取Excel模板并动态添加数据

2024-07-08 10:27| 来源: 网络整理| 查看: 265

​ 在项目开发中,会经常遇到报表的需求;遇到报表后,不可避免的会与Excel打交道。如果仅仅是将数据导出,我相信大多数人都能解决,通过poi、EasyExcel或者其他处理工具来进行文件的创建,并将数据写入文件。如果产品经理要求了复杂的表头,那真的很让人头大。如果我们能将Excel模板文件读入,并在指定的数据域中添加数据,那么这个问题就可以规避了。本文使用poi来进行Excel的操作,下面让我们一起来看下如何处理。

1.所需依赖文件

​ Java项目中想要使用Poi,需要引入相关jar包,其Maven仓库的依赖为:

org.apache.poi poi 3.17 org.apache.poi poi-ooxml 3.17

​ 如果不是maven项目,可以到Maven Repository中下载相应的jar包。

2.通过poi导出数据

​ 首先,我们来看下,通过poi是如何导出数据的。创建一个新的Excel,将数据导出的核心代码如下:

public String xxxx(List list) { //... try { // 创建excel HSSFWorkbook wk = new HSSFWorkbook(); // 创建一张工作表 HSSFSheet sheet = wk.createSheet(); // 设置列宽 sheet.setColumnWidth(0, 5000); // 创建一行(表头) HSSFRow row = sheet.createRow(0); // 创建第一行的第一个单元格 HSSFCell cell = row.createCell((short) 0); cell.setCellValue("序号"); cell = row.createCell((short)1); cell.setCellValue("订单号"); // 循环添加数据 for (short i=0;i log.info("导出Excel异常,异常信息为:【{}】", e.getMessage(), e); } //... } 3.加载模板并动态添加数据

​ 此功能主要分为三部分,1.加载模板;2.将数据动态插入到数据区域;3.将Excel文件存储或者发送给前端。

3.1模板文件的妙用

​ 通过加载模板的方式,我们就可以将复杂的表头设计的工作给跳过,想想都有点开心。博主在做需求时,模板如下所示:

资源分配图 ​ 虽然不算复杂,如果通过代码来设置,光是单元格的合并就感觉到头大。因此就想到是否能加载模板文件,并在数据域(第五行后)插入数据。 资源分配图

​ 如需要模板进行测试,可以通过此链接进行下载。

3.2核心代码

​ 代码逻辑并不复杂,不过博主在做的时候,也百度了一些文章,但是很尴尬,按照别人的代码来搞,加载了模板文件后,竟然把模板文件给损坏了,折腾了很久。一气之下,自己动手、丰衣足食。

资源分配图

​ 下面一起来看下代码,因为第二部分的代码是将Excel文件保存到文件目录中的,故此处的将文件发送给前端调用方。

/** * 将指定数据插入到模板文件中,并将文件发送给前端 * * @param stockInfoList 数据列表 * @param request * @param response * @return */ public void exportNoAcceptResult(List stockInfoList, HttpServletRequest request, HttpServletResponse response) { //1.加载Excel模板文件(文件路径按自己的存放路径填写) String fileName = "/Volumes/D/xxxx/export_template.xlsx"; File file = new File(fileName); log.info("待导出的数据记录:【{}】", stockInfoList.size()); System.out.println(fileName); XSSFSheet sheet = null; try (InputStream inputStream = new FileInputStream(file); XSSFWorkbook xwb = new XSSFWorkbook(inputStream)) { sheet = xwb.getSheetAt(0); assert sheet != null; XSSFCellStyle cellStyle = xwb.createCellStyle(); //设置单元格边框 cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); //设置居中 cellStyle.setAlignment(HorizontalAlignment.CENTER); //设置数据域 sheet.shiftRows(4, 4 + stockInfoList.size(), stockInfoList.size(), true, false); //2.遍历数据,将数据插入到数据域中 for (short i = 0; i log.error("下载Excel模板异常,异常信息为:【{}】", e.getMessage(), e); } }

​ 在上述方法中,只需将需要导出的数据、request、response传入,就可以完成Excel文件的创建与导出。需要注意的一点是,如果前端是通过form直接发起的请求,那么浏览器上就可以直接完成文件的下载;如果是通过ajax、axios或者其他方式,需要在前端进行下处理才能成功下载文件。具体如何操作,本文不再赘述。

3.3单元测试

​ 为了方便测试,本文将Excel文件保存到本地。测试代码如下:

package com.b2b2c; import java.io.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.b2b2c.model.dto.StockInfoResponse; import com.b2b2c.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.xssf.usermodel.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @Slf4j @SpringBootTest public class B2B2CmsApplicationTests { @Test public void contextLoads() { } /** * 将指定数据插入到模板文件中,并将文件发送给前端 * * @param stockInfoList 数据列表 * @return */ public void exportNoAcceptResult(List stockInfoList) { //1.加载Excel模板文件 //... try (InputStream inputStream = new FileInputStream(file); XSSFWorkbook xwb = new XSSFWorkbook(inputStream)) { //... //3.将Excel文件保存到本地(此处进行了修改) String timeStr = DateUtils.getFormatDate(new Date(), "yyyy-MM-dd-HH"); String filename = "/Volumes/D/logs/" + timeStr + ".xls"; // 将Excel文件写入到文件中 xwb.write(new FileOutputStream(new File(filename))); } catch (IOException e) { log.error("下载Excel模板异常,异常信息为:【{}】", e.getMessage(), e); } } @Test public void exportTest(){ List stockInfoList = new ArrayList(); StockInfoResponse response = new StockInfoResponse(); response.setSmallCategoryName("移动通信"); response.setSupplierName("智能电话"); response.setSupplierModel("华为Mate8"); response.setUnit("台"); response.setCount(100); response.setGovernmentCount(20); response.setProfessionalCount(20); response.setProduceCount(30); response.setCirculateCount(30); stockInfoList.add(response); StockInfoResponse response2 = new StockInfoResponse(); response2.setSmallCategoryName("移动通信"); response2.setSupplierName("智能电话"); response2.setSupplierModel("华为荣耀9"); response2.setUnit("台"); response2.setCount(200); response2.setGovernmentCount(40); response2.setProfessionalCount(40); response2.setProduceCount(60); response2.setCirculateCount(60); stockInfoList.add(response2); exportNoAcceptResult(stockInfoList); } }

​ 上述代码,在第三部分,将Excel存储在了本地,其余代码不变。导出结果如下图所示:

资源分配图

​ 又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。如果本文对你有所帮助,还请辛苦帮点赞、评论来一套。

​ 本系列为开发过程中遇到的比较实用的小功能,喜欢的话可以持续关注,如果本文对你有所帮助,还请还请点赞、评论加关注。

​ 有任何疑问,可以评论区留言。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有