目前我在jsp页面上使用了如下的代码: response.setHeader("Content-disposition", "attachment; filename=print_tmp.xls");
这样的话,当浏览器访问页面的时候。就会给出可以下载excel的提示框。
这个很容易做。 但是由于现在从数据库查询出来的数据量太大了,用一个excel中一个sheet是存不了。
一个excel中的一个sheet只能存放65535条记录。如果超过的话,则无法打开的。所以我想把超过65535的其他数据存到同一个excel中的第二个sheet。如何处理数据量大时导入excel问题,我自己想了一些思路。如下:第一种思路:
可不可以使用类似下面的代码:
response.setHeader("Content-disposition", "attachment; filename=print_tmp.xls");在数据量超过65535的情况下,跳出的excel框中已经自动的增加了另一个sheet了。不用我做太多的处理。
只是使用类似的命令。第二种思路:
   就是可以用多个excel来存的。不一定要使用同一个excel中的多个sheet。
   例如第一个excel存65535.第二个excel存另外的数据。
   这样的话,当在页面上点击导出excel按钮时,弹出两个提示框。其中在第一个提示框中点击保存按钮后
   可以把65535条记录存到excel。接着可以在第二个提示框中,点击保存按钮,把其他的数据保存到另外一个excel中
   
   备注:
     目前我是使用这种思路做的,但是还是只能弹出一个提示框,我是这样做的,
     当我访问projectExcel.jsp时,就会弹出一个提示框,提示可以下载excel。所以我在这个页面上嵌套了一段javascipt代码,目的是再次的访问projectExcel.jsp,好可以再弹出一个提示框,但是始终无法成功的。因为javascipt根本没有执行。      请问高手该如何弹出两个提示框呢?第三中思路:
   就是在页面上点击导出excel按钮后,使用后台的代码把数据存到某个excel上,此时可以使用一些jar包来生成多个sheet。
  这样的话,用一个excel就可以保存大量的数据了。
   但是这样的话,有一个缺点,就是用户无法自己指定要在哪个位置保存excel了。用户体验不是很好的。
关于导出excel时,由于数据量太大的情况,做好该如何处理呢?除了考虑技术,还得考虑用户体验。如果我的第一种思路可以的话,当然是最好了。但估计希望渺茫。不知道该怎么办。请高手指教一下。

解决方案 »

  1.   

    用第3种吧。后台用poi或者jxl生成文件,前台让它下载去。点生成文件的时候给他个等待画面,这种效果感觉最好。生成好的文件,相当于让他下载你服务器上一个文件啊,跟你任意网站下载文件时另存为一样的,可以选择路径。
      

  2.   

    第一种,第二种均实现不了,第三种
    参考
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileNotFoundException; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.util.List; 
    import java.util.Locale; 
    import jxl.Cell; 
    import jxl.Sheet; 
    import jxl.Workbook; 
    import jxl.WorkbookSettings; 
    import jxl.format.Colour; 
    import jxl.read.biff.BiffException; 
    import jxl.write.Label; 
    import jxl.write.WritableSheet; 
    import jxl.write.WritableWorkbook; 
    import jxl.write.WriteException; 
    import jxl.write.biff.RowsExceededException; 
    /* 
    * java 操作EXCEL文件的类,需集合jxl.jar包 
    * 读取并显示EXCEL数据  , 向EXCEL文件内写入数据 * 
    */ 
    public class ExcelUtils { /* public static void main(String[] args) { 
    System.out.println(":===="); 
    File file = new File("E:\\Book1.xls"); 
    ExcelUtils eu = new ExcelUtils(); 
    eu.readExcel(file, 0); System.out.println(":===="); 
    File file = new File("E:\\Book2.xls"); ExcelUtils eu = new ExcelUtils();
    String[] title = {"xingming" , " nianling "}; 
    eu.addDateToExcelFile(file, null, "jerry.gao", title); }*/ public ExcelUtils() { 
    super(); 
    // TODO Auto-generated constructor stub 

    //读取EXCEL 文件 ,num 为第几张sheet , 将结果显示出来 
    public void readExcel(File file, int num) { try { 
    Workbook wb = Workbook.getWorkbook(file); 
    Sheet sheet = wb.getSheet(num); //获取第几张SHEET表 
    for (int r = 0; r < sheet.getRows(); r++) { 
    for (int c = 0; c < sheet.getColumns(); c++) { 
    System.out.print(sheet.getCell(c, r).getContents() + "  |  "); 

    System.out.print("\n"); 

    } catch (BiffException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } } 
    /* 
    * 添加数据生产EXCEL文件 
    *  file 为生成的EXCEL文件 , list 添加的数据集合 ,sheetname 工作表名 ,title 为列名 
    */ 
    public void addDateToExcelFile(File file, List list, String sheetname, 
    String[] title) {
    try { 
    if (file.exists()) { 
    if (file.delete()) { 

    }
    WorkbookSettings wbs = new WorkbookSettings(); 
    wbs.setLocale(new Locale("zh", "CN")); 
    workbook = Workbook.createWorkbook(file, wbs); 
    WritableSheet sheet = workbook.createSheet(sheetname, 0);   //创建第一张sheet, 名字为sheetname
    workbook.setColourRGB(Colour.BLUE, 0xff, 0, 0); 
    Label lb = null; //添加列的名称 
    for(int c = 0 ; c < title.length; c ++ ){ 
    sheet.setColumnView(c, 40);                //设置列的宽度 , 前参数为第几列 , 后参数为列宽 
    lb = new Label(c , 0 , title[c]);    //添加列名 
    sheet.addCell(lb); 
    }     //添加数据 
    for(int r = 0 ; r < list.size() ; r++){ 
    sheet.setRowView(r, 18);  //设置行的高度 , 前参数为第几行 , 后参数为行高 
    lb = new Label(0 , r+1 , list.get(r).toString());  //前参数为第几列 后参数为第几行
    sheet.addCell(lb); 
    } workbook.write(); 
    workbook.close(); } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (RowsExceededException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (WriteException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } } 
    private WritableWorkbook workbook; 
      

  3.   

    用第3种,我一直使用的是poi,感觉很不错的。而且在到处excel的时候,可以让他当成为下载文件一样,会提示用户选择保存的位置,这些都不是问题。关键是到处的时候,使用专用的jar包。不论是效率,还是易用性,安全性,都比你自己写好多了。
      

  4.   

    先在服务器端生成xls,这样你就可以控制多个sheet了,然后页面跳转 指向到这个文件,web就自动提示用户下载了
      

  5.   

    个人喜欢使用jxl,在服务器端先根据需求生成所有的sheet,前端提供下载
      

  6.   

    http://www.javaeye.com/topic/240053
      

  7.   

    现在用的是第三种。已经实现了。
    但是速度很慢。我是直接查到70000条数据,放到ResultSet当中。然后再一条一条的存到
    excel。这样非常的慢。因为我得把rs中的一行数据存到excel一行后。才可以调用rs.next();这样的话。实在太慢了。
    有好的办法吗?
      

  8.   

    用第三种,更具需要后台生成提供下载
    生成Excel建议使用jxl,我空间文章验证jxl和poi写入性能:
    http://blog.csdn.net/jarvis_java/archive/2009/12/02/4925379.aspx数据大,写数据分批次写入,要给用户良好体验的话,页面加上进度条就可以了。
      

  9.   

    用poi第一种方式是可以实现的.
       循环填充数据的时候做判断可以产生多个sheet页
       大于65535的数据可以新建一个sheet页
      

  10.   

    个人建议:
        如果数据量庞大,并且到处时候用户等待时间过长,可以作为任务处理,不要及时处理,生成excel过程由后台程序去做,用户只需要先去做别的事,过会儿再来下载生成好的excel,此任务即可结束。你也可以让用户选择分excel放还是分sheet放,后台怎么处理就由你自己操控了
        俗话说:“用户可以忍受几个小bug,但别想让用户在屏幕前忍受漫长的等待”呵呵