项目开发过程中经常遇到要求导出页面的数据,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开发中。
以上若有不对之处,请不吝指正。若有其他更好的方法,望不吝赐教。