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开发中。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过以下步骤实现EBS OAF多个头表数据通过TemplateHelper导出PDF并生成到一个PDF中: 1. 在OAF页面上创建一个按钮或菜单项,用于触发导出操作。 2. 在后台处理程序中,获取需要导出的多个头表数据。可以通过SQL查询或调用相应的API来实现。 3. 使用TemplateHelper类创建一个PDF模板,该模板包含需要在PDF中显示的头表数据的格式和布局。 4. 遍历多个头表数据,将每个头表数据与PDF模板进行合并,生成单独的PDF片段。 5. 将所有PDF片段合并为一个完整的PDF文件。 以下是一个示例代码片段,演示如何使用TemplateHelper类实现上述功能: ```java import oracle.apps.fnd.common.WebAppsContext; import oracle.apps.fnd.framework.server.OAApplicationModule; import oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean; import oracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBean; import oracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBeanV2; import oracle.apps.fnd.framework.webui.beans.message.OAMessageStyledTextBean; import oracle.apps.fnd.framework.webui.beans.message.OAMessageTextInputBean; import oracle.apps.fnd.framework.webui.beans.table.OATableBean; import oracle.apps.fnd.framework.webui.beans.table.OATableColumnBean; import oracle.apps.fnd.framework.webui.beans.table.OATableRowBean; import oracle.apps.fnd.framework.webui.beans.table.layout.OATableLayoutBean; import oracle.apps.xdo.XDOException; import oracle.apps.xdo.oa.util.TemplateHelper; import oracle.apps.xdo.template.FOProcessor; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.sql.SQLException; import java.util.Iterator; import java.util.List; import java.util.Map; public class PDFExporter { public static byte[] exportToPDF(List<Map<String, Object>> headerDataList) throws IOException, XDOException, SQLException { // 创建一个PDF模板 String templatePath = "path/to/your/template.xdo"; TemplateHelper templateHelper = new TemplateHelper(templatePath); ByteArrayOutputStream pdfOutput = new ByteArrayOutputStream(); // 遍历多个头表数据 for (Map<String, Object> headerData : headerDataList) { // 将头表数据与PDF模板合并,生成PDF片段 ByteArrayInputStream xmlData = new ByteArrayInputStream(getXMLData(headerData)); FOProcessor processor = templateHelper.getFOProcessor(xmlData); processor.setOutput(pdfOutput); processor.generate(); // 添加新的页面分隔符 pdfOutput.write("\f".getBytes()); } return pdfOutput.toByteArray(); } private static byte[] getXMLData(Map<String, Object> headerData) { // 根据头表数据生成对应的XML格式数据 // 返回XML数据的字节数组 } } ``` 请根据实际情况调整代码,并确保在运行之前正确配置PDF模板的路径。此示例仅提供了基本的框架,您需要根据您的具体需求进行适当的修改和扩展。 注意:以上代码片段仅用于演示目的,可能需要根据您的实际环境和要求进行适当调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怎么演

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

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

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

打赏作者

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

抵扣说明:

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

余额充值