提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并以及背景色,字体颜色的填充,文本内容的对齐方式等)。
实现思路:
首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口业务代码里通过IO流加载到这个Excel模板文件,读取指定的工作薄(也就是excel左下角的Sheet),接着给模板里的指定表头填充表头数据,接着读取数据库的相关数据用数据传输模型(DTO)封装数据,最后循坏填充excel的数据行(逐行逐列的填充数据),最后把填充完数据的Excel文件流输出(下载),即完成了数据库数据按照指定Excel模板导出Excel的完整过程。废话不多说,下面直接上代码。
一、配置POI框架的依赖
本案例是maven项目,解析Excel采用市面主流的POI框架,在pom.xml文件添加POI框架的依赖
<!--读取excel文件,配置POI框架的依赖-->
<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>
二、放入excel模板文件
目录结构如下所示:
二、导出excel具体实现
@RestController
@RequestMapping("/excel")
public class ExcelExportController {
@RequestMapping(value="/excelExport")
public ResponseEntity<Resource> excel2007Export(HttpServletResponse response,HttpServletRequest request) {
try {
ClassPathResource cpr = new ClassPathResource("/templates/"+"student.xlsx");
InputStream is = cpr.getInputStream();
Workbook workbook = new XSSFWorkbook(is);
org.apache.poi.ss.usermodel.Sheet sheet0 =workbook.getSheetAt(0);
Row row = sheet0.getRow(2);
Cell cell0 = row.getCell(0);
Cell cell1 = row.getCell(1);
Cell cell2 = row.getCell(2);
cell0.setCellValue("guo");
cell1.setCellValue("bin");
cell2.setCellValue("hui");
System.out.println(cell0);
//这里作为演示,造几个演示数据,模拟数据库里查数据
List <Student> list = new ArrayList<Student>();
Student st1 = new Student();
Student st2 = new Student();
st1.setName("张三");
st1.setScore("87");
st1.setClass("一班");
st2.setName("张四");
st2.setScore("57");
st2.setClass("二班");
list.add(st1);
list.add(st2);
for(int i = 0;i<list.size();i++){
Row row = sheet0.getRow(i+3);//从第三行开始填充数据
row.setCellValue(list.get(i).getName());
row.setCellValue(list.get(i).getScore());
row.setCellValue(list.get(i).getClass());
}
String fileName = "moban.xlsx";
downLoadExcel(fileName, response, workbook);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ResponseEntity<Resource>(HttpStatus.OK);
}
public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}
欢迎各位开发者朋友一起交流。笔者电话(微信):18629374628