简介
本文采用excel模板的方式实现excel导出,在excel2007及其以上版本,可实现百万级数据导出,在excel2003预计几万,超过会报内存溢出。
这套逻辑,关于导出,控制层和业务层几乎不用写太多代码
一、pom引入
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-reader</artifactId>
<version>1.0.1</version>
</dependency>
二、辅助SheetInfo类
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* sheet实体类
*/
public class SheetInfo {
/**
* sheet命名
*/
private String sheetName;
/**
* 列别名
*/
private List<String> colNames = new ArrayList<String>();
/**
* 数据别名
*/
private String dataAlias;
private int start = 0;//替代行数
private int oldEnd = 0;//结束行数
private int sheetNum = -1;//sheet数,默认-1,无sheet页
private AtomicInteger cursor = new AtomicInteger();//游标位置
public String getSheetName() {
return sheetName;
}
public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}
public List<String> getColNames() {
return colNames;
}
public void setColNames(List<String> colNames) {
this.colNames = colNames;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
cursor.set(start);
}
public int getOldEnd() {
return oldEnd;
}
public void setOldEnd(int oldEnd) {
this.oldEnd = oldEnd;
}
public String getDataAlias() {
return dataAlias;
}
public void setDataAlias(String dataAlias) {
this.dataAlias = dataAlias;
}
public int getSheetNum() {
return sheetNum;
}
public void setSheetNum(int sheetNum) {
this.sheetNum = sheetNum;
}
/**
* 得到游标,并将游标下移一位
* @author yyh 2020年4月14日 下午2:29:37
* @return
* @since 2.1
*/
public int getCursorAndMove() {
return cursor.getAndIncrement();
}
}
三、在XLSTransformer扩展工具类
import com.yyhtest.exportDemo.model.SheetInfo;
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
* 基于XLSTransformer上的开发,可用于百万级数据的导出
* 注:只支持excel2007及其以上的excel
*/