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

   日期:2020-09-14     浏览:194    评论:0    
核心提示:可以直接复制拿来用哟。(#^.^#)目录一、pom.xml依赖二、代码大致流程是这样的三、后端工具类四、基于vue,使用axios调用后端接口,实现下载文件的方法五、看效果一、pom.xml依赖 org.apache.poi poi..

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

目录

一、pom.xml依赖

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

三、后端工具类

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

五、看效果

 

一、pom.xml依赖

		<!--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>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>3.17</version>
		</dependency>

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

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

三、后端工具类

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;



public class ExcelUtil {

    
    public static void exportExcelUtil(HttpServletResponse response, List<LinkedHashMap<String,Object>> list, String filename) throws IOException {
        
        HSSFWorkbook  sxssfWorkbook = new HSSFWorkbook ();

        
        HSSFSheet sheet = sxssfWorkbook.createSheet(filename);
        
        int z=0;
        sheet.setColumnWidth((short)z++, 10*256);//第一列
        sheet.setColumnWidth((short)z++, 12*256);//第二列
        sheet.setColumnWidth((short)z++, 10*256);//第三列
        sheet.setColumnWidth((short)z++, 13*256);//第四列
   

        
//      sheet.setDefaultRowHeight((short)400);    
        
        
//      sheet.autoSizeColumn(1, true);//设置第一列单元格宽度自适应

        
        
        CellStyle style = sxssfWorkbook.createCellStyle();//创建CellStyle对象
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        
        
        HSSFFont font = sxssfWorkbook.createFont();//内容样式
        font.setFontHeightInPoints((short)15);//字体大小
        font.setFontName("Courier New");//字体
//        font.setItalic(true);//是否倾斜
        font.setBold(true);//是否加粗
        
        style.setFont(font);


        
        CellStyle style2 = sxssfWorkbook.createCellStyle();
//        style2.setAlignment(HorizontalAlignment.CENTER);//水平居中
//        style2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        
        HSSFFont font2 = sxssfWorkbook.createFont();//内容样式
        font2.setColor(HSSFFont.COLOR_RED);
        font2.setBold(false);//是否加粗
        
        style2.setFont(font2);


        
        CellRangeAddress region1 = new CellRangeAddress(0, 1, (short) 0, (short) 8);
        
        sheet.addMergedRegion(region1);

        
        HSSFRow headTitle = sheet.createRow(0);//起始行数为0
        headTitle.setHeightInPoints(25);//高度
        
        HSSFCell cell = headTitle.createCell(0);//起始列数为0
        
        cell.setCellValue(filename);
        
        cell.setCellStyle(style);


        String[] head={"标题1","标题2","标题3","标题4","标题5"};//标题集合
        
        HSSFRow headRow = sheet.createRow(2);//起始行数为2,因为之前我们合并单元格占用了2行,所以这里从第三行开始,索引就是2
        
        for (int i = 0; i < head.length; i++) {
            headRow.createCell(i).setCellValue(head[i]);//把标题添加到列里面
        }
        

        
        for (LinkedHashMap<String, Object> a : list) {
            int j=0;
            
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);//起始位置就是当前sheet最后一行+1开始
            
            HSSFCell cell1 = dataRow.createCell(j++);
            cell1.setCellValue("我是内容1");
            cell1.setCellStyle(style2);//把之前创建的样式对象CellStyle添加到这个单元格中,这样单元格就有了样式

            dataRow.createCell(j++).setCellValue("我是内容1");
            dataRow.createCell(j++).setCellValue("我是内容1");
            dataRow.createCell(j++).setCellValue("我是内容1");
            dataRow.createCell(j++).setCellValue("我是内容1");
        }


        
        
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.ms-excel");
        
        response.setHeader("Content-disposition", "attachment;filename=" + filename);
        
        ServletOutputStream outputStream = response.getOutputStream();
        
        sxssfWorkbook.write(outputStream);
        
        outputStream.close();
        sxssfWorkbook.close();
        System.out.println("导出完成");
    }
}

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

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

      
      exportExcel(filename,res){
        const link = document.createElement('a');
        let blob = new Blob([res.data], {type: 'application/vnd.ms-excel'});
        link.style.display = 'none';
        link.href = URL.createObjectURL(blob);
        let num = '';
        for (let i = 0; i < 10; i++) {
          num += Math.ceil(Math.random() * 10)
        }
        link.setAttribute('download', filename + '.xls');
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link)
      }

五、看效果

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

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

具体效果参考如下:

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服