java导出大批量(百万以上)数据的excel文件
程序员文章站
2024-02-29 15:26:16
本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下
1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,...
本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下
1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每个sheet页可以达到100万条数据以上,2007会在生成workbook时清理数据,所以2007导出量更大;
2.可以导出多个excel文件到某个目录中,然后打包下载;
3.导出excel格式的xml文件,这种方式可以分批导出数据,适用于大批量数据的导出,以下简单介绍这种方式:
代码如下:
package com.epay.utils; /** * 大数据量导出成excel或xml * @author qad * 2017-04-22 */ import java.io.bufferedoutputstream; import java.io.dataoutputstream; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; public class test { public static void main(string[] args) { stringbuffer sb = new stringbuffer(); try { dataoutputstream rafs = new dataoutputstream( new bufferedoutputstream(new fileoutputstream(new file( "d://test.xls")))); sb.append("<?xml version=\"1.0\" encoding=\"gbk\" ?>"); sb.append("\n"); sb.append("<?mso-application progid=\"excel.sheet\"?>"); sb.append("\n"); sb.append("<workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\""); sb.append("\n"); sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\""); sb.append("\n"); sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\""); sb.append("\n"); sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\""); sb.append("\n"); sb.append(" xmlns:html=\"http://www.w3.org/tr/rec-html40\">"); sb.append("\n"); sb.append("<documentproperties xmlns=\"urn:schemas-microsoft-com:office:office\"> "); sb.append("\n"); sb.append(" <styles>\n"); sb.append(" <style ss:id=\"default\" ss:name=\"normal\">\n"); sb.append(" <alignment ss:vertical=\"center\"/>\n"); sb.append(" <borders/>\n"); sb.append(" <font ss:fontname=\"宋体\" x:charset=\"134\" ss:size=\"12\"/>\n"); sb.append(" <interior/>\n"); sb.append(" <numberformat/>\n"); sb.append(" <protection/>\n"); sb.append(" </style>\n"); sb.append(" </styles>\n"); int sheetcount = 0; int recordcount = 65535; int currentrecord = 0; int total = 100000; int col = 20; sb.append("<worksheet ss:name=\"sheet0\">"); sb.append("\n"); sb.append("<table ss:expandedcolumncount=\"" + col + "\" ss:expandedrowcount=\"" + total + "\" x:fullcolumns=\"1\" x:fullrows=\"1\">"); sb.append("\n"); for (int i = 0; i < total; i++) { if ((currentrecord == recordcount || currentrecord > recordcount || currentrecord == 0) && i != 0) {// 一个sheet写满 currentrecord = 0; rafs.write(sb.tostring().getbytes()); sb.setlength(0); sb.append("</table>"); sb.append("<worksheetoptions xmlns=\"urn:schemas-microsoft-com:office:excel\">"); sb.append("\n"); sb.append("<protectobjects>false</protectobjects>"); sb.append("\n"); sb.append("<protectscenarios>false</protectscenarios>"); sb.append("\n"); sb.append("</worksheetoptions>"); sb.append("\n"); sb.append("</worksheet>"); sb.append("<worksheet ss:name=\"sheet" + i / recordcount + "\">"); sb.append("\n"); sb.append("<table ss:expandedcolumncount=\"" + col + "\" ss:expandedrowcount=\"" + recordcount + "\" x:fullcolumns=\"1\" x:fullrows=\"1\">"); sb.append("\n"); } sb.append("<row>"); for (int j = 0; j < col; j++) { system.out.println(i); sb.append("<cell><data ss:type=\"string\">111</data></cell>"); sb.append("\n"); } sb.append("</row>"); if (i % 5000 == 0) { rafs.write(sb.tostring().getbytes()); rafs.flush(); sb.setlength(0); } sb.append("\n"); currentrecord++; } rafs.write(sb.tostring().getbytes()); sb.setlength(0); sb.append("</table>"); sb.append("<worksheetoptions xmlns=\"urn:schemas-microsoft-com:office:excel\">"); sb.append("\n"); sb.append("<protectobjects>false</protectobjects>"); sb.append("\n"); sb.append("<protectscenarios>false</protectscenarios>"); sb.append("\n"); sb.append("</worksheetoptions>"); sb.append("\n"); sb.append("</worksheet>"); sb.append("</workbook>"); sb.append("\n"); rafs.write(sb.tostring().getbytes()); rafs.flush(); rafs.close(); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } }
导出xml文件之后直接修改后缀名为.xlsx就可以直接打开,弊端:无法导出.xls格式的excel文件.以上只是一种简单想法,留待以后具体实现.
扩展:既然可以使用xml文件导出excel,那么导出csv文件之后也可以直接改后缀名为.xls,目前只是一种想法,尚未证实可行性.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 深入浅出分析Python装饰器用法
下一篇: repeater做删除前弹窗询问实例