Springboot生成并导出Excel(使用POI)
文件下载的工作原理还是依靠了HTTP协议提供了文件下载功能。
SpringBoot集成POI,导出excel文件非常方便。首先引入所需要的poi jar包,然后在Controller层实现相关的业务代码即可。话不多说,直接上代码吧。
1.配置pom.xml
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
2.在controller层添加如下代码:
import org.apache.poi.hssf.usermodel.*; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Excel表格导出接口 * http://localhost:8080/ExcelDownload * @param response response对象 * @throws IOException 抛IO异常 */ @RequestMapping("/ExcelDownload") public void excelDownload(HttpServletResponse response) throws IOException { //表头数据 String[] header = {"姓名", "工号", "性别", "出生日期", "身份证号码", "婚姻状况","民族","籍贯","政治面貌","电子邮件","电话号码","联系地址","所属部门","职位","职称","聘用形式","入职日期","转正日期","合同起始日期","合同截止日期","合同期限","最高学历"}; //声明一个工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); //生成一个表格,设置表格名称为"学生表" HSSFSheet sheet = workbook.createSheet("员工表"); //设置表格列宽度为10个字节 sheet.setDefaultColumnWidth(10); //创建标题的显示样式 HSSFCellStyle headerStyle = workbook.createCellStyle(); headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //创建第一行表头 HSSFRow headrow = sheet.createRow(0); //遍历添加表头(下面模拟遍历学生,也是同样的操作过程) for (int i = 0; i < header.length; i++) { //创建一个单元格 HSSFCell cell = headrow.createCell(i); //创建一个内容对象 HSSFRichTextString text = new HSSFRichTextString(header[i]); //将内容对象的文字内容写入到单元格中 cell.setCellValue(text); cell.setCellStyle(headerStyle); } //获取所有的employee List<Employee> emps=employeeService.getAllEmpNonLimit(); for(int i=0;i<emps.size();i++){ //创建一行 HSSFRow row1 = sheet.createRow(i+1); //第一列创建并赋值 row1.createCell(1).setCellValue(new HSSFRichTextString(emps.get(i).getId().toString())); //第二列创建并赋值 row1.createCell(0).setCellValue(new HSSFRichTextString(emps.get(i).getName())); //第三列创建并赋值 row1.createCell(2).setCellValue(new HSSFRichTextString(emps.get(i).getGender())); //第4列创建并赋值 if(emps.get(i).getBirthday() != null){ row1.createCell(3).setCellValue(new HSSFRichTextString(dateFormat.format(emps.get(i).getBirthday()))); } //第5列创建并赋值 row1.createCell(4).setCellValue(new HSSFRichTextString(emps.get(i).getIdCard())); //第6列创建并赋值 row1.createCell(5).setCellValue(new HSSFRichTextString(emps.get(i).getWedlock())); //第7列创建并赋值 System.err.println(emps.get(i).getNationName()); row1.createCell(6).setCellValue(new HSSFRichTextString(emps.get(i).getNationName())); //籍贯 row1.createCell(7).setCellValue(new HSSFRichTextString(emps.get(i).getNativePlace())); //第8列创建并赋值 row1.createCell(8).setCellValue(new HSSFRichTextString(emps.get(i).getPoliticName())); //第9列创建并赋值 row1.createCell(9).setCellValue(new HSSFRichTextString(emps.get(i).getEmail())); //第10列创建并赋值 row1.createCell(10).setCellValue(new HSSFRichTextString(emps.get(i).getPhone())); //第11列创建并赋值 row1.createCell(11).setCellValue(new HSSFRichTextString(emps.get(i).getAddress())); //第12列创建并赋值 row1.createCell(12).setCellValue(new HSSFRichTextString(emps.get(i).getDepartmentName())); //第13列创建并赋值 row1.createCell(13).setCellValue(new HSSFRichTextString(emps.get(i).getPosName())); //第14列创建并赋值 row1.createCell(14).setCellValue(new HSSFRichTextString(emps.get(i).getJobLevelName())); //第15列创建并赋值 if(emps.get(i).getEngageForm() != null){ row1.createCell(15).setCellValue(new HSSFRichTextString(emps.get(i).getEngageForm())); } //第16列创建并赋值-入职日期 if(emps.get(i).getBeginDate()!= null){ row1.createCell(16).setCellValue(new HSSFRichTextString(dateFormat.format(emps.get(i).getBeginDate()))); } //转正日期 if(emps.get(i).getConversionTime() != null){ row1.createCell(17).setCellValue(new HSSFRichTextString(dateFormat.format(emps.get(i).getConversionTime()))); } //合同起始日期 if(emps.get(i).getBeginContract() != null){ row1.createCell(18).setCellValue(new HSSFRichTextString(dateFormat.format(emps.get(i).getBeginContract()))); } //合同截止日期 if(emps.get(i).getEndContract() != null){ row1.createCell(19).setCellValue(new HSSFRichTextString(dateFormat.format(emps.get(i).getEndContract()))); } //第20列创建并赋值-合同期限 if(emps.get(i).getContractTerm() != null){ row1.createCell(20).setCellValue(new HSSFRichTextString(emps.get(i).getContractTerm().toString())); } //第21列创建并赋值-最高学历 if( emps.get(i).getTiptopDegree() != null){ row1.createCell(21).setCellValue(new HSSFRichTextString(emps.get(i).getTiptopDegree())); } } //准备将Excel的输出流通过response输出到页面下载 //八进制输出流 response.setContentType("application/octet-stream"); //这后面可以设置导出Excel的名称,此例中名为student.xls response.setHeader("Content-disposition", "attachment;filename=employee.xls"); //刷新缓冲 response.flushBuffer(); //workbook将Excel写入到response的输出流中,供页面下载 workbook.write(response.getOutputStream()); }
3.前台页面直接访问 http://xxxx/ExcelDownload 即可自动下载定义的excel
4.实现效果图:
还是很简单的!
吾知也有涯 而生也无涯!