大数据量导出Excel

       基于Excel对象操作:POI、JXL、FastExcel;

       基于流操作:CVS、HTML、XML (HTML和XML其实这两种是一样的,只是头部文件和规范不一样)只要头部按MS官网上公布的结构规则填写,可以使用Excel打开文件。


http://msdn.microsoft.com/en-us/library/aa140062(office.10).aspx 官方的符合excel xml规范

 

技术

大数据量              

控制样式             

分sheet           

速度

导出文件大小                    

POI(非SXSSFWorkbook)                           

X

O

O

快(一定数据量内)                        

FastExcel

X

X

X

快(一定数据量内)

JXL

X

O

X

快(一定数据量内)

HTML

O

O

X

略慢(不管多少数据)                  

XML

O

O

O

略慢(不管多少数据)                             

CVS

O

X

未知

略慢(不管多少数据)

由上表可看出,每种技术都有它的优缺点,具体问题具体分析,根据具体的场景选择使用哪种技术。


       POI、FastExcel、JXL都是对Excel的对象操作,它们都会把需要导出的数据载入内存处理,在过程没有完成前,所有的Cell对象、Style对象都不能释放,当达到一定数据量后,再大的JVM也会有承受不了,不适合大数据量导出。


      CVS、HTML、XML都是对文本流操作,不会存在内在不足问题,CVS是按照逗号(英文逗号)分隔的文件,不支持样式,会自动转格式,例如:源数据是002200,在excel文件中会被转为2200;HTML支持样式,不会自动转格式,不支持多个SHEET(即如果只在一个Excel中存储数据,就只能导出65535条);XML支持样式,支持多个SHEET,不会自动转格式,是大数据量导出最佳选择之一。


        POI的SXSSFWorkbook也可以导出大数据量,支持样式,支持多个SHEET,是大数据量导出最佳选择之一。

 

下面是我的实验代码,因为比较匆忙,写的比较粗糙,请见谅,如果有问题请在本贴内回复,谢谢!

 

下面是使用xml的例子:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;


public class ExportExcelByXMLUtil {
	//指定文件目录
	//String path = "D:\\bigdatadownload\\";
	
	//定义初始变量
	private static File file = null;
	private static Connection conn = null;
	private static Statement stmt = null;
	private static ResultSet rs = null;

	public ExportExcelByXMLUtil() {}

	/**
	 * 构造方法中,初始文件File
	 * @param folderPath 文件夹目录
	 */
	public ExportExcelByXMLUtil(String folderPath) {
		Random random = new Random();
		file = new File(folderPath + random.nextDouble() + ".xml");
	}

	/**
	 * 打印Excel的头部,按MS API中的格式
	 */
	public static void writeExcelHead() {
		FileWriter fw;
		String s = "\n"
		+ "\n"
		+ "";
		try {
			fw = new FileWriter(file, true);
			fw.write(s);
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 打印Excel的脚
	 */
	public static void writeExcelFoot() {
		FileWriter fw;
		String s = "";
		try {
			fw = new FileWriter(file, true);
			fw.write(s);
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 打印Excel的内容
	 * @param content 传入的内容
	 */
	public static void writeExcelContent(String content) {
		FileWriter fw;
		try {
			fw = new FileWriter(file, true);
			fw.write(content);
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 把XML文件改一下后缀变成xls文件
	 */
	public static void changeToExcel(){
		file.renameTo(new File(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+".xls"));
	}

	public static void main(String[] args) {
		System.out.println(new SimpleDateFormat("hh:mm sss").format(new Date()));
		new ExportExcelByXMLUtil("D:\\bigdatadownload\\");
		writeExcelHead();
		writeExcelContent("");
		writeExcelContent("");
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.27:1521:NEWCMS", "cmsdb", "cmsdb456");
			stmt = conn.createStatement();
			rs = stmt.executeQuery(getSQL2());
			int i = 0;
			while (rs.next()) {
				writeExcelContent("");
				String s = ""
					+ " "+rs.getString("version_id")+"\n"
					+ " "+rs.getString("price_date")+"\n"
					+ " "+rs.getString("msrp")+"\n"
					+ " "+rs.getString("price_input_date_id")+"\n"
					+ " "+rs.getString("market_price")+"\n"
					+ " "+rs.getString("lowest_price")+"\n"
					+ " "+rs.getString("city_id")+"\n";
					writeExcelContent(s);
					writeExcelContent("");
					i++;
					if (i%100000==0) {
						writeExcelContent("
"); writeExcelContent("
"); writeExcelContent(""); writeExcelContent(""); } } System.out.println(new SimpleDateFormat("hh:mm sss").format(new Date())); } catch (Exception e) { e.printStackTrace(); } writeExcelContent("
"); writeExcelContent("
"); writeExcelFoot(); } public static String getSQL2(){ String sql = "select a.version_id,a.price_date,a.msrp,a.price_input_date_id,a.market_price,a.lowest_price,a.city_id from t_tp a where rownum <=200"; return sql; } }


你可能感兴趣的:(java)