基于Excel对象操作:POI、JXL、FastExcel;
只要头部按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是按照逗号(英文逗号)分隔的文件,不支持样式,会自动转格式,例如:源数据是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>