//获取需要的用户信息  
lu = comm.findalluser();
  for (User u : lu) {
//查出所有客户信息
     la = salesaccountdao.listpallAccount(u.getUserid());
     if (la.size() > 0) {
        accountLists.addAll(la);
     }
  }
//将查处的所有客户信息导出成excel(一下循环费时)
  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).getRes());
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;
}
}
}
//就在生成excel的嵌套循环中,浪费了大量时间,总的600条数据,打印时间却是110秒钟,请高手指点一二,不胜感激!!

解决方案 »

  1.   


    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.getRes());
                        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);
            }
    改这样试试看。
      

  2.   

    你自己先看看时间主要浪费在哪一句或哪些句上了,
    试试加判断if (row == null) {
    row = sheet1.createRow(i);
    }if (cell == null) {
    cell = row.createCell(j);
    }
      

  3.   


    1)List遍历不要用get(i),这个很慢。 我改成了。
    for (User user : accountLists) 
    2)这个被多做了很多遍,list的size多大就做了多少次。 
    其实只要1次就行。 for (j = 0; j < 12; j++) {
                // 设置每个sheet每一行的宽度,自动,根据需求自行确定
                sheet1.autoSizeColumn(j + 1, true);
    }
      

  4.   


    因为你的excel的列数固定12行,行数未知,
    比如你的行数是1000行,
    用你的写法,autoSizeColumn设置操作1000*12 = 12000 次而lL的写法是无论多少行就是设置12次。
    你做了无谓的操作
      

  5.   

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

  6.   


    我的是一个用户下有多个客户,需要查询多个用户下的所有客户,我用每个用户的id循环找到客户,每个id都要访问一次数据库,确实很费时,请问如何查询多个用户下的所有客户呢?