int rownumber = rs.getRows();//多少行 int cellnumber = rs.getColumns();//多少列 for (int k = 0; k < cellnumber; k++) { jxl.write.Label labelC = new jxl.write.Label(k,rownumber,"这是第'"+rownumber+"'行,第'"+k+"'列"); labelC.setString("fdsadf"); //k表示哪一列,rownumber表示哪一行,从而定向到某个单元格,第三个参数是单元格内的内容 rs.addCell(labelC);//把此单元格放入表中 }
wr.write();//写入 wr.close(); } public String GoujianTable(String s ) throws Exception{ int rownumber=s.split(";").length; int cellnumber=s.split(";")[0].split(",").length; String [] slist=s.split(";"); String talbeString="<table >"; for(int i=0; i<rownumber;i++){ String [] sllist=slist[i].split(","); talbeString=talbeString+"<tr>"; for(int k=0;k<cellnumber-1;k++){ talbeString=talbeString+"<td>"; talbeString=talbeString+sllist[k]; talbeString=talbeString+"</td>";
} talbeString=talbeString+"</tr>"; } talbeString=talbeString+"</table>"; return talbeString; } public void Inserted(String s ) throws Exception{ int rownumber=s.split(";").length; int cellnumber=s.split(";")[0].split(",").length; WritableSheet rs = wr.getSheet(0);//查找表一 String [] slist=s.split(";"); for(int i=0; i<rownumber;i++){ String [] sllist=slist[i].split(","); for(int k=0;k<cellnumber;k++){ jxl.write.Label labelC = new jxl.write.Label(k,i,sllist[k]); rs.addCell(labelC); System.out.println("22"); }
如:每次查询100记录写到excel里,刷新输出流。
没必要导出那么多吧,一万多条记录导出后给别人看的效果是什么样?可想而知...
查询的数据放在list中,你在当中放了1W多条,哦,不可想像!你很历害!
建议换方法,不要导出那么多......
首先,你将1W多条数据装入List中,本身就是一个很吃内存的操作
其次,又将1W条数据写入Excel更是雪上加霜
-Xmx512M 或者更大。就ok了
import java.io.*;import jxl.*;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;import java.util.*;
/**
* 2011-4-27
* Caozuo.java
* author:zhouquan
* tel:15058149753
* email:[email protected]
*/
public class Caozuo {
InputStream is = null; //定义一个输入流
jxl.Workbook rwb = null;//定义一个只读的工作薄
WritableWorkbook wr=null; //定义一个可写的工作薄
FileOutputStream out=null;
WritableSheet sheet=null;
String worksheet = "List";//输出的excel文件工作表名
public Caozuo() {
try {
out=new FileOutputStream("E:\\a.xls");
wr=Workbook.createWorkbook(out);
sheet = wr.createSheet(worksheet, 0);
// WritableWorkbook wr = Workbook.createWorkbook(new File("E:\\a.xls"));
// //out=new FileOutputStream("E:\\a.xls");
// is = new FileInputStream("E:\\a.xls");//创建一个输入流
// rwb = Workbook.getWorkbook(is);//创建只读工作薄
// //wr=Workbook.createWorkbook(out);
// wr=Workbook.createWorkbook(new File("E:\\a.xls"), rwb);//创建可写的工作薄 } catch (Exception e) {
e.printStackTrace();
}
} public ArrayList Select() {
ArrayList arr = new ArrayList();
Sheet rs = rwb.getSheet(0);//读取第一个表
for (int i = 0; i < rs.getRows(); i++) {
ArrayList arr1 = new ArrayList();
for (int k = 0; k < rs.getColumns(); k++) {
Cell c00 = rs.getCell(k, i);//k表示列,i表示行,注列和行从0开始
String strc00 = c00.getContents();//getContents()方法是将Cell转换为字符串形式
arr1.add(strc00);
}
arr.add(arr1);
}
rwb.close();
return arr;
} public void Insert() throws RowsExceededException, WriteException, IOException {
WritableSheet rs = wr.getSheet(0);//查找表一
//WritableSheet rs = (WritableSheet)rwb.getSheet(0);
int rownumber = rs.getRows();//多少行
int cellnumber = rs.getColumns();//多少列
for (int k = 0; k < cellnumber; k++) {
jxl.write.Label labelC = new jxl.write.Label(k,rownumber,"这是第'"+rownumber+"'行,第'"+k+"'列");
labelC.setString("fdsadf");
//k表示哪一列,rownumber表示哪一行,从而定向到某个单元格,第三个参数是单元格内的内容
rs.addCell(labelC);//把此单元格放入表中
}
wr.write();//写入
wr.close();
}
public String GoujianTable(String s ) throws Exception{
int rownumber=s.split(";").length;
int cellnumber=s.split(";")[0].split(",").length;
String [] slist=s.split(";");
String talbeString="<table >";
for(int i=0; i<rownumber;i++){
String [] sllist=slist[i].split(",");
talbeString=talbeString+"<tr>";
for(int k=0;k<cellnumber-1;k++){
talbeString=talbeString+"<td>";
talbeString=talbeString+sllist[k];
talbeString=talbeString+"</td>";
}
talbeString=talbeString+"</tr>";
}
talbeString=talbeString+"</table>";
return talbeString;
}
public void Inserted(String s ) throws Exception{
int rownumber=s.split(";").length;
int cellnumber=s.split(";")[0].split(",").length;
WritableSheet rs = wr.getSheet(0);//查找表一
String [] slist=s.split(";");
for(int i=0; i<rownumber;i++){
String [] sllist=slist[i].split(",");
for(int k=0;k<cellnumber;k++){
jxl.write.Label labelC = new jxl.write.Label(k,i,sllist[k]);
rs.addCell(labelC);
System.out.println("22");
}
}
wr.write();//写入
System.out.println("**********************");
wr.close();
}
public void Delete(int id) throws IOException, WriteException{//id表示行号
WritableSheet rs=wr.getSheet(0);//查找表一
rs.removeRow(id-1);//删除行
wr.write();//从内存中写入
wr.close();
}
public void Update(int rowid,int columid,String cansu) throws RowsExceededException, WriteException, IOException{
WritableSheet rs=wr.getSheet(0);
//因为行和列都是从0开始,所以要减一
jxl.write.Label labelC = new jxl.write.Label(columid-1,rowid-1,cansu);
//WritableCell cell=(WritableCell) rs.getCell(columid-1,rowid-1);
rs.addCell(labelC);
wr.write();//写入
wr.close();
}
}
1.用windows的olddb驱动往excel里插入数据,必须生成文件在磁盘,并且必须在windows服务器系统
2.用excel的xml形式,查询到数据直接追加到文件,别放到list里,直接用resultset.next查询到就写入文件,避免占用过大内存。
不過文件。。100M,我靠
然後直接通過ODBC橋接,用JDBC寫操作,當寫了6W多行,就寫下一頁(其實是換了句SQL),不過要注意關閉CONNECTION,我是2W條關一次,不然會出奇怪的錯誤
能给我说说怎么把 查询出来的多个list 写入同一个文件吗?
我也是分批查询,但是每次写入一个list 就不写了!很郁闷
我的qq 435075657
不过我不知道poi操纵excel时,会不会把整个excel文件放入内存中去,你也可以到官网看看有什么优化方法。