posts - 5,  comments - 7,  trackbacks - 0

          生成Excel并在客戶端下載的JSF實現
            Excel這個大家幾乎每天都用到的工具,為我們的工作帶來了極大的方便。在現在的B/S系統中,特別是很多大型的辦公系統中,大量的報表需要處理,導出EXCEL的功能就顯得尤為重要了。導出Excel已經是相當成熟的技術了,但是在java中卻不是一件容易的事。特別是在JSF架構的系統中,由于使用的人數和學習的資料都很少,實現導出Excel的功能也頗費周折。由于項目的需要,本人需要實現這樣的功能,經過對大量代碼的改造,實現了JSF下的生成EXCEL并在客戶端實現下載的功能。下面的例子中,我用的是POI來生成Excel。Apache的Jakata項目的POI子項目,目標是處理ole2對象。 POI可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/下載。 編譯好的jar主要有這樣4個:poi包,poi Browser包,poi hdf包,poi hssf例程包。實際運行時,需要有poi包就可以了。
            在下面的工具類中,我通過private static  void downloadFile(String strfileName)這個方法在生成EXCEL以后實現在客戶端的下載。在這個類中,這個方法就是經過改造的JSF實現。不過這個工具類有個不足之處就是,傳遞給downloadFile(String strfileName)的文件名不支持中文,希望大家注意,也希望各位能給出解決辦法。

          package mj.util.excel; 
            
          import java.io.File; 
            
          import java.io.FileInputStream; 
            
          import java.io.FileOutputStream; 
            
          import java.io.IOException; 
            
          import java.util.List; 
            
          import javax.faces.context.FacesContext; 
            
          import javax.servlet.ServletContext; 
            
          import javax.servlet.ServletOutputStream; 
            
          import javax.servlet.http.HttpServletResponse; 
            
          import org.apache.poi.hssf.usermodel.HSSFCell; 
            
          import org.apache.poi.hssf.usermodel.HSSFCellStyle; 
            
          import org.apache.poi.hssf.usermodel.HSSFFont; 
            
          import org.apache.poi.hssf.usermodel.HSSFRow; 
            
          import org.apache.poi.hssf.usermodel.HSSFSheet; 
            
          import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
            
          /** 
            * 本工具類解決了java到處Excel,并同時實現了客戶端下載 不足之處:下載方法傳入的文件名不支持中文 
            * 
            * 
          @author vincent 
            * 
            
          */
           
            
          public class ExcelUtils 
            
          private static String sheetName = "data"
            
          private HSSFWorkbook wb; 
            
          private HSSFSheet sheet; 
            
          private HSSFRow row; 
            
          private HSSFCell cell; 
            
          private HSSFFont font; 
            
          private HSSFCellStyle cellStyle; 
            
          private FileOutputStream fileOut; 
            
          public ExcelUtils() 
            wb 
          = new HSSFWorkbook(); 
            }
           
            
          /** 
            * 
          @param excelName 
            * excel名稱。 
            * 
          @param list 
            * 這個list里面存放的是對象數組。數組元素可以轉化為字符串顯示的。這個對象數組一般對應數據庫里的幾列。 
            * 
          @param firstRowValue 
            
          */
           
            
          public void outputExcel(String excelName, List list, String[] firstRowValue) 
            
          try 
            
          this.createSheet(firstRowValue); 
            
          this.setValueToRow(excelName, list); 
            }
           catch (Exception ex) 
            System.out.print(ex); 
            }
           
            
          // System.out.println("文件名是:" + excelName); 
            downloadFile(excelName); 
            }
           
            
          public void outputExcel(String excelName, List list) 
            
          try 
            
          this.setValueToRow(excelName, list); 
            }
           catch (Exception e) 
            
          // TODO: handle exception 
            }
           
            downloadFile(excelName); 
            }
           
            
          private void setValueToRow(String excelName, List list) 
            
          // 獲得JSF上下文環境 
            FacesContext context = FacesContext.getCurrentInstance(); 
            
          // 獲得ServletContext對象 
            ServletContext servletContext = (ServletContext) context 
            .getExternalContext().getContext(); 
            
          // 取得文件的絕對路徑 
            excelName = servletContext.getRealPath("/UploadFile"+ "/" + excelName; 
            System.out.println(
          "生成文件的路徑是:" + excelName); 
            Object[] obj; 
            
          try 
            
          for (int i = 0; i 
            row 
          = sheet.createRow(i + 1); 
            obj 
          = (Object[]) list.get(i); 
            
          this.createCell(row, obj); 
            }
           
            fileOut 
          = new FileOutputStream(excelName); 
            wb.write(fileOut); 
            }
           catch (Exception ex) 
            System.out.print(
          "生成報表有誤:" + ex); 
            }
           finally 
            
          try 
            fileOut.flush(); 
            fileOut.close(); 
            }
           catch (Exception e) 
            System.out.println(
          "ExcelUtil.setValueToRow()"); 
            }
           
            }
           
            }
           
            
          private void createSheet(String[] firstRowValue) 
            
          try 
            sheet 
          = wb.createSheet(ExcelUtils.sheetName); 
            row 
          = sheet.createRow(0); 
            font 
          = wb.createFont(); 
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
            cellStyle 
          = wb.createCellStyle(); 
            cellStyle.setFont(font); 
            
          for (int i = 0; i 
            cell 
          = row.createCell((short) i); 
            cell.setCellStyle(cellStyle); 
            cell.setEncoding(HSSFCell.ENCODING_UTF_16); 
            cell.setCellValue(firstRowValue[i]); 
            }
           
            }
           catch (Exception ex) 
            System.out.print(ex); 
            }
           
            } 
            
          private void createCell(HSSFRow row, Object[] obj) 
            
          try 
            
          for (int i = 0; i 
            cell 
          = row.createCell((short) i); 
            cell.setEncoding(HSSFCell.ENCODING_UTF_16); 
            cell.setCellValue(obj[i].toString()); 
            }
           
            }
           catch (Exception ex) 
            System.out.print(ex); 
            }
           
            } 
            
          /** 
            * 
            * 功能說明:根據提供的文件名下載文件,不支持中文文件名 
            * 
            * 此方法由yongtree添加,實現文件生成后的下載 
            * 
            * 
          @param strfileName 
            * String 
            * 
          @return void 
            
          */
           
            
          private static void downloadFile(String strfileName) 
            
          try 
            
          // 獲得JSF上下文環境 
            FacesContext context = FacesContext.getCurrentInstance(); 
            
          // 獲得ServletContext對象 
            ServletContext servletContext = (ServletContext) context 
            .getExternalContext().getContext(); 
            
          // 取得文件的絕對路徑 
            String excelName = servletContext.getRealPath("/UploadFile"+ "/" 
            
          + strfileName; 
            File exportFile 
          = new File(excelName); 
            HttpServletResponse httpServletResponse 
          = (HttpServletResponse) FacesContext 
            .getCurrentInstance().getExternalContext().getResponse(); 
            ServletOutputStream servletOutputStream 
          = httpServletResponse 
            .getOutputStream(); 
            httpServletResponse.setHeader(
          "Content-disposition"
            
          "attachment; filename=" + strfileName); 
            httpServletResponse.setContentLength((
          int) exportFile.length()); 
            httpServletResponse.setContentType(
          "application/x-download"); 
            
          // httpServletResponse.setContentType("application/vnd.ms-excel"); 
            byte[] b = new byte[1024]; 
            
          int i = 0
            FileInputStream fis 
          = new java.io.FileInputStream(exportFile); 
            
          while ((i = fis.read(b)) >0
            servletOutputStream.write(b, 
          0, i); 
            }
           
            }
           catch (IOException e) 
            e.printStackTrace(); 
            }
           
            FacesContext.getCurrentInstance().responseComplete(); 
            }
           
            } 
          posted on 2008-11-27 11:36 Vincent-chen 閱讀(614) 評論(0)  編輯  收藏 所屬分類: JSF
          主站蜘蛛池模板: 怀安县| 嵊泗县| 正宁县| 扬州市| 嵊州市| 漳州市| 白沙| 沅江市| 丰台区| 剑阁县| 湟中县| 河北区| 庆云县| 滨州市| 遂宁市| 巫溪县| 乐山市| 江津市| 利津县| 南充市| 昌吉市| 澄城县| 鹿邑县| 涡阳县| 尖扎县| 常德市| 土默特右旗| 壶关县| 彩票| 南溪县| 盘锦市| 南宫市| 徐闻县| 界首市| 策勒县| 厦门市| 中方县| 合山市| 赤峰市| 缙云县| 梁山县|