zoukankan      html  css  js  c++  java
  • OAF客制化代码导出页面数据到Excel文件

    项目开发过程中经常遇到要求导出页面的数据,oaf有标准控件支持,但是灵活性不够,这里介绍一下导出数据到excel的客制化方法,有不正确的地方,欢迎大家指正。

    co中processFormRequest方法中捕捉导出按钮事件,然后调用ExportUtility类中的导出方法。

    代码:

    // 导出按钮事件
    
    if("export".equals(pageContext.getPrameter(EVENT_PARAM))) {
    
      //  文件名
    
      String fileName = "xxx.xls";
    
      // 获取需要导出的数据集
    
      LinkedHashMap map = new LinkedHashMap();
    
      OAViewObject viewObject =(OAViewObject)am.findViewObject("xxxxVO1");
    
      map.put("excel字段名1", "vo字段名1");
    
      map.put("excel字段名2", "vo字段名2");
    
      // 调用ExportUtil类中的导出方法
    
      ExportUtil.exportExcel(pageContext, viewObject, map, fileName);
    
    }

    ExportUtil类中的exportExcel(下载)方法如下:

    /*
    
     * 导出数据到excel通用方法
    
     * @param pageContext
    
     * @param viewObejct 数据源
    
     * @param columnMap 列及其对于数据源关系
    
     * @param fileName  文件名
    
    */
    
    public static void exportExcel(OAPageContext pageContext,
    
                                                OAViewObject viewObject,
    
                                                LinkedHashMap columnMap,
    
                                                String fileName) {
    
      // 判断参数是否正确
    
      if(pageContext == null ||
    
         viewObject == null ||
    
         columnMap.size() < 1) {
    
        return;
    
      }
    
     
    
      // 穿件sheet页
    
      HSSFWorkbook hWorkbook = new HSSFWorkbook();
    
      HSSFSheet hSheet = hWorkbook.createSheet();
    
     
    
      // 设置excel列宽
    
      for(int i = 0; i < columnMap.size(); i++) {
    
        hSheet.setColumnWidth(i, 5000);
    
      }
    
     
    
      // 设置excel头行样式
    
      Object[] keyColumn = columnmap.keySet().toArray();
    
      HSSFCellstyle headerStyle = hWorkbook.createCellstyle();
    
      headerStyle.setFillPattern(Short.parseShort("1"));
    
      headerStyle.setFillForegroundColor(HSSFColor.YELLOW.index);
    
     
    
      // 创建头行
    
      createExcelRow(hSheet, headerStyle, keyColumn, 0);
    
     
    
      // 将vo中的数据插入到excel中
    
      int xRowCnt = 0;
    
      viewObject.setRangeStart(0);
    
      viewObject.setRangeSize(viewObject.getRowCount());
    
      for(int i = 0; i < viewObject.getRowCount(); i++) {
    
        Row row = viewObject.getRowAtRangeIndex(i);
    
        // 循环每一行每一列插入excel
    
        HSSFRow xRow = hSheet.createRow(++xRowCnt);
    
        for(int j = 0; j< keyColumn.length, j++) {
    
          // 讲数据插入单元格
    
          HSSFCell xCell = xRow.createCell(j);
    
          Object attrValue = row.getAttribute((String)columnMap.get(keyColumn[j]));
    
          if(attrValue instansof oracle.jbo.domain.Number) {
    
            xCell.setCellValue((oracle.jbo.domain.Number)attrValue).doubleValue(1);
    
          } else if(attrValue instansof oralce.jbo.domain.Date) {
    
             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    
             Date date = ((oracle.jbo.domain.Date)attrValue).getValue();
    
             xCell.setCellValue(dateFormat.format(date));
    
          } else {
    
            xCell.setCellValue((String)attrValue)
    
          }
    
        }
    
      }
    
      // 处理下载文件名
    
      if(fileName == null || "".equlse(fileName.trim())) {
    
        fileName = "DownloadExcel.xls";
    
      } else if(!"xls".equalsIgnoreCase(fileName.substring(fileName.lastIndexOf(".")+1))) {
    
        fileName = fileName + ".xls";
    
      }
    
      // 弹出下载框
    
      downloadExcel(pageContext, hWorkbook, fileName);
    
    }

    ExportUtil类中的exportExcel(下载)方法会调用如下两个方法

    /*
    
      * 创建头行
    
      *@param xSheet
    
      *@param xCellStyle
    
      *@param columnValues
    
      *@param rowIindex
    
    */
    
    public static void createExcelRow(HSSFSheet xSheet,
    
                                                      HSSFCellStyle xCellStyle,
    
                                                      Object[] columnValues,
    
                                                      int rowIndex) {
    
      HSSFRow xRow = xSheet.createRow(rowIndex);
    
      for(int i = 0; i< columnValues.length; i++) {
    
        HSSFCell xCell = xRow.createCell(i);
    
        if(xCellStyle != null) {
    
          xCell.setCellStyle(xCellStyle);
    
        }
    
        xCell.setCellValue(columnvalues[i].toString());
    
      }
    
    }
    
     
    
    /*
    
      *弹出下载excel文档框
    
      *param pageContext
    
      *param xWorkbook
    
      *param fileName
    
    */
    
    public static void downloadExcel(OAPageContext pageContext,
    
                                                    Workbook xWorkbook,
    
                                                    String fileName) {
    
      DateObject sessionDictionary = pageContext.getNameDateObject("_SessionParameters");
    
      HttpServletResponse response = (HttpServletResponse)sessionDictionary.selectValue(null, "HttpServletResponse");
    
      response.setContentType("application/vnd.ms-excel; charset = UTF-8");
    
      // 创建excel工作薄
    
      try{
    
        response.setHeader("Content-disposition", "attachment; filename="+URLEncoder.encode(fileName, "UTF-8"));
    
        xWorkbook.write(response.getOutputStream());
    
      } catch(Exception e) {
    
        throw new OAException(e.getMessage());
    
      }
    
    }

    以上下载的方法同样使用于Java开发中。

    以上若有不对之处,请不吝指正。若有其他更好的方法,望不吝赐教

  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/running-fish/p/9472757.html
Copyright © 2011-2022 走看看