您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

如何将百万数据分成多个sheet页?

2025/12/2 10:11:16发布18次查看
如何将百万数据分成多个sheet页,导出到excel
导出百万数据到excel,很简单,只需要将原来的hssfworkbook修改成sxssfworkbook,就可以了,但是如果有300w条数据,一下导入一个excel的sheet页中,想想打开excel也需要一段时间吧,慢的话有可能导致程序无法加载,或者直接结束进程的情况发生,或者打开了,那么多数据,看着就头疼,曾看到过一段新闻 ,这里对老外的毅力也是深表佩服。
这里给出部分代码,供参考研究,分页已实现:
@suppresswarnings({ deprecation, unchecked })     @requestmapping(export-trainhistoryrecord)     @responsebodyprotected void buildexceldocument(employeetrainhistoryquery query,modelmap model,             sxssfworkbook workbook, httpservletrequest request,             httpservletresponse response) throws exception {try {             response.reset();// 获得国际化语言requestcontext requestcontext = new requestcontext(request);             string coursecompany = requestcontext                     .getmessage(manage-student-trainrecods);             response.setcontenttype(application/vnd.ms-excel;charset=utf-8);// 注意,如果去掉下面一行代码中的attachment; 那么也会使ie自动打开文件。            response.setheader(content-disposition,attachment; filename=                             + java.net.urlencoder.encode(                                     dateutil.getexportdate() + .xlsx, utf-8));//excel 扩展名指定为xlsx  sxssfworkbook对象只支持xlsx格式outputstream os = response.getoutputstream();             cellstyle style = workbook.createcellstyle();// 设置样式style.setfillforegroundcolor(hssfcolor.sky_blue.index);//设置单元格着色style.setfillpattern(hssfcellstyle.solid_foreground);  //设置单元格填充样式style.setborderbottom(hssfcellstyle.border_thin);//设置下边框style.setborderleft(hssfcellstyle.border_thin);//设置左边框style.setborderright(hssfcellstyle.border_thin);//设置右边框style.setbordertop(hssfcellstyle.border_thin);//上边框style.setalignment(hssfcellstyle.align_center);// 居中//获取国际化文件string employeecode = requestcontext.getmessage(employeecode);             string employeename = requestcontext.getmessage(employeename);             string orgname = requestcontext.getmessage(orgname);             string startdate = requestcontext.getmessage(start.date);             string enddate = requestcontext.getmessage(end.date);             string coursecode = requestcontext.getmessage(coursecode);             string coursename = requestcontext.getmessage(coursename);             string sessionname = requestcontext.getmessage(sessionname);             list<employeetrainhistorymodel> list = null;try {//查询数据库中共有多少条数据                            query.settotalitem(employeetrainhistoryservice.fetchcountemployeetrainhistorybyquery(query));                int page_size = 100000;// 定义每页数据数量int list_count =query.gettotalitem();//总数量除以每页显示条数等于页数int export_times = list_count % page_size > 0 ? list_count / page_size+ 1 : list_count / page_size;                     //循环获取产生每页数据for (int m = 0; m < export_times; m++) { query.setneedqueryall(false); query.setpagesize(100000);//每页显示多少条数据query.setcurrentpage(m+1);//设置第几页 list=employeetrainhistoryservice.getemployeetrainhistorybyquery(query);//新建sheet sheet sheet = null; sheet = workbook.createsheet(system.currenttimemillis()+ coursecompany+m);// 创建属于上面sheet的row,参数0可以是0~65535之间的任何一个,row header = sheet.createrow(0); // 第0行// 产生标题列,每个sheet页产生一个标题 cell cell; string[] headerarr = new string[] { employeecode, employeename, orgname, startdate, enddate, coursecode, coursename, sessionname, hoursnunber };for (int j = 0; j < headerarr.length; j++) { cell = header.createcell((short) j); cell.setcellstyle(style); cell.setcellvalue(headerarr[j]); }// 迭代数据 if (list != null && list.size() > 0) {                                 int rownum = 1;                                 for (int i = 0; i < list.size(); i++) {                                      employeetrainhistorymodel history=list.get(i);                                          sheet.setdefaultcolumnwidth((short) 17);                                      row row = sheet.createrow(rownum++);                                      row.createcell((short) 0).setcellvalue(                                              history.getemployeecode());                                      row.createcell((short) 1).setcellvalue(                                              history.getemployeename());                                      row.createcell((short) 2)                                              .setcellvalue(history.getorgname());                                     if (history.gettrainbegintime() != null) {                                          row.createcell((short) 3).setcellvalue(                                                  dateutil.tostring(history.gettrainbegintime()));                                      } else {                                          row.createcell((short) 3).setcellvalue();                                      }                                     if (history.gettrainendtime() != null) {                                          row.createcell((short) 4).setcellvalue(                                                  dateutil.tostring(history.gettrainendtime()));                                      } else {                                          row.createcell((short) 4).setcellvalue();                                      }                                      row.createcell((short) 5).setcellvalue(                                              history.getcoursecode());                                      row.createcell((short) 6).setcellvalue(                                              history.getcoursename());                                      row.createcell((short) 7).setcellvalue(                                              history.getsessionname());                                     if (history.gethoursnumber() != null)                                          row.createcell((short) 8).setcellvalue(                                                  history.gethoursnumber().tostring());                                  }                              }                                                            list.clear();                          }                                         } catch (exception e) {                 e.printstacktrace();             }try {                 workbook.write(os);                 os.close();             } catch (exception e) {// todo auto-generated catch block                e.printstacktrace();             }         } catch (ioexception e) {             e.printstacktrace();         }     }
4.如何高效导出数据分页已实现,大数据量导出数据,势必要考虑效率问题,怎么才能去压榨时间?apache poi既然提供了导出excel的方法,想必也考虑到了效率问题,查看官方文档      果不其然,看文档,大概意思就是说sxssf在必须生成大型电子表格时使用,堆空间有限  官方提供了2种方法:
1.  sxssfworkbook wb = new sxssfworkbook(100);  // keep 100 rows in memory, exceeding rows will be flushed to disk   
2.sxssfworkbook wb = new sxssfworkbook(-1);   // turn off auto-flushing and accumulate all rows in memory
值100  在内存中保留100行,超过行将被刷新到磁盘
值-1表示无限制访问。 在这种情况下所有,没有被调用flush()刷新的记录可用,用于随机访问。
文章在最后说,当临时文件过大时,可使用setcompresstempfiles方法进行压缩,
比较贪心,这里我用了两个,一个用来设置临时文件,另一个用来输入数据,测试数据为30w数据,结果如图,不过还是感觉花费时间太多,不知道是不是我的程序写的有问题,知道的小伙伴,留个言吧!
以上就是如何将百万数据分成多个sheet页?的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product