小言_互联网的博客

spring boot + vue 使用poi实现Excle导出功能(包括Excle样式调整,以及前后端代码)

587人阅读  评论(0)

可以直接复制拿来用哟。(#^.^#)

目录

一、pom.xml依赖

二、代码大致流程是这样的

三、后端工具类

四、基于vue,使用axios调用后端接口,实现下载文件的方法

五、看效果


 

一、pom.xml依赖


  
  1. <!--poi文档处理-->
  2. <dependency>
  3. <groupId>org.apache.poi </groupId>
  4. <artifactId>poi </artifactId>
  5. <version>3.17 </version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.poi </groupId>
  9. <artifactId>poi-ooxml </artifactId>
  10. <version>3.17 </version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.poi </groupId>
  14. <artifactId>poi-ooxml-schemas </artifactId>
  15. <version>3.17 </version>
  16. </dependency>

二、代码大致流程是这样的

  1. 创建Excle文件对象
  2. 根据创建的Excle文件对象创建Sheet页
  3. 在根据sheet页设置里面的内容
  4. 把文件流对象通过HttpServletResponse返回
  5. 前端模拟a标签,获取流数据,达到下载文件功能。

三、后端工具类


  
  1. import org.apache.poi.hssf.usermodel.*;
  2. import org.apache.poi.ss.usermodel.CellStyle;
  3. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  4. import org.apache.poi.ss.usermodel.VerticalAlignment;
  5. import org.apache.poi.ss.util.CellRangeAddress;
  6. import javax.servlet.ServletOutputStream;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.util.LinkedHashMap;
  10. import java.util.List;
  11. /**
  12. * @program: zy
  13. * @description: Excel工具类
  14. * @author: zhang yi
  15. * @create: 2020-08-28 11:08
  16. */
  17. public class ExcelUtil {
  18. /**
  19. * Excel表格导出模板类
  20. * @param response response对象,返回的是流数据
  21. * @param list 数据源对象,这里就是最后的列表
  22. * @param filename 自己定义的文件名。(前后端分离时,无法返回正确的文件名,这里的文件名一般是前端写好传递过来的)
  23. * @throws IOException
  24. */
  25. public static void exportExcelUtil(HttpServletResponse response, List<LinkedHashMap<String,Object>> list, String filename) throws IOException {
  26. /**创建Excel文件*/
  27. HSSFWorkbook sxssfWorkbook = new HSSFWorkbook ();
  28. /**创建sheet页*/
  29. HSSFSheet sheet = sxssfWorkbook.createSheet(filename);
  30. /**设置每一列单元格的宽度,因为一个单元格宽度定了,那么下面多有的单元格高度都确定了,所以这个方法是sheet的*/
  31. int z= 0;
  32. sheet.setColumnWidth(( short)z++, 10* 256); //第一列
  33. sheet.setColumnWidth(( short)z++, 12* 256); //第二列
  34. sheet.setColumnWidth(( short)z++, 10* 256); //第三列
  35. sheet.setColumnWidth(( short)z++, 13* 256); //第四列
  36. /**有得时候你想设置统一单元格的高度,就用这个方法*/
  37. // sheet.setDefaultRowHeight((short)400);
  38. /**自适应列宽(不合适。数据量大会卡,1000条2分钟)*/
  39. // sheet.autoSizeColumn(1, true);//设置第一列单元格宽度自适应
  40. /**设置样式,独立的一个CellStyle对象,在后面可以把这个CellStyle对象添加到单元格中,就实现了单元格样式*/
  41. CellStyle style = sxssfWorkbook.createCellStyle(); //创建CellStyle对象
  42. style.setAlignment(HorizontalAlignment.CENTER); //水平居中
  43. style.setVerticalAlignment(VerticalAlignment.CENTER); //垂直居中
  44. /**字体样式*/
  45. HSSFFont font = sxssfWorkbook.createFont(); //内容样式
  46. font.setFontHeightInPoints(( short) 15); //字体大小
  47. font.setFontName( "Courier New"); //字体
  48. // font.setItalic(true);//是否倾斜
  49. font.setBold( true); //是否加粗
  50. /**将字体样式加入CellStyle对象中*/
  51. style.setFont(font);
  52. /**样式2(按照同样的方法,可以设置多个CellStyle样式对象,这样你哪里需要用到这个样式,就直接添加进来。这些样式可以封装起来,便于单独调用)*/
  53. CellStyle style2 = sxssfWorkbook.createCellStyle();
  54. // style2.setAlignment(HorizontalAlignment.CENTER);//水平居中
  55. // style2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
  56. /**字体样式*/
  57. HSSFFont font2 = sxssfWorkbook.createFont(); //内容样式
  58. font2.setColor(HSSFFont.COLOR_RED);
  59. font2.setBold( false); //是否加粗
  60. /**将字体样式加入Style中*/
  61. style2.setFont(font2);
  62. /**合并单元格,四个参数依次为:起始行,终止行,起始列,终止列*/
  63. CellRangeAddress region1 = new CellRangeAddress( 0, 1, ( short) 0, ( short) 8);
  64. /**把合并后的单元格添加进sheet对象*/
  65. sheet.addMergedRegion(region1);
  66. /**创建 行 对象*/
  67. HSSFRow headTitle = sheet.createRow( 0); //起始行数为0
  68. headTitle.setHeightInPoints( 25); //高度
  69. /**创建 列 对象*/
  70. HSSFCell cell = headTitle.createCell( 0); //起始列数为0
  71. /**设置单元格的内容*/
  72. cell.setCellValue(filename);
  73. /**设置设置样式*/
  74. cell.setCellStyle(style);
  75. String[] head={ "标题1", "标题2", "标题3", "标题4", "标题5"}; //标题集合
  76. /**继续创建 行 对象*/
  77. HSSFRow headRow = sheet.createRow( 2); //起始行数为2,因为之前我们合并单元格占用了2行,所以这里从第三行开始,索引就是2
  78. /**继续创建 列 对象*/
  79. for ( int i = 0; i < head.length; i++) {
  80. headRow.createCell(i).setCellValue(head[i]); //把标题添加到列里面
  81. }
  82. /**前面的标题渲染好了后,这里就开始渲染实际数据了,数据一般放在List集合中,进行遍历渲染*/
  83. for (LinkedHashMap<String, Object> a : list) {
  84. int j= 0;
  85. /**创建 行 对象*/
  86. HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); //起始位置就是当前sheet最后一行+1开始
  87. /**根据行对象,创建列对象*/
  88. HSSFCell cell1 = dataRow.createCell(j++);
  89. cell1.setCellValue( "我是内容1");
  90. cell1.setCellStyle(style2); //把之前创建的样式对象CellStyle添加到这个单元格中,这样单元格就有了样式
  91. dataRow.createCell(j++).setCellValue( "我是内容1");
  92. dataRow.createCell(j++).setCellValue( "我是内容1");
  93. dataRow.createCell(j++).setCellValue( "我是内容1");
  94. dataRow.createCell(j++).setCellValue( "我是内容1");
  95. }
  96. /****************Excle表格渲染完成后,开始返回流数据*****************/
  97. /**设置头信息*/
  98. response.setCharacterEncoding( "UTF-8");
  99. response.setContentType( "application/vnd.ms-excel");
  100. /**一定要设置成xlsx格式*/
  101. response.setHeader( "Content-disposition", "attachment;filename=" + filename);
  102. /**创建一个输出流*/
  103. ServletOutputStream outputStream = response.getOutputStream();
  104. /**写入数据*/
  105. sxssfWorkbook.write(outputStream);
  106. /**关闭流*/
  107. outputStream.close();
  108. sxssfWorkbook.close();
  109. System.out.println( "导出完成");
  110. }
  111. }

 注意:spring mvc中的注解必须是@Controller,不能添加@ResponseBody。因为这里返回的是流,而不是JSON

四、基于vue,使用axios调用后端接口,实现下载文件的方法


  
  1. /**
  2. * 导出Excle通用
  3. * @param filename 文件名,前后端分离后,后端返回的是流数据,文件名会失效,所以需要前端指定
  4. * @param res 后端返回的流数据,直接把axios返回的流数据塞进来
  5. */
  6. exportExcel(filename,res){
  7. const link = document.createElement( 'a');
  8. let blob = new Blob([res.data], { type: 'application/vnd.ms-excel'});
  9. link.style.display = 'none';
  10. link.href = URL.createObjectURL(blob);
  11. let num = '';
  12. for ( let i = 0; i < 10; i++) {
  13. num += Math.ceil( Math.random() * 10)
  14. }
  15. link.setAttribute( 'download', filename + '.xls');
  16. document.body.appendChild(link);
  17. link.click();
  18. document.body.removeChild(link)
  19. }

五、看效果

当通过后端调用工具类后,会返回一个文件流输入,如下

前端通过axios调用接口,获取到流数据后,塞入到工具类中的变量里。就可以下载文件啦。

具体效果参考如下:

 


转载:https://blog.csdn.net/qq_39648029/article/details/108533631
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场