我这段时间需要往excel表格中写入大量数据,所以找了jakarta的poi来将一个ResultSet中的数据写入excel表格。实现的部分程序附在后面。
这段代码虽然可以是实现ResultSet中的数据写入excel表格的功能,但是,写入速度很慢。测试环境是CPU1.7G、内存1G、winXP、JDK1.5。开始的时候写入速度还可以,写入几百条数据后,速度逐渐下降,写入两千条左右之后的速度大概是一条每秒,再往后我就没有测试了。
哪位大哥能帮我看看问题出在什么地方,小弟我万分感激!
public boolean elsExport(ResultSet rs,String fileName,String tableName){
this.setFileName(fileName);
this.setTableName(tableName);
try{
// 如果filePath不存在,则创建路径
if(!new java.io.File(filePath).isDirectory()){
new java.io.File(filePath).mkdirs();
}
File objFile = new File(fileName);
HSSFWorkbook workbook = null;
HSSFSheet sheet = null;
//如果文件不存在,则创建文件。
if(!objFile.exists()){
System.out.println("检测到文件不存在,正在创建文件...");
workbook = new HSSFWorkbook();
//sheet = workbook.createSheet(tableName);
FileOutputStream fOut = new FileOutputStream(fileName);
workbook.write(fOut);
fOut.flush();
fOut.close();
}
workbook = new HSSFWorkbook(new FileInputStream(fileName));
sheet = workbook.createSheet(tableName);
FileOutputStream fOut;
HSSFRow row;
HSSFCell cell;
int i=1;
while (rs.next()&&i<=1000){
for(int j=0; j<5; j++){
fOut= new FileOutputStream(fileName);
row = sheet.createRow(i);
cell = row.createCell((short)j);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(rs.getString(j+1));
workbook.write(fOut);
fOut.flush();
fOut.close();
}
System.out.println("文件已写入第"+i+"行..");
++i;
}
System.out.println("文件已生成!");
}catch(Exception e) {
System.out.println("错误 : " + e );
}
return true;
}
这段代码虽然可以是实现ResultSet中的数据写入excel表格的功能,但是,写入速度很慢。测试环境是CPU1.7G、内存1G、winXP、JDK1.5。开始的时候写入速度还可以,写入几百条数据后,速度逐渐下降,写入两千条左右之后的速度大概是一条每秒,再往后我就没有测试了。
哪位大哥能帮我看看问题出在什么地方,小弟我万分感激!
public boolean elsExport(ResultSet rs,String fileName,String tableName){
this.setFileName(fileName);
this.setTableName(tableName);
try{
// 如果filePath不存在,则创建路径
if(!new java.io.File(filePath).isDirectory()){
new java.io.File(filePath).mkdirs();
}
File objFile = new File(fileName);
HSSFWorkbook workbook = null;
HSSFSheet sheet = null;
//如果文件不存在,则创建文件。
if(!objFile.exists()){
System.out.println("检测到文件不存在,正在创建文件...");
workbook = new HSSFWorkbook();
//sheet = workbook.createSheet(tableName);
FileOutputStream fOut = new FileOutputStream(fileName);
workbook.write(fOut);
fOut.flush();
fOut.close();
}
workbook = new HSSFWorkbook(new FileInputStream(fileName));
sheet = workbook.createSheet(tableName);
FileOutputStream fOut;
HSSFRow row;
HSSFCell cell;
int i=1;
while (rs.next()&&i<=1000){
for(int j=0; j<5; j++){
fOut= new FileOutputStream(fileName);
row = sheet.createRow(i);
cell = row.createCell((short)j);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(rs.getString(j+1));
workbook.write(fOut);
fOut.flush();
fOut.close();
}
System.out.println("文件已写入第"+i+"行..");
++i;
}
System.out.println("文件已生成!");
}catch(Exception e) {
System.out.println("错误 : " + e );
}
return true;
}
先 明天来学习
没必要在两层循环中间调用吧??拿到while外面来!!
只是贴上去有点难看而已!彗星撞地球的建议我晚上试试~
谢谢咯~建议不要用excel来当数据库,不然你会哭的!!
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(tableName);
int i = 0;
while (rs.next()) {
HSSFRow row = sheet.createRow(i);
for (short j = 0; j < 5; j++) {
HSSFCell cell = row.createCell(j);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(rs.getString(j + 1));
}
i++;
} FileOutputStream out = new FileOutputStream(fileName);
workbook.write(out);
out.close(); return true;
}
^.^但是又出现了一个问题,当一个RS中数据量过万的时候,写入文件会出现异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我正在想办法解决,如果哪位大哥有好的方法,希望能多多指点哦~ 小弟我先谢谢了