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(下载)方法如下:


import java.text.SimpleDateFormat;

import java.util.Date;
import java.util.LinkedHashMap;

import javax.servlet.http.HttpServletResponse;

import oracle.apps.fnd.framework.OAException;
import oracle.apps.fnd.framework.OAViewObject;
import oracle.apps.fnd.framework.webui.OAPageContext;
import oracle.apps.fnd.util.URLEncoder;

import oracle.cabo.ui.data.DataObject;

import oracle.jbo.Row;

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


  /*
   * 导出数据到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页
    XSSFWorkbook hWorkbook = new XSSFWorkbook();
    XSSFSheet hSheet = hWorkbook.createSheet();

    // 设置excel列宽
    for (int i = 0; i < columnMap.size(); i++) {
      hSheet.setColumnWidth(i, 5000);
    }
    System.out.print("设置excel列宽完成");
    // 设置excel头行样式
    Object[] keyColumn = columnMap.keySet().toArray();
    XSSFCellStyle headerStyle = hWorkbook.createCellStyle();
    headerStyle.setFillPattern(Short.parseShort("1"));
headerStyle.setFillForegroundColor(new XSSFColor(new Color(255,200,0)));
);

    // 创建头行
    createExcelRow(hSheet, headerStyle, keyColumn, 0);
    System.out.print("创建头行完成");
    // 将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
      XSSFRow xRow = hSheet.createRow(++xRowCnt);
      for (int j = 0; j < keyColumn.length;   j++) {
      
        // 讲数据插入单元格
        XSSFCell xCell = xRow.createCell(j);
        Object attrValue = 
          row.getAttribute((String)columnMap.get(keyColumn[j]));
        if (attrValue instanceof oracle.jbo.domain.Number) {
          xCell.setCellValue(((oracle.jbo.domain.Number)attrValue).doubleValue());
        } else if (attrValue instanceof oracle.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 || "".equals(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(XSSFSheet xSheet, XSSFCellStyle xCellStyle, 
                                    Object[] columnValues, int rowIndex) {
    XSSFRow xRow = xSheet.createRow(rowIndex);
    for (int i = 0; i < columnValues.length; i++) {
      XSSFCell 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) {
    DataObject sessionDictionary = 
      pageContext.getNamedDataObject("_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开发中。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怎么演

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值