JAva Excel動的テンプレートファイル圧縮パッケージのダウンロード

6465 ワード

1プロジェクトによって必要とされ、ダイナミックテンプレート圧縮パッケージをダウンロードする機能が必要であり、実現過程はいくつかのステップに分かれている.
   1)テンプレートファイルをロードし、テンプレートファイルをワークブックオブジェクトにカプセル化し、業務の必要に応じて関連データを相応の位置に書く
   2)workbookオブジェクトのwriteメソッドを呼び出し,変更したExcelファイルを出力ストリームを介して一時的なExcelファイルに書き込む.
   3)Java JDKが持参したZipoutputStreamは中国語が文字化けしてしまうので、apacheのZipoutputStreamを使って一時Excelファイルを圧縮する
   4)Excel圧縮ファイルをバイトストリーム形式でクライアントに書き込む
   5)各種流を閉じる
   6)Excel一時ファイルおよび圧縮パッケージのクリア
実装コードは次のとおりです.
Workbook wb = null;
        try {
        	List<DivisionMapDto> divisionMapList = divisionMapController.getDivisionMapInfo(memberId, taskId);
        	if(null == divisionMapList || divisionMapList.size() == 0){
        		throw new BadRequestException("400","         ");
        	}
        	String excelTemplateName = reportType + "ValidateTemplate.xlsx";
            FileSystemConfigReaderImpl configReader = (FileSystemConfigReaderImpl) ConfigUtil.getConfigReader();
            String basePath = configReader.getBasePath();
            String separator = System.getProperty("file.separator");
            basePath = basePath + separator;
            String fileName = basePath + excelTemplateName; 
            wb = new XSSFWorkbook(new FileInputStream(fileName));    
            Sheet sheet = wb.getSheetAt(0);
            if(sheet == null){
            	throw new BadRequestException("400","      sheet    ,    ,reportType=" + reportType);
            }
            int[] divisionColumnIndexs = ExcelColumnMatchUtils.getDivsionInfoLocation(reportType);
            if(divisionColumnIndexs[0] == -1 || divisionColumnIndexs[1] == -1){
            	throw new BadRequestException("400","                       ,        ,    ,reportType=" + reportType);
            }
            //excel               writingCount   
            DivisionMapDto divisionMapDto = null;
            Cell cell = null;  
            Row row = null;
            int rowNum = sheet.getLastRowNum();
            for(int i = 0 ; i < divisionMapList.size(); i++){
            	divisionMapDto = divisionMapList.get(i);
            	if(null == divisionMapDto){
            		continue;
            	}
            	rowNum++;
            	row = sheet.createRow(rowNum);
            	//      
            	cell = row.createCell(divisionColumnIndexs[0]);
            	cell.setCellValue(divisionMapDto.getLocalCode());
            	//      
            	cell = row.createCell(divisionColumnIndexs[1]);
            	cell.setCellValue(divisionMapDto.getLocalName());  
            	//      
            	if(divisionColumnIndexs[2] != -1){
            		cell = row.createCell(divisionColumnIndexs[2]);
                	cell.setCellValue(divisionMapDto.getStandardCode()); 
            	}
            	//      
            	if(divisionColumnIndexs[3] != -1){
            		cell = row.createCell(divisionColumnIndexs[3]);
            		cell.setCellValue(divisionMapDto.getStandardName());   
            	}
            }
            String reportName = null;
            try{
            	reportName = reportListController.getReportNameByReportType(reportType);
            } catch (CarsmartException e){
            	logger.error("                ", e); 
            }
            reportName = reportName == null ? "  " : reportName;   
            String tempFileName = basePath + reportName + ".xlsx";
            FileOutputStream fos = new FileOutputStream(new File(tempFileName));
            wb.write(fos);
            reportName += ".zip";  
            String zipFileName = basePath + reportName;
            try{
            	zipFile(zipFileName, tempFileName); 
            } catch (Exception e){
            	logger.error("        ", e);  
            }
            //          IE      
            //URLEncoder.encode(reportName, "UTF-8")              
            response.addHeader("Content-Disposition", "attachment; filename=" + new String(reportName.getBytes("gb2312"), "iso-8859-1")); 
    		response.setContentType("application/octet-stream");
            OutputStream outputStream = response.getOutputStream();
            BufferedInputStream bin = new BufferedInputStream(new FileInputStream(zipFileName));   
            byte[] buf = new byte[1024];
            int len = 0;
            while((len = bin.read(buf)) > 0){
            	outputStream.write(buf,0,len);
            }    
            outputStream.flush();  
            outputStream.close();       
            bin.close();
            //      
            File file = new File(zipFileName);
            if(file.exists()){
            	file.delete();
            }
            //      
            file = new File(tempFileName);  
            if(file.exists()){
            	file.delete();
            }
            return null;   
        } catch (CarsmartException e) {
            logger.error("            ", e);  
            return null; 
        } catch (IOException e){
        	logger.error("          IO  ", e);
        	return null;
        }
    /**
     * @Description       
     * @param out
     * @param f
     * @param base
     * @param first
     * @throws Exception
     */
    private void zip(ZipOutputStream out, File f, String base,
			boolean first) throws Exception {
		if (first) {
			if (f.isDirectory()) {
				out.putNextEntry(new ZipEntry("/"));
				base = base + f.getName();
				first = false;
			} else
				base = f.getName();
		}
		if (f.isDirectory()) {
			File[] fl = f.listFiles();
			base = base + "/";
			for (int i = 0; i < fl.length; i++) {
				zip(out, fl[i], base + fl[i].getName(), first);
			}
		} else {
			out.putNextEntry(new ZipEntry(base));
			FileInputStream in = new FileInputStream(f);
			int b;
			while ((b = in.read()) != -1) { 
				out.write(b);
			}
			in.close();
		}
	}
	
    /**
     * @Description     
     * @param zipFileName
     * @param inputFileName
     * @throws Exception
     */
	private void zipFile(String zipFileName, String inputFileName)
			throws Exception { 
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
		out.setEncoding("gbk");//                                 
		File inputFile = new File(inputFileName);
		zip(out, inputFile, "", true);   
		out.close();  
	}