POI实现Excel报表导出 (已封装工具类)
程序员文章站
2022-07-10 09:00:56
首先导入依赖org.apache.poi poi 4.0.1 org.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