100分求解决方案:用POI的HSSF写excel的问题:数据条数多的时候,会产生outofmemory错误~ 大约写到3万多行的时候会出错。我已经把Xmx改到我机器允许的最大值了~~搜索了一下,好像有人说可以用分批写入的方式?可是不知道具体如何实现~~求达人指教~~有别的解决办法也请不吝指教~~100分都送,不够可以再加~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关注,我用过jxl,不过也没有到这么多行 你的数据是从哪儿来的?读出时就应该用分批了.------------------------------------------------读出时候分批没有问题啊,可是最终还是都要写到同一个xls文件里去啊,错误是写文件时候发生的~~ 你可以分段读取,这样的话,就不会抛出OutOfMemery异常了 写excel文件效率太低了,最好的方法,把数据导出成cvs文件,然后手工导入到excel中。从程序直接写很容易把服务器跑挂掉。 唉,不是读取的问题,是写入时候的问题啊。还是贴自己的例子吧。package ExcelOut;import java.io.FileOutputStream;import java.io.File; import java.awt.*;import javax.swing.*;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFCell;public class ExcelOut extends Frame{ public static void main(String[] args) { try{ makeExcelfile("C:\\test.xls"); }catch(Exception e){ e.printStackTrace(); System.out.println("fault!"); } } private static void makeExcelfile(String filename) throws Exception{ HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputStream(filename); createListSheet(wb); wb.write(fileOut); fileOut.close(); System.out.println("completed"); } private static void createListSheet(HSSFWorkbook wb) throws Exception{ HSSFSheet sheet = wb.createSheet(); wb.setSheetName(1,"List",HSSFWorkbook.ENCODING_UTF_16); HSSFRow row = sheet.createRow(0); setCell(row,0,"No."); setCell(row,1,"a"); setCell(row,2,"keyword"); setCell(row,3,"name"); setCell(row,4,"type"); setCell(row,5,"counter"); setCell(row,6,"length"); setCell(row,7,"note"); String a[] = new String[8]; for(int i=1;i<=40000;i++){ a[0] = ""+i; a[1] = "hinryaku"+i; a[2] = "keyword"+i; a[3] = "hinmei"+i; a[4] = "katamei"+i; a[5] = "number"+i; a[6] = "length"+i; a[7] = "note"+i; setListSheetLine(sheet,i,a); } } private static void setListSheetLine(HSSFSheet st,int rowNo,String[] arg) throws Exception{ HSSFRow row = st.createRow(rowNo); for(int i=0;i<8;i++) setCell(row,i,arg[i]); } private static void setCell(HSSFRow row,int columnNo,String arg){ HSSFCell cell = row.createCell((short)columnNo); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(arg); }}出错是在wb.write(fileOut);,outofmemory了~~ 写excel文件效率太低了,最好的方法,把数据导出成cvs文件,然后手工导入到excel中。从程序直接写很容易把服务器跑挂掉。------------------------------------------------------------------------------这个我也会……可是客户要求直接写到xls文件里去~~我又有什么办法? up~~刚刚试了jxl,也一样,唉~~ 你不用程序,直接手工复制粘贴出三万行记录,你看看EXCEL什么反应?也快吃不消了。不要分段了,干脆就分文件吧,这么多数据,来个文件序列是理所当然的。否则,不要说写,就是打开都表现差强。 rester214 (呆呆中) 你的是写的问题,我在读的时候就OOM了,就这么两句java.io.File file = new java.io.File("xxx.xls");fs = new POIFSFileSystem(new FileInputStream(file));HSSFWorkbook wb = new HSSFWorkbook(fs) //在这就溢出了,我的文件才5000行 写excel文件效率太低了,最好的方法,把数据导出成cvs文件,然后手工导入到excel中 java动态数组 对于类似三国杀的游戏我该怎么设计 请问有关swing不规则窗体 vector怎么初始化啊? 如果创建java程序的安装exe 一个动态显示问题,GUI高手请进!(有源码) 急!已经弄了两天了! 需要一个使用如何写日志的例子 高分 在线等待 怎样把好几个*.java导入到jbuilder8中? 大家都在用什么java编译器 JList响应鼠标事件(注意:鼠标右键的单击)!!! 关于POI包的使用
------------------------------------------------读出时候分批没有问题啊,可是最终还是都要写到同一个xls文件里去啊,错误是写文件时候发生的~~
从程序直接写很容易把服务器跑挂掉。
import java.io.File;
import java.awt.*;
import javax.swing.*;import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;public class ExcelOut extends Frame{ public static void main(String[] args) {
try{
makeExcelfile("C:\\test.xls");
}catch(Exception e){
e.printStackTrace();
System.out.println("fault!");
}
} private static void makeExcelfile(String filename) throws Exception{ HSSFWorkbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream(filename); createListSheet(wb); wb.write(fileOut);
fileOut.close();
System.out.println("completed");
} private static void createListSheet(HSSFWorkbook wb) throws Exception{
HSSFSheet sheet = wb.createSheet();
wb.setSheetName(1,"List",HSSFWorkbook.ENCODING_UTF_16);
HSSFRow row = sheet.createRow(0);
setCell(row,0,"No.");
setCell(row,1,"a");
setCell(row,2,"keyword");
setCell(row,3,"name");
setCell(row,4,"type");
setCell(row,5,"counter");
setCell(row,6,"length");
setCell(row,7,"note");
String a[] = new String[8];
for(int i=1;i<=40000;i++){
a[0] = ""+i;
a[1] = "hinryaku"+i;
a[2] = "keyword"+i;
a[3] = "hinmei"+i;
a[4] = "katamei"+i;
a[5] = "number"+i;
a[6] = "length"+i;
a[7] = "note"+i;
setListSheetLine(sheet,i,a);
}
}
private static void setListSheetLine(HSSFSheet st,int rowNo,String[] arg) throws Exception{
HSSFRow row = st.createRow(rowNo);
for(int i=0;i<8;i++)
setCell(row,i,arg[i]);
} private static void setCell(HSSFRow row,int columnNo,String arg){
HSSFCell cell = row.createCell((short)columnNo);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(arg);
}
}出错是在wb.write(fileOut);,outofmemory了~~
从程序直接写很容易把服务器跑挂掉。
------------------------------------------------------------------------------这个我也会……可是客户要求直接写到xls文件里去~~我又有什么办法?
java.io.File file = new java.io.File("xxx.xls");
fs = new POIFSFileSystem(new FileInputStream(file));
HSSFWorkbook wb = new HSSFWorkbook(fs) //在这就溢出了,我的文件才5000行