本文提供一个基于ADF Face组件开发样例工程,实现Excel导入开发中常见的处理。

    1.文件上传处理

    2.读取Excel单元格内容


本文是基于“ADF Faces导出Excel文件【附样例工程】”编写的,会省去许多细节部分的介绍,若理解困难的话,可以先看导出Excel部分。


实现的基本思路:

1. 应用ADF Faces的文件上传组件完成用户文件选取的交互,将其与后台ManagedBean建立值绑定,在表单提交时,文件上传组件封装了上传的实现细节并将处理后的文件对象传入至ManagedBean的属性中。

2. 应用命令按钮触发表单提交事件,触发ManagedBean完成事件处理过程。

3.由ManagedBean完成文件内容的读取和后续处理。

注:需要设定JSP页面中Form标签的文件上传属性为true,否则文件不会被处理。



下面是样例工程的创建过程:


创建工程名为DemoExcelImp

wKioL1i_cGqgV-EuAADJBtc6Sls638.png-wh_50


创建页面imp.jsp

wKiom1i_cGvx2YInAAAuKB4H6fU074.png-wh_50


拖入文件上传组件(Input File组件)和按钮组件

wKioL1i_cGvS1IeXAAFzdv2091U347.png-wh_50


通过为按钮设定Action属性,创建后台ManagedBean,并完成提交事件的注册

wKioL1i_cGzjFqnMAAFQw_QAdbQ799.png-wh_50

wKiom1i_cG2xnAcyAADDn_U_D_U780.png-wh_50


为文件上传组件与Bean之间建立值绑定,将文件对象绑定至Bean的file属性中。

注意Bean的属性类型选取为UploadFile而不是File。

wKioL1i_cG6yso-0AAFHbiXOEGo966.png-wh_50


点击空白区即视为选取Form组件,为其设定UsesUpload属性为true,否则不会处理文件上传组件。

wKiom1i_cHCjDOMrAACGGx7TI1M863.png-wh_50


至此JSP页面编写完毕,一下是其源代码部分:

wKiom1i_cG7AHU6uAABb6-4Nk4Y042.png-wh_50

<f:view>
    <af:document title="imp.jsp" id="d1">
        <af:form id="f1" usesUpload="true">
            <af:inputFile label="文件上传组件" id="if1"
            value="#{bean1.file}"/>
            <af:commandButton text="提交文件" id="cb1"
            action="#{bean1.doUploadFile}" />
        </af:form>
    </af:document>
</f:view>


为工程引入POI库处理Excel内容。

wKioL1i_cG_Bz7qbAADWLKtGe0Q617.png-wh_50


编写管理Bean的事件处理代码,内容:

  1. 根据Excel不同版本建立Workbook对象

  2. 读取第1个sheet页面的第1行的每一个单元格

  3. 输出单元格的字符串内容

wKiom1i_cG-DFVceAAEVHqvZvYs704.png-wh_50

    public String doUploadFile() throws IOException {
        if (file == null) {
            return "";
        }
        
        Workbook wb = null;
        //区分Excel文件版本2003或2007+
        if (file.getFilename().matches(".*xls$")) {
            wb = new HSSFWorkbook(file.getInputStream());
        } else if (file.getFilename().matches(".*xlsx$")) {
            wb = new XSSFWorkbook(file.getInputStream());
        } else {
            System.out.println("文件类型错误!可接受Excel,请下载文件模板!");
            return null;    
        } 
        
        //输出第1个sheet页中第1行数据的字符串内容     
        Sheet sheet = wb.getSheetAt(0);
        int rownum = sheet.getFirstRowNum();
        Row row = sheet.getRow(rownum);
        for(int i=0;i<row.getLastCellNum();i++){
            Cell c = row.getCell(i);
            c.setCellType(Cell.CELL_TYPE_STRING);
            System.out.println(c.getStringCellValue());
        }
        return null;
    }


运行imp.jsp,要处理的Excel有2行数据,预期处理第一行数据。

wKioL1i_cHDDtzUMAACWIfYXwZU058.png-wh_50


选取文件,点击提交按钮,查看JDeveloper控制台输出的内容。

wKioL1i_cHGyiknkAAEZdtXzOzc209.png-wh_50