首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

poi导出excel循环效率低上的有关问题

2012-09-13 
poi导出excel循环效率低下的问题Java code//获取需要的用户信息lu comm.findalluser()for (User u : lu

poi导出excel循环效率低下的问题

Java code
//获取需要的用户信息  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]


[解决办法]
Java code
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比较大时,这个方法可能相对较慢,所以只需在最后,为指定的列执行一次该方法即可。
所以楼主上面写的,每循环一次都执行一次该方法就会比较慢了。
另外该方法是对一列的,所以一列执行一次也就够了,不用一列的多个单元格都去执行,多余了。

再有:

Java code
for (User u : lu) {     la = salesaccountdao.listpallAccount(u.getUserid());     if (la.size() > 0) {        accountLists.addAll(la);     }  }
[解决办法]
探讨

引用:
salesaccountdao.listpallAccount 这个方法是怎么做的?针对每个userid都执行一次数据库查询吗?如果这样那也太慢了。
不要循环,就执行一次数据库查询,把所有的user 的信息都查出来,然后赋给accountLists


我的是一个用户下有多个客户,需要查询多个用户下的所有客户,我用每个用户的id循环找到客户,每个id都要访问一……

热点排行
Bad Request.