struts2导出excel(2011

假设,在多用户的时候,一个用户刚好点导出excel准备下载.另外一个用户也点导出excel.这个时候后面那个用户产生的临时excel文件将覆盖前面那个用户产生的.很明显,这样的话第一个用户生成的excel文件将是第二个用户生成的.错误不可避免...
解决这个问题的办法有两个.第一个,根绝临时文件..就是在产生输入流的时候不用临时文件...这样当然就不会有上面所说的问题..第二个办法是,产生的临时文件是随机命名的...当用户下载完成以后删除这个临时文件...这样的话产生冲突的概率几乎为零.(下面我们将用62种字符字符组成10位字符串作为文件名..产生同名的概率只有六十二的十次方分之一.可以说根本就是0概率) ]

两种方法struts.xml的共同配置:

            <result name="exportFile" type="stream">
                <!-- 指定下载文件的文件类型 -->
                <param name="contentType">
                    application/vnd.ms-excel
                </param>
                <!-- 指定下载文件的文件位置 -->
                <param name="inputName">downloadFile</param>
                <param name="contentDisposition">
                    attachment;filename="${downloadFileName}"
                </param>
                <!-- 指定下载文件的缓冲大小 -->
                <param name="bufferSize">4096</param>
            </result>


第二种方法:

    将创建好的 HSSFWorkbook workbook通过输出流写入exportfile文件里

    //然后再通过exportfile产生输入流

    public InputStream getDownloadFile() {

        try {
            downloadFile = new FileInputStream(new File(downloadPath));
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
            return null;
        }
        return downloadFile;
    }

        this.downloadFileName = "club.xls";//获得文件名
        File file = new File(this.downloadFileName);//创建文件
        this.downloadPath = file.getAbsolutePath();//得到文件绝对路径

        //....以下写入创建的excel表(workbook)....//

        FileOutputStream fw = new FileOutputStream(exportfile); //建立输出流
        workbook.write(fw);//将excel写入文件
        fw.flush();
        fw.close();




第一种方法:

这里,我们使用了ByteArrayOutputStream和 ByteArrayInputStream类...处理的思想是,将HSSFWorkbook 写入ByteArrayOutputStream.然后用ByteArrayOutputStream来转换为字节流..然后再将字节流转换为 ByteArrayInputStream ..至此,我们就在内存中将excel转换成了输入流..

代码如下

ByteArrayOutputStream os = new ByteArrayOutputStream();
  //....此处写入创建的excel表(workbook)....//
  try {
   wb.write(os);
  } catch (IOException e) {
   e.printStackTrace();
  }
 
  byte[] b = os.toByteArray();
 
  ByteArrayInputStream in = new ByteArrayInputStream(b);

  return in;

  然后把in传给this.setDownloadFile(in);   同样需要定义this.downloadFileName="club.xls";

  public InputStream getDownloadFile() {return downloadFile;}





创建excel表:

            HSSFWorkbook workbook = new HSSFWorkbook();//创建工作薄
            HSSFSheet sheet = workbook.createSheet();//创建工作表

            sheet.setDefaultColumnWidth((short) 20);//设置工作表宽度


            HSSFRow bodyRow = sheet.createRow(i);//创建第i行


            HSSFCell cell = bodyRow.createCell(j);//创建第j列的单元格

            cell.setEncoding(HSSFCell.ENCODING_UTF_16);

            cell.setCellStyle(cellStyle);
            cell.setCellValue(value);





读取excel表:


            FileInputStream fileStream = new FileInputStream(getUpload());//将文件写入缓冲
            POIFSFileSystem poiFs = new POIFSFileSystem(fileStream);
            HSSFWorkbook wb = new HSSFWorkbook(poiFs);
            HSSFSheet sheet = wb.getSheetAt(0);// 根据excel下标名称获得对应的sheet.也可以
                                                  wb.getSheetAt("0");就是取Excel中的第一个sheet

            int lastRowNum = sheet.getLastRowNum();// 获得总共有多少行数据
            row.getLastCellNum();// 获得一行有多少单元格
            HSSFRow row = sheet.getRow(i);// 获得第i行
            HSSFCell cell = row.getCell((short)j);// 获得j列单元格数据

            List<HSSFCell> cellList = new ArrayList<HSSFCell>();
            cellList.add(cell);//采用两for循环,将一行的数据add进cellList

            Schedule sch = new Schedule();
            sch.setStartdate((String)this.getCellString(cellList.get(0)));//挨个set进Schedule表

注:具体在ScheduleSet.java?action=upExcel;

你可能感兴趣的:(struts2)