poi导出excel循环效率低下的问题
//获取需要的用户信息 lu = comm.findalluser(); for (User u : lu) {//查出所有客户信息 la = salesaccountdao.listpallAccount(u.getUserid()); if (la.size() > 0) { accountLists.addAll(la); } }//将查处的所有客户信息导出成excel[color=#FF0000](一下循环费时)[/color] int i=0,j=0,size = accountLists.size(); for (i = 1; i < size; i++) { // 获得这个sheet的第i行 row = sheet1.createRow(i); for (j = 0; j < 12; j++) { // 设置每个sheet每一行的宽度,自动,根据需求自行确定 sheet1.autoSizeColumn(j + 1, true); // 获得这一行的每j列 cell = row.createCell(j); switch (j) { case 0: cell.setCellValue(accountLists.get(i).getName()); break; case 1: cell.setCellValue(accountLists.get(i).getAddress()); break; case 2: cell.setCellValue(accountLists.get(i).getCity()); break; case 3: cell.setCellValue(accountLists.get(i).getCreatetime()); break; case 4: cell.setCellValue(accountLists.get(i).getCustomertype()); break; case 5: cell.setCellValue(accountLists.get(i).getDescription()); break; case 6: cell.setCellValue(accountLists.get(i).getProvince()); break; case 7: cell.setCellValue(accountLists.get(i).getStatecode()); break; case 8: cell.setCellValue(accountLists.get(i).getFax()); break; case 9: cell.setCellValue(accountLists.get(i).getIndustrycode()); break; case 10: cell.setCellValue(accountLists.get(i).getRemarks()); break; case 11: cell.setCellValue(accountLists.get(i).getWebsiteurl()); break; case 12: cell.setCellValue(accountLists.get(i).getTelephone()); break; case 13: cell.setCellValue(accountLists.get(i).getUserByOwnerid().getName()); break; } } }[color=#FF0000]//就在生成excel的嵌套循环中,浪费了大量时间,总的600条数据,打印时间却是110秒钟,请高手指点一二,不胜感激!![/color]int i=0,j=0,size = accountLists.size(); for (User user : accountLists) { // 获得这个sheet的第i行 row = sheet1.createRow(i); for (j = 0; j < 12; j++) { // 获得这一行的每j列 cell = row.createCell(j); switch (j) { case 0: cell.setCellValue(user.getName()); break; case 1: cell.setCellValue(user.getAddress()); break; case 2: cell.setCellValue(user.getCity()); break; case 3: cell.setCellValue(user.getCreatetime()); break; case 4: cell.setCellValue(user.getCustomertype()); break; case 5: cell.setCellValue(user.getDescription()); break; case 6: cell.setCellValue(user.getProvince()); break; case 7: cell.setCellValue(user.getStatecode()); break; case 8: cell.setCellValue(user.getFax()); break; case 9: cell.setCellValue(user.getIndustrycode()); break; case 10: cell.setCellValue(user.getRemarks()); break; case 11: cell.setCellValue(user.getWebsiteurl()); break; case 12: cell.setCellValue(user.getTelephone()); break; case 13: cell.setCellValue(user.getUserByOwnerid().getName()); break; } } i++; } for (j = 0; j < 12; j++) { // 设置每个sheet每一行的宽度,自动,根据需求自行确定 sheet1.autoSizeColumn(j + 1, true); }
[解决办法]
api:
void autoSizeColumn(int column,boolean useMergedCells)
This process can be relatively slow on large sheets, so this should normally only be called once per column, at the end of your processing.
sheets比较大时,这个方法可能相对较慢,所以只需在最后,为指定的列执行一次该方法即可。
所以楼主上面写的,每循环一次都执行一次该方法就会比较慢了。
另外该方法是对一列的,所以一列执行一次也就够了,不用一列的多个单元格都去执行,多余了。
再有:
for (User u : lu) { la = salesaccountdao.listpallAccount(u.getUserid()); if (la.size() > 0) { accountLists.addAll(la); } }
[解决办法]