“ 培养一门兴趣,是踏往成功之路的基石。” —— 23号老板
原创:凌空夜望,CSDN
最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内容生成Excel文件,并下载下来。本篇主要是介绍Excel文件的生成以及下载,使用的开发工具是IDEA 。关于Excel文件的生成请移步SpringBoot项目中关于Excel的解析(一)。
内容概要:
一、项目maven依赖
需要注意的是:这里选择的poi-ooxml和poi的依赖版本最好一致,否则可能会有两个依赖会出现不匹配的问题。本人曾遇到过poi-ooxml的版本是3.9,poi的版本是3.13,最终在测试阶段报错:
java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log(ILjava/lang/Object;)V from class org.apache.poi.openxml4j.opc.PackageRelationshipCollection
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
二、Controller层
@RestController
@RequestMapping("/handleFile/")
@Slf4j
public class HandleFileController{
/**
* excel生成下载
* @param response
* @return
* @throws Exception
*/
@GetMapping(value = "/createExcel")
public String createExcel(HttpServletResponse response) throws Exception{
Map<String,Object> excelMap = new HashMap<>();
//1.设置Excel表头
List<String> headerList = new ArrayList<>();
headerList.add("用户id");
headerList.add("用户名");
headerList.add("性别");
headerList.add("身份证号");
headerList.add("注册时间");
excelMap.put("header",headerList);
//2.是否需要生成序号,序号从1开始(true-生成序号 false-不生成序)
boolean isSerial = false;
excelMap.put("isSerial",isSerial);
//3.sheet名
String sheetName = "统计表";
excelMap.put("sheetName",sheetName);
//4.需要放入Excel中的数据
Map<String,Object> map = new HashMap<>();
map.put("gender","男");
List<User> rows = userMapper.selectUserInfo(map);
List<List<String>> data= new ArrayList<>();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (User user:rows){
//所有的数据顺序必须和表头一一对应
//list存放每一行的数据(让所有的数据类型都转换成String,这样就无需担心Excel表格中数据不对)
List<String> list = new ArrayList<>();
list.add(String.valueOf(user.getId()));
list.add(String.valueOf(user.getUsername()));
list.add(String.valueOf(user.getGender()));
list.add(String.valueOf(user.getNationalId()));
list.add(String.valueOf(format.format(user.getCreateTime())));
//data存放全部的数据
data.add(list);
}
excelMap.put("data",data);
//Excel文件内容设置
HSSFWorkbook workbook = HandleFile.createExcel(excelMap);
String fileName = "导出excel例子.xls";
//生成excel文件
HandleFile.buildExcelFile(fileName, workbook);
//浏览器下载excel
HandleFile.buildExcelDocument(fileName,workbook,response);
return "down excel";
}
}
上述代码中:List<User> rows = userMapper.selectUserInfo(map);
数据内容是直接从数据库中查取的,具体实现较简单这里就不做代码详细展示。只展示下图数据库具体查询的内容。
三、HandleFile工具类
/**
* 解析Excel文件
*
* @param in
* @param fileName
*/
public static List<List<Object>> parseExcel(InputStream in, String fileName) throws Exception {
List list = null;
Workbook work = null;
list = new ArrayList<>();
//创建Excel工作薄
work = getWorkbook(in, fileName);
if (null == work) {
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if (sheet == null) {
continue;
}
for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if (row == null || row.getFirstCellNum() == j) {
continue;
}
List<Object> li = new ArrayList<>();
for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
cell = row.getCell(y);
li.add(cell);
}
list.add(li);
}
}
return list;
}
四、测试结果
直接在浏览器中访问路径地址:
下载的Excel文件: