欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

POI实现Excel报表导出 (已封装工具类)

程序员文章站 2022-07-10 09:00:56
首先导入依赖org.apache.poipoi4.0.1org.a...

首先导入依赖

		<!--Poi 导出excel文件-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.0.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.0.1</version>
		</dependency>

这里需要注意,如果项目中EasyExcel和POI两种依赖都存在,有一些不同版本可能两个依赖会出现冲突。

2.添加操作类文件XLSFileKit(直接复制添加)

package cn.eracare.utils;

import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * <p>
 * Description:添加注释
 * </p>
 *
 * @param <>
 * @author youthMing
 * @date 2020/9/22 8:46
 */
public class XLSFileKit {
    // 创建一个`excel`文件
    private SXSSFWorkbook workBook;

    // `excel`文件保存路径
    private String filePath;
    public XLSFileKit(String filePath){
        this.filePath=filePath;
        this.workBook=new SXSSFWorkbook();
    }

    /**
     * 添加sheet
     * @param content 数据
     * @param sheetName sheet名称
     * @param title 标题
     */
    public <T> void addSheet(List<List<T>> content, String sheetName, List<String> title){
        SXSSFSheet sheet = this.workBook.createSheet(sheetName);

        // `excel`中的一行
        SXSSFRow row=null;

        // `excel`中的一个单元格
        SXSSFCell cell=null;
        int i=0,j=0;

        // 创建第一行,添加`title`
        row=sheet.createRow(0);
        for(;j<title.size();j++){//添加标题
            cell=row.createCell(j);
            cell.setCellValue(title.get(j));
        }

        // 创建余下所有行
        i=1;
        for(List<T> rowContent:content){
            row=sheet.createRow(i);
            j=0;
            for(Object cellContent:rowContent){
                cell=row.createCell(j);
                cell.setCellValue(cellContent.toString());
                j++;
            }
            i++;
        }
    }

    /**
     * 保存
     * @return
     */
    public boolean save(){
        try {
            FileOutputStream fos=new FileOutputStream(this.filePath);
            this.workBook.write(fos);
            fos.close();
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}

3.添加已封装的工具类

package cn.eracare.utils;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * <p>
 * Description:添加注释
 * </p>
 *
 * @param <>
 * @author youthMing
 * @date 2020/9/21 17:40
 */
public class PoiToExcelUtil {
    public static String ToExcel(String filename, HttpServletRequest request, LinkedHashMap<String, String> linkeHashedMap,
                                 List<HashMap<String, Object>> datas) {
        // 导出`Excel`名称
        String fileName = filename + ".xlsx";
        // excel`保存路径
        @SuppressWarnings("deprecation")
        String filePath = request.getRealPath("/") + "/file/export/";
        File file = new File(filePath);
        if (!file.exists()) {
            file.mkdirs();
        }

        String relativePath = "/file/export/" + fileName;
        filePath += fileName;
        XLSFileKit xlsFileKit = new XLSFileKit(filePath);
        List<List<Object>> content = new ArrayList<List<Object>>();
        List<String> title = new ArrayList<String>();

        for (String name : linkeHashedMap.keySet()) {
            title.add(name);
        }
        int i = 0;
        double max = 1048575.0;  //这里指每个工作簿存放的数据条数
        int num = 0;
        OK: while (true) {
            if (datas.size() < (i + 1)) {
                break OK;
            }
            // 判断单元格是否为空,不为空添加数据
            List<Object> row = new ArrayList<Object>();
            for (String name : linkeHashedMap.keySet()) {
                row.add(null == datas.get(i).get(linkeHashedMap.get(name)) ? "" : datas.get(i).get(linkeHashedMap.get(name)));
            }
            content.add(row);
            i++;
            if (i % max == 0) {
                xlsFileKit.addSheet(content, filename + "(" + num + ")", title);
                content.clear();
                num++;
            }
            if (datas.size() == i) {
                xlsFileKit.addSheet(content, filename + "(" + num + ")", title);
                content.clear();
                num++;
            }
        }
        xlsFileKit.save();
        return relativePath;
    }
}

4.使用工具类

           //创建一个LinkedHashMap集合(不可变需要它的有序特性)
			LinkedHashMap<String, String> linkeHashedMap= new LinkedHashMap<String, String>();
			
			//向集合中添加键值对分别是 (表头,sql语句对应字段)
			linkeHashedMap.put("就诊机构", "org02");
			linkeHashedMap.put("就诊科室", "vak03");
			linkeHashedMap.put("医生姓名", "doc02");
			linkeHashedMap.put("就诊单据号", "iar01");
			linkeHashedMap.put("患者姓名", "vak16");
			linkeHashedMap.put("身份证号", "vak11");
			linkeHashedMap.put("诊断名称", "picd02");
			linkeHashedMap.put("住院天数", "vak23");
			linkeHashedMap.put("手术日期", "day");
			linkeHashedMap.put("手术操作频次", "sum");
			linkeHashedMap.put("手术项目名称", "tsmgroup02");

			//调用工具类   参数分别为(导出表格的名字,请求体,linkeHashedMap表头集合,查询得到的集合)
			String relativePath = ToExcelUtil.ToExcel(Export, getRequest(), linkeHashedMap, arrayList);
			renderJson(new Record().set("relativePath", relativePath));

附赠前端接收代码

					//这里的relativePath 是上面工具类返回的地址(这里我个人理解POI报表导出是先将表格存在服务器上
					,然后前端访问导出,而EasyExcel则是直接返回流)
					
						var relativePath = res.data.data;
						
						//这里的 this.ExportAPI是服务器服务的地址加上文件的地址就可以下载相应Excel文件。
						window.location.href = this.ExportAPI + relativePath;

本文地址:https://blog.csdn.net/yangming987/article/details/110469440

相关标签: java poi excel