用到的jar包是 POI 3.8,注意导包的时候,那几个包都要导进去,下包就不用说了吧,官网上有。http://poi.apache.org/
接着是个工具类,无意中在网上发现了,感觉封装的不错,我就稍微修改了下,导出大数据量(30W数据,70列)到EXCEL2007,目前没有出现内存溢出问题。
[html] view plaincopyprint?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public class ExcelWriter {
// 定制浮点数格式
private static String NUMBER_FORMAT = "#,##0.00";
// 定制日期格式
private static String DATE_FORMAT = "m/d/yy"; // "m/d/yy h:mm"
private OutputStream out = null;
private Workbook workbook = null;
private Sheet sheet = null;
private Row row = null;
public ExcelWriter() {
}
public ExcelWriter(OutputStream out) {
this.out = out;
this.workbook = new SXSSFWorkbook(128);//POI3.8最新的API,解决问题的关键。
this.sheet = workbook.createSheet();
}
/**
* 导出Excel文件
* @throws IOException
*/
public void export() throws FileNotFoundException, IOException {
try {
workbook.write(out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
throw new IOException(" 生成导出Excel文件出错! ", e);
} catch (IOException e) {
throw new IOException(" 写入Excel文件出错! ", e);
}
}
/**
* 增加一行
* @param index 行号
*/
public void createRow(int index) {
this.row = this.sheet.createRow(index);
}
/**
* 获取单元格的值
* @param index 列号
*/
public String getCell(int index){
Cell cell = this.row.getCell((short) index);
String strExcelCell = "";
if (cell != null) { // add this condition
// judge
switch (cell.getCellType()) {
case Cell.CELL_TYPE_FORMULA:
strExcelCell = "FORMULA ";
break;
case Cell.CELL_TYPE_NUMERIC: {
strExcelCell = String.valueOf(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_STRING:
strExcelCell = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_BLANK:
strExcelCell = "";
break;
default:
strExcelCell = "";
break;
}
}
return strExcelCell;
}
/**
* 设置单元格
* @param index 列号
* @param value 单元格填充值
*/
public void setCell(int index, int value) {
Cell cell = this.row.createCell((short) index);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(value);
}
/**
* 设置单元格
* @param index 列号
* @param value 单元格填充值
*/
public void setCell(int index, double value) {
Cell cell = this.row.createCell((short) index);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(value);
CellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式
DataFormat format = workbook.createDataFormat();
cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT));//设置cell样式为定制的浮点数格式
cell.setCellStyle(cellStyle); // 设置该cell浮点数的显示格式
}
/**
* 设置单元格
* @param index 列号
* @param value 单元格填充值
*/
public void setCell(int index, String value) {
Cell cell = this.row.createCell((short) index);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(value);
}
/**
* 设置单元格
* @param index 列号
* @param value 单元格填充值
*/
public void setCell(int index,Calendar value) {
Cell cell = this.row.createCell((short) index);
cell.setCellValue(value.getTime());
CellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式
DataFormat format = workbook.createDataFormat();
cellStyle.setDataFormat(format.getFormat(DATE_FORMAT)); // 设置cell样式为定制的日期格式
cell.setCellStyle(cellStyle); // 设置该cell日期的显示格式
}
public static void main(String[] args) {
System.out.println(" 开始导出Excel文件 ");
File f = new File("C:\\qt.xls");
ExcelWriter e = new ExcelWriter();
try {
e = new ExcelWriter(new FileOutputStream(f));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
e.createRow(0);
e.setCell(0, "试题编码 ");
e.setCell(1, "题型");
e.setCell(2, "分值");
e.setCell(3, "难度");
e.setCell(4, "级别");
e.setCell(5, "知识点");
e.createRow(1);
e.setCell(0, "t1");
e.setCell(1, 1);
e.setCell(2, 3.0);
e.setCell(3, 1);
e.setCell(4, "重要");
e.setCell(5, "专业");
try {
e.export();
System.out.println(" 导出Excel文件[成功] ");
} catch (IOException ex) {
System.out.println(" 导出Excel文件[失败] ");
ex.printStackTrace();
}
}
}
这个只是个util。接着你就可以运用到你的工程中去了。下面是个测试类。
[html] view plaincopyprint?
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestExcelPOI {
public static void main(String[] args) throws FileNotFoundException {
String newFileName = "test_performance.xlsx";
int rows = 100000;
int cols = 70;
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(newFileName));
ExcelWriter excelWriter = new ExcelWriter(out);
long start =System.currentTimeMillis();
for (int rowNum = 0; rowNum < rows; rowNum++){
excelWriter.createRow(rowNum);
for (int colNum = 0; colNum < cols; colNum++) {
String value = rowNum + "_" + colNum;//模拟数据
excelWriter.setCell(colNum, value);
}
}
try{
excelWriter.export();
System.out.println(" 导出Excel文件[成功]");
} catch (IOException ex) {
System.out.println(" 导出Excel文件[失败]");
ex.printStackTrace();
}
long end =System.currentTimeMillis();
double seconds = (end -start)/Math.pow(10, 3);
System.out.println(seconds);
}
}
/***************运行结果**************************
*导出Excel文件[成功]
* 48.293
*************************************************/
本人运行的30W,差不多2分钟左右,感觉还是比这个快些的。
总结:
开始没用POI最新的API,还是很容易就溢出了,大概6000行,70列,就溢出,效果不好,用了POI3.8 的最新API,请注意ExcelWriter里面的代码。
在此之前还尝试过csv和table导出数据,csv是用逗号分隔,table用标签把数据封装起来。这两个还没出现内存溢出,也没做具体的测试,有个缺点就是格式不好控制。如果你对格式要求不高,或者数据只是用来看的,可以考虑这种。
还有就是写成多个EXCEL,然后在合并,可惜效果也不佳。
分享到:
相关推荐
Java_批量导出大数据量Excel方法.zip
Excel数据批量导入与Excel文件的导出,Excel数据批量导入与Excel文件的导出
Java_批量导出大数据量Excel方法
C# datatable直接导出数据到Excel,(数据量百万级只需3秒)
我之前做excel导出的时候,效率很差,尤其是数据量达到上万条的时候,要等上将近20分钟了。后来努力下,找到了简单的导出方法,几千条数据,用了不到1分钟,就轻松导出了。下面是思路和源码,供大家参考
excel数据批量导入数据库的小工具,节省你的时间
C#Excel大量数据快速导入数据库.
在我们的实践开发中我们经常会遇到很多关于报表问题的数据展示,当然了有报表肯定是少不了数据的导出和导入的一些功能的啦,我这个demo就是专门使用nopi第三方库对excel的数据批量导入和数据导出的相关功能实现。
在数据管理系统中,添加大量数据,如果通过手动录入的话,相当费事费力。最近开发一款数据管理系统,所以我花了半天时间将该功能梳理出来。该资料将框架和其他功能都简化,主要实现该功能。
解决大批量数据导出Excel产生内存溢出的方案
plsql导出数据到excel常用的三种方法,(1)直接导出;(2)转换导出方式;(3)导出后转换格式;
解决poi大数据量导出excel的代码,该代码中所用的jar包是poi3.9。在测试过程中单个sheet中导出20万数据没有问题。
这个工具是之前写了做数据稽核用的工具,甲方发过来了几十个Excel表格,每个表格都有一百多万数据,必须导入数据库才能作分析,所以写了这个脚本用来导数据,做报表的可参考,改一下脚本中的数据库字段就能用了
poi 方式导入 大量excel数据,将excelDir目录下文件考入f盘即可测试 poi 方式导入 大量excel数据,将excelDir目录下文件考入f盘即可测试
基于Python实现SQL SEVER与Excel间数据的批量导出.pdf
前段时间上传了一个fluent大批量数据处理的代码,经过同学运行发现,当fluent导出数据量到excel时,因为超过百兆太大不支持,于是稍微改写了一下,这样可以选择 以dat格式或则txt格式储存,然后在运用该段代码处理...
直接可以用的项目。数据量大,导出多个excel然后压缩成zip文件。。。
这段代码主要实现的是将excel里面的大量数据一次性批量导入Oracle数据库内。
这个是我用python开发的1个小程序,首先你在excel表格里整理好数据。表头分别是【参数1】、【参数2】、【参数3】、、一直到【参数100】,然后你的静态html页面对应的位置就放我的标志符【参数n】,其中【参数1】用于...
批量导入,通过列映射进行批量导入到SQLserver中。不需要添加组件。