大数据量导出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 = "<?xml version=\"1.0\"  encoding=\"GBK\"?>\n"
		+ "<?mso-application progid=\"Excel.Sheet\"?>\n"
		+ "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\n"
		+ " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n"
		+ " xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n"
		+ " xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\n"
		+ " xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
		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 = "</Workbook>";
		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("<Worksheet ss:Name=\"某客户大区数据\">");
		writeExcelContent("<Table>");
		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("<Row>");
				String s = "<Cell>"
					+ " <Data ss:Type=\"String\">"+rs.getString("version_id")+"</Data></Cell>\n"
					+ " <Cell><Data ss:Type=\"String\">"+rs.getString("price_date")+"</Data></Cell>\n"
					+ " <Cell><Data ss:Type=\"String\">"+rs.getString("msrp")+"</Data></Cell>\n"
					+ " <Cell><Data ss:Type=\"String\">"+rs.getString("price_input_date_id")+"</Data></Cell>\n"
					+ " <Cell><Data ss:Type=\"String\">"+rs.getString("market_price")+"</Data></Cell>\n"
					+ " <Cell><Data ss:Type=\"String\">"+rs.getString("lowest_price")+"</Data></Cell>\n"
					+ " <Cell><Data ss:Type=\"String\">"+rs.getString("city_id")+"</Data></Cell>\n";
					writeExcelContent(s);
					writeExcelContent("</Row>");
					i++;
					if (i%100000==0) {
						writeExcelContent("</Table>");
						writeExcelContent("</Worksheet>");
						writeExcelContent("<Worksheet ss:Name=\"某客户大区数据-"+i+"\">");
						writeExcelContent("<Table>");
					}
			}
			System.out.println(new SimpleDateFormat("hh:mm sss").format(new Date()));
		} catch (Exception e) {
			e.printStackTrace();
		}
		writeExcelContent("</Table>");
		writeExcelContent("</Worksheet>");
		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;
	}
	
}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值