因为时间原因在整理的时候失忆了,所有有些东西忘记了,但是关键点有两个
1.使用SXSSFWorkbook对象声明对象
2. 这段代码很有用
fout = new FileOutputStream(path);
//内存中只留1000行数据,多余的暂存在硬盘中
swb = new SXSSFWorkbook(1000);
//压缩临时文件,很重要,否则磁盘很快就会被写满
swb.setCompressTempFiles(true);
/**
* 系统生成EXCEL(生成大量数据)
*
* @param columheader 列集合
* @param sheetName sheet名称
* @param templatePath 生成地址
* @param fileName 文件名称
* @return
*/
public static String createExcel2007BigData(List<List<String>> columheader, int headerRowNum,
String sheetName, String templatePath, String fileName) {
String path = templatePath;
//声明输出流
FileOutputStream fout = null;
//声明文件对象
File file = null;
//声明Excel文档对象
SXSSFWorkbook swb = null;
try {
createDir(path);
path += fileName + ".xlsx";
file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
//初始化输出流
fout = new FileOutputStream(path);
//内存中只留1000行数据,多余的暂存在硬盘中
swb = new SXSSFWorkbook(1000);
//压缩临时文件,很重要,否则磁盘很快就会被写满
swb.setCompressTempFiles(true);
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
//数据超过100万行,分sheet,每个sheet放100万行数据
int sheetNum = (int) Math.ceil(columheader.size() / 1000000.0);
for (int sheetIndex = 0; sheetIndex < sheetNum; sheetIndex++) {
// 取出表头数据
List<List<String>> partOfColumheader = columheader.subList(0, headerRowNum);
// 索引长度的第几百万条数据+表头行数
int subToNum = (sheetIndex + 1) * 1000000 + headerRowNum;
// 如果subToNum 大于等于总数据的长度,那么就是最后一个sheet页的数据
if (subToNum >= columheader.size()) {
subToNum = columheader.size();
}
//截取第i个sheet页所需要的数据
partOfColumheader.addAll(columheader.subList(sheetIndex * 1000000 + headerRowNum, subToNum));
// 创建sheet页
SXSSFSheet sheet = swb.createSheet("Sheet" + sheetIndex);
// 单元格的显示样式
CellStyle style = swb.createCellStyle();
DataFormat format = swb.createDataFormat();
//设置默认列宽
for (int j = 0; j < columheader.get(0).size(); j++) {
sheet.setColumnWidth(j, 4000);
}
int rowNum = 0;
for (; rowNum < partOfColumheader.size(); rowNum++) {
// 第三步,在sheet中添加表头第N行,注意老版本poi对Excel的行数列数有限制short
Row row = sheet.createRow(rowNum);
Cell cell = null;
for (int i = 0; i < columheader.get(rowNum).size(); i++) {
cell = row.createCell(i);
cell.setCellValue(columheader.get(rowNum).get(i));
String s = columheader.get(rowNum).get(i);
if (StringUtil.isNotEmpty(s)) {
boolean result = s.matches("[0-9.]+");
if (!result) {
style.setDataFormat(format.getFormat("@"));
cell.setCellStyle(style);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}
}
}
}
}
swb.write(fout);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 删除临时文件,很重要,否则磁盘可能会被写满
if (swb != null) {
swb.dispose();
}
try {
if (null != fout) {
fout.close();
}
} catch (IOException e) {
}
try {
if (null != swb) {
swb.close();
}
} catch (IOException e) {
}
}
return path;
}
2.额外的小知识:
使用这三行代码可以生成非绿色的数据,可以进行正常的excel数学计算。
// 存放列值
cell.setCellValue(Integer.valueOf(value));
style.setDataFormat(format.getFormat("0"));
cell.setCellStyle(style);