本次的poi导出是用的SXSSFWorkbook,不同于之前写的HSSFWorkbook,HSSFWorkbook导出时,超过65536条数据就会出错,当然前面说的分sheet可以解决该问题,但是SXSSFWorkbook就能导出大量的数据。如下:
1、引用jar包:
我用的版本是3.9的,SXSSFWorkbook的版本要3.8以上的。
poi-3.9.jar、poi-examples-3.0.jar、poi-ooxml-3.9.jar、poi-scratchpad-3.9.jar。我是写过导入,所以要这四个包,其实不需要这么多包,只是我不记得导出只需要哪些包了,所有的包都要同一个版本,不然会冲突。
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.struts2.ServletActionContext;
public class XSSFPoiExcelExport {
Logger logger = Logger.getLogger(XSSFPoiExcelExport.class);
HttpServletResponse response;
// 文件名
private String fileName;
// 文件保存路径
private String fileDir;
// sheet名
private String sheetName;
// 表头字体
private String titleFontType = "Arial Unicode MS";
// 表头背景色
private String titleBackColor = "C1FBEE";
// 表头字号
private short titleFontSize = 12;
// 添加自动筛选的列 如 A:M
private String address = "";
// 正文字体
private String contentFontType = "Arial Unicode MS";
// 正文字号
private short contentFontSize = 12;
// 设置列的公式
private String colFormula[] = null;
public XSSFPoiExcelExport(HttpServletResponse response, String fileName, String sheetName) {
this.response = response;
this.fileName = fileName;
this.sheetName = sheetName;
}
@SuppressWarnings("unchecked")
public void wirteExcel(String titleColumn[], String titleName[], int titleSize[],
List dataList) throws Exception {
// //excel文件名
// String fileName = System.currentTimeMillis() + ".xlsx";
// FileOutputStream fos = null;
/// -> excel导出逻辑
long startTime = System.currentTimeMillis();
SXSSFWorkbook sxssfWorkbook = null;
try {
HttpServletRequest request = ServletActionContext.getRequest();
// 新建文件
OutputStream out = null;
String finalFileName = null;
if (fileDir != null) {
deleteExcel(fileDir);
// 有文件路径
out = new FileOutputStream(fileDir);
} else {
// 否则,直接写到输出流中
out = response.getOutputStream();
fileName = fileName + ".xlsx";
logger.info("导出excel,文件为:" + fileName);
response.setContentType("application/x-msdownload");
final String userAgent = request.getHeader("USER-AGENT"); // 获取浏览器的代理
// 下面主要是让文件名适应不同浏览器的编码格式
if (StringUtils.contains(userAgent, "MSIE")) {
finalFileName = URLEncoder.encode(fileName, "UTF8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
finalFileName = new String(fileName.getBytes(), "ISO8859-1");
} else {
finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
}
// 创建sheet并命名
sxssfWorkbook = new SXSSFWorkbook(100);
sxssfWorkbook.setCompressTempFiles(true);
// 设置并获取到需要的样式
XSSFCellStyle xssfCellStyleHeader = getAndSetXSSFCellStyleHeader(sxssfWorkbook);
XSSFCellStyle xssfCellStyleOne = getAndSetXSSFCellStyleOne(sxssfWorkbook);
XSSFCellStyle xssfCellStyleTwo = getAndSetXSSFCellStyleTwo(sxssfWorkbook);
XSSFCellStyle xssfCellStyleThree = getAndSetXSSFCellStyleThree(sxssfWorkbook);
if(dataList!=null) {
// 求总sheet数量,大于pageCount设置的数据就新建一个sheet
int pageCount = 10000;
final int sheetNum = (int) Math.ceil((float) dataList.size() / pageCount);
logger.info("excel中sheet数量:"+sheetNum);
for (int n = 1; n <= sheetNum; n++) {
// 添加Worksheet(不添加sheet时生成的xls文件打开时会报错)
String sheetNames = this.sheetName + "_" + n;
Sheet sheet = sxssfWorkbook.createSheet(sheetNames);
// 冻结最左边的两列、冻结最上面的一行
// 即:滚动横向滚动条时,左边的第一、二列固定不动;滚动纵向滚动条时,上面的第一行固定不动。
// sheet.createFreezePane(2, 1);
sheet.createFreezePane(0, 1);
// 创建第一行,作为header表头
Row header = sheet.createRow(0);
for (int i = 0; i < titleName.length; i++) {
Cell cell = header.createCell(i);
cell.setCellStyle(xssfCellStyleHeader);
cell.setCellValue(titleName[i].toString());
}
if(dataList.size() > 0) {
if (titleColumn.length > 0) {
int list_num_start = pageCount*(n-1); // 开始下标
int list_num_end = (sheetNum == n?(n-1):n)*pageCount+(sheetNum == n?dataList.size()%pageCount:0); // 结束下标
// 将本sheet数据加入到集合中
List