利用POI导出10W数据

皮蛋瘦肉粥里没有粥 发布于 2013/05/07 16:32
阅读 8K+
收藏 1

收藏!数据建模最全知识体系解读!>>>

导出数据到EXCEL表,目前数据为7W以上,03版本容量不够,想换成07版本。但是代码运行到SXSSFWorkbook  wb = new SXSSFWorkbook();有问题,

是少包吗?目前导入包为:poi-3.9-20121203.jar,poi-examples-3.9-20121203.jar,poi-excelant-3.9-20121203.jar,poi-ooxml-3.9-20121203.jar,poi-ooxml-schemas-3.9-20121203.jar,poi-scratchpad-3.9-20121203.jar。

项目代码:

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public String exportAccountList(){
  try{
   String accountId = this.getHttpRequest().getParameter("accountId");
   String accountName =this.getHttpRequest().getParameter("accountName");
   String accountType =this.getHttpRequest().getParameter("accountType");
   
   Map<String, Object> paras = new HashMap<String, Object>();
   if(accountId != null &&! accountId.equals("")){
    paras.put("accountId", accountId);
   }
   if(accountName != null &&! accountName.equals("")){
    paras.put("accountName", accountName);
   }
   if(accountType != null &&! accountType.equals("")){
    paras.put("accountType", accountType);
   }
   List<Map<String, Object>> donationRecordList = this.pointService.getExportAccountList(paras);
   String xlsFile = "zhanghuguanli"
    + System.currentTimeMillis() + ".xlsx";
   String filePath = ServletActionContext.getServletContext()
    .getRealPath("export")
    + File.separator;// 设置导出文件的路径
   File file = new File(filePath);
   if (!file.exists())
    file.mkdirs();
   
  /** XSSFWorkbook xssf_w_book=new XSSFWorkbook();
   //创建一个单元格样式
   XSSFCellStyle head_cellStyle=xssf_w_book.createCellStyle();
   XSSFFont  head_font=xssf_w_book.createFont();
   head_font.setFontName("宋体");//设置头部字体为宋体
   head_font.setBoldweight(Font.BOLDWEIGHT_BOLD); //粗体
   head_font.setFontHeightInPoints((short) 12);
   head_cellStyle.setFont(head_font);//单元格样式使用字体
   XSSFDataFormat  head_format=xssf_w_book.createDataFormat();
         head_cellStyle.setDataFormat(head_format.getFormat("@"));
        
         //sheet名
         XSSFSheet  xssf_w_sheet=xssf_w_book.createSheet("账户管理数据");*/
   
   SXSSFWorkbook wb;
   wb = new SXSSFWorkbook();
   Map<String, CellStyle> styles = POIUtil.createStyles(wb);
   
   // 设置单元格格式(文本) 
   CellStyle cellStyle = wb.createCellStyle();
   cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));
   
   //设置sheet名
   Sheet sheet = wb.createSheet("账户管理数据");
   
   Cell headerCell = null;
   
   //设置标题头
   String strColName = "";
   String[] headColNames = strColName.split(",");
   int headColumnNum = headColNames.length;
   
   // 创建标题行
   Row headerRow1 = sheet.createRow(0);
   headerRow1.setHeightInPoints(25);
   
   
    // 创建标题行
      /**   XSSFRow xssf_w_row=sheet.createRow(0);
         xssf_w_row.setHeightInPoints(25);*/
        
  // XSSFCell xssf_w_cell=null;//创建每个单元格
   //写入标题头
   for (int i = 0; i < headColumnNum; i++) {
    headerCell = headerRow1.createCell(i);
    headerCell.setCellValue(headColNames[i]);
    headerCell.setCellStyle(styles.get("header"));
   }
   
   //设置对应数据库字段名  
   String strRealName="";
   String[] colNames = strRealName.split(",");
   int columnNum = colNames.length; 
   
   // 迭代生成数据 
   HashMap rowtemp = null;
   Row rowbody = null;
   int rowIdx = 1;//从第二行开始生成数据
   for (Iterator it = donationRecordList.iterator(); it.hasNext();)
   {
    rowtemp = (HashMap) it.next();
    for (int j = 0; j < columnNum; j++) {
     if (j == 0)
      rowbody = sheet.createRow((short) (rowIdx));
     else
      rowbody = sheet.getRow(rowIdx);
 
     Cell dataCell = rowbody.createCell(j);
     Object fieldValue = rowtemp.get(colNames[j]);
     fieldValue = fieldValue == null ? " " : fieldValue;
     
     // 设置单元格格式 
     dataCell.setCellStyle(cellStyle); 
     Pattern p = Pattern.compile("^([1-9][0-9]*)?[0-9](\\.[0-9]{1,2})?$");
     Matcher matcher = p.matcher(fieldValue.toString());
     if(matcher.matches()){
      //是数字当作double处理
      dataCell.setCellValue(Double.parseDouble(fieldValue.toString()));
     }else{
      dataCell.setCellType(HSSFCell.CELL_TYPE_STRING);
      dataCell.setCellValue(fieldValue.toString());
     }
    }
    rowIdx++;
   }
   //设置列宽
   for (int i = 0; i < colNames.length; i++) {
    sheet.setColumnWidth(i, 15 * 256); // 10 characters wide
   }
   sheet.setColumnWidth(colNames.length-1, 100 * 256); // 10 characters wide
   
   FileOutputStream out = new FileOutputStream(filePath+xlsFile);//将输出流写入要生成的文件
   wb.write(out);
   out.close();
   setTextAjax(xlsFile);
  
  }catch (Exception e) {
   logger.error(this, e);
   setTextAjax(e.toString());
  }
  
  return HTML;
 }

 

加载中
0
皮总
皮总
2007 支持 100万行
0
皮蛋瘦肉粥里没有粥
皮蛋瘦肉粥里没有粥

引用来自“皮总”的答案

2007 支持 100万行
这个可以,但是我在运行SXSSFWorkbook wb = new SXSSFWorkbook();就报了上面图的错误,我想知道是代码的错误,还是少jar包??
皮蛋瘦肉粥里没有粥
皮蛋瘦肉粥里没有粥
回复 @皮总 : 雷到了,呵呵
皮总
皮总
我不懂 JAVA
0
逝水fox
逝水fox
你的截图又不是报错...看起来不过是debug到了一个没有源码的jar包
0
皮蛋瘦肉粥里没有粥
皮蛋瘦肉粥里没有粥

引用来自“逝水fox”的答案

你的截图又不是报错...看起来不过是debug到了一个没有源码的jar包
我想知道到底少了哪个包?
逝水fox
逝水fox
jar包里面本来一般就没源码,debug进去就像你截图这样,你这样的截图只能说是这个类所在的jar包你放了,要问少了什么jar包,这截图压根就看不出来。自己检查控制台
0
开源肥牛饭
开源肥牛饭
之前做这个导出30W条数据要兼容03和后续版本,所以就将数据控制在5万条一个sheet,当超过这个数就新建一个sheet然后继续
皮总
皮总
2003 是 65535 行, 2007 以后是 100万行
0
MUTEX
MUTEX

你可以尝试少导出些数据看看是否出错,POI应该有行数限制,与Excel本身的版本无关。

其实干嘛导出XLS格式呢,用CSV格式不是更方便吗,直接处理为文本,EXCEL也能直接打开。

0
平安北京
行数绝对没问题的,Workbook wb=new SXSSFWorkbook(2000);
0
开水白
开水白
记得POI 有个默认的限制的
0
李惠民
李惠民

兄台,这个问题解决了吗?我每次导出超过65536就直接抛异常了:java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)

用的是poi3.9

返回顶部
顶部