ByteArrayInputStream生成excel

假设,在多用户的时辰,一个用户正好点导出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表 

你可能感兴趣的:(ByteArrayInputStream生成excel)