2010.03.17(4)——大数据导出excel之POI 改进版

2010.03.17(4)——大数据导出excel之POI 改进版
想用io流那个方法来解决这个内存泄露的异常,如下:

package test;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import util.JdbcUtil;

/**
 * 采用poi Excel工具来导出 改进版
 * 优点:比较简单,速度也挺快
 * 缺点:当15W条数据时,就会报内存泄露异常
 * 解决办法:多个文件来分担数据的压力
 *
 */
public class ExcelTest4 {
	public static void main(String[] args) throws Exception{
		FileOutputStream out = new FileOutputStream("C:/workbook1.xls");

		long a = System.currentTimeMillis();
		exportToExcel(out);
		long b = System.currentTimeMillis();
		System.out.println((b-a)/1000+"秒");
	}
	public static void exportToExcel(OutputStream out) throws Exception{
		//获得数据库连接
		Connection con = JdbcUtil.getConnection();
		//获得Statement
		Statement stm = con.createStatement();

		//执行查询
		ResultSet rs = stm.executeQuery("select * from tmp_rgncd_st");

		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 

		// 声明一个工作薄
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 生成一个表格
		HSSFSheet sheet = workbook.createSheet("Sheet1");
		
		int i = 0;
		int count = 2;
		while (rs.next()) {
			
			
			HSSFRow row = sheet.createRow(i);
			HSSFCell cell = row.createCell(0);
			cell.setCellValue(rs.getString(1));
			cell = row.createCell(1);
			cell.setCellValue(rs.getString(2));
			// cell.setCellValue(df.format(new
			// Date(rs.getTimestamp(2).getTime())));
			i++;
			if(i==2){
				
				workbook.write(out);
				out.close();
				out = new FileOutputStream("C:/workbook"+count+".xls");
				System.out.println((count)+"个Excel文件建立");
				count++;
				i = 0;
			}
		}
		System.out.println(i);
		workbook.write(out);
		out.close();

	}
}

这个还是有问题 数据库里面一共只有11条数据 应该是生成6张表,并且第六张表应该只有一条数据,但是,结果是 第六张表竟然有两条数据,感觉只有两种可能 一是out没有清空,二是workbook没有清空,但是 out每次循环都关闭了 应该不是out的原因,那就只可能是workbook的原因,发现workbook也没提供什么清空的方法,到最后 我发现了原因, workbook每次产生的新的文件好像都是根据上一个文件的模板来建的,新插进去的数据会覆盖后来的数据,但是只有一条数据,只能覆盖第一条数据,而第二条数据仍然存在,所以第六张表就还是有两条数据,所以,我的思路是 每次输出数据后就再新建一个HSSFWorkbook

public static void exportToExcel(OutputStream out) throws Exception{
		//获得数据库连接
		Connection con = JdbcUtil.getConnection();
		//获得Statement
		Statement stm = con.createStatement();

		//执行查询
		ResultSet rs = stm.executeQuery("select * from tmp_rgncd_st where k_rgncd <> 131100");

		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 

		// 声明一个工作薄
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 生成一个表格
		HSSFSheet sheet = workbook.createSheet("Sheet1");
		
		int i = 0;
		int count = 2;
		while (rs.next()) {
			
			
			HSSFRow row = sheet.createRow(i);
			HSSFCell cell = row.createCell(0);
			cell.setCellValue(rs.getString(1));
			cell = row.createCell(1);
			cell.setCellValue(rs.getString(2));
			// cell.setCellValue(df.format(new
			// Date(rs.getTimestamp(2).getTime())));
			i++;
			if(i==2){
				
				workbook.write(out);
				out.close();
				out = new FileOutputStream("C:/workbook"+count+".xls");
				System.out.println((count)+"个Excel文件建立");
				count++;
				i = 0;
				workbook = new HSSFWorkbook();
				sheet = workbook.createSheet("Sheet1");
			}
		}
		if(i!=0){
			workbook.write(out);
			out.close();
		}

	}











你可能感兴趣的:(java,apache,sql,c,Excel)