在我的程序中,在客户端(jsp页面)输入数据,然后将数据传入serlvet,servlet中调用javaben 中的一个方法,此方法中用POI 来把 客户端传送来的数据保存到一个excel 中里面.   问题是:
1.直接在bean 里面用FileOutputStream 可以生成一个excel文件到服务器的指定路径下.
 但是 ,如何在客户端通过选择保存路径,把excle文件保存到客户端.
//
生成的  excel文件到服务器的指定路径下 ,那么假如我们把这个文件放到服务器根目录下的file下。例如  www/file/a.xls。那么用一个JSP的下载页专门下载这个文件不就行了吗。或者生成后马上调用下载页。  download.jsp?fileurl=file/a.xls

解决方案 »

  1.   

    response.setContentType("application/vnd.ms-excel");   
     OutputStream   os   =   response.getOutputStream();  
     
    HSSFWorkbook wb = new HSSFWorkbook();
    ............wb.write(os);.............
      

  2.   

    呵呵,这个问题,可以利用流来实现,当用户输入数据之后,就把这些数据写入流里面去,之后,再跳到一个servlet里面,设置打开方式为excel,这样,就不用在服务器上先生成一个excel文件,再在jsp页面上去调用这个生成的excel文件,达到动态生成excel文件的目的1:POI处理类
    public class ExportExcel {
        //数据源
        private Vector vector ;

        public ExportExcel(Vector vector){
    this.vector = vector ;
        }

        /**
         * 对Vector数据源将其里面的数据导入到excel表单
         * @param fieldName[] 导出到excel文件里的表头名
         * @param sheetName 工作表的名称
         * @param output java输出流
         */
        public void getExcel(String[] fieldName,String sheetName,OutputStream output){

            //产生工作薄对象
            HSSFWorkbook workbook = new HSSFWorkbook();

            //产生工作表对象
            HSSFSheet sheet = workbook.createSheet();

            //为了工作表能支持中文,设置字符集为UTF_16
            workbook.setSheetName(0, sheetName, HSSFWorkbook.ENCODING_UTF_16);

            //产生一行
            HSSFRow row = sheet.createRow(0);

            //产生单元格
            HSSFCell cell ;

            //写入各个字段的名称
            for(int i=0;i<fieldName.length;i++){
                //创建第一行各个字段名称的单元格
       cell = row.createCell((short)i);
                //设置单元格内容为字符串型
       cell.setCellType(HSSFCell.CELL_TYPE_STRING);
       //为了能在单元格中输入中文,设置字符集为UTF_16
       cell.setEncoding(HSSFCell.ENCODING_UTF_16);
       //给单元格内容赋值
       cell.setCellValue(fieldName[i]);
    }
    System.out.println("vector.size()="+vector.size());
    //写入各条记录,每条记录对应excel表中的一行
    for(int i=0;i<vector.size();i++){
         row = sheet.createRow(i+1);
         Vector v = (Vector)vector.get(i);
         for(int j=0;j<v.size();j++){
    cell = row.createCell((short)j);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(v.get(j).toString());
         }
    }
    try {
        output.flush();
        workbook.write(output);

    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Output is closed");
    }

        }2:servlet类
    public class AcdtExcelServlet extends HttpServlet{    public void doGet            (HttpServletRequestrequest,HttpServletResponseresponse)             
         throws  IOException{
            response.setContentType("application/vnd.ms-excel");
            AcdtExcel db = new AcdtExcel();
            Vector vector = db.getAcdtExcel();
            String[] fieldName = {"系统编号","发生纬度","年平均日交通量"};
            String sheetName = "所有事故信息";
            ExportExcel export = new ExportExcel(vector);
            export.getExcel(fieldName, sheetName, response.getOutputStream());
            response.getOutputStream().flush();
            response.getOutputStream().close();
        }

    }3:在web.xml中配置servlet以上,我写的时候,是利用Vector来作为数据源的,不过你可以根据实际情况,比如说list,Object[][]等等,这些都应该不是问题.
      

  3.   

    yksky(北风)  , 你好, 你的回复似乎可以解决我的问题,  但是我还是有点疑问, 能否 ,QQ上 交流一下, 谢谢了.. 398824651