首页 > 代码库 > 如何使用POI对Excel表进行导入和导出

如何使用POI对Excel表进行导入和导出

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    结构:

    HSSF - 提供读写Microsoft Excel格式档案的功能。

    XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

    HWPF - 提供读写Microsoft Word格式档案的功能。

    HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

    HDGF - 提供读写Microsoft Visio格式档案的功能。

    其实使用POI进行导入和导出非常简单,这里需要说明的是,此处只使用HSSF,即只能对Excel2003进行导入和导出,如果要对Excel2007以及更高版本的Excel,则需要使用XSSF

    如何使用POI对Excel进行导入:

    流程:得到workbook对象(即excel文件)--> 根据workbook对象得到sheet对象(即工作薄对象) --> 根据sheet对象得到row对象(即行对象) --> 根据row对象得到cell对象(即单元格对象)

    下面使用grails举例,与java语言类似

    1.在页面处定义一个type为file的input

    2.得到这个文件的输入流

        def excelFile = request.getFile(‘content‘)  //获得Excel文件

        def is = excelFile.getInputStream()  //获得文件输入流

    3.构造workbook对象,把输入流作为参数构造workbook对象

        def workbook = new HSSFWorkbook(is)

    4.构造sheet对象,根据工作薄名字构造sheet对象
        HSSFSheet sheet = workbook.getSheet("工资表")

    5.得到最后的行序号,对所有的行进行迭代

        def currPosition = 0

        StringBuffer buffer = new StringBuffer()

        while(true){
           if(currPosition > sheet.getLastRowNum()){
               break
           else{
               int row = currPosition;
               currPosition ++
               //抓取当前行数据
               buffer.append(getLine(sheet, row)).append("\r");
           }
         }


    //读取每一行数据的方法

    String getLine(HSSFSheet sheet, int row){
        //根据行数取得sheet的一行
        HSSFRow rowline = sheet.getRow(row);
        //获取当前行的列数
        int filedColumns = rowline.getLastCellNum();
        HSSFCell cell = null;
        StringBuffer buffer = new StringBuffer();
        String cellvalue = http://www.mamicode.com/null

        //迭代当前行的每一列,得到所有列的值
        for(int i =0; i < filedColumns; i++){
                cell = rowline.getCell((short)i);
                cellvalue = http://www.mamicode.com/ExcelTool.getCellValue(cell);
                buffer.append(cellvalue).append("\t");
        }
        return buffer.toString();
    }


    //抓取每一个单元格的工具方法

    class ExcelTool {
    public static String getCellValue(HSSFCell cell) {
        String valuehttp://www.mamicode.com/= "";
        if (null == cell)
                return value;
        switch (cell.getCellType()) {

        //分析单元格数据类型
        case Cell.CELL_TYPE_STRING://字符串类型
                value = http://www.mamicode.com/(cell.getStringCellValue() == null) ?"" : cell
                                .getStringCellValue();
                break;
        case Cell.CELL_TYPE_NUMERIC://数值类型

                //数值类型也分为日期类型和普通数值类型
                if(HSSFDateUtil.isCellDateFormatted(cell)){
                    Date date  = cell.getDateCellValue()
                    value = http://www.mamicode.com/date.format("yyyy-MM-dd")
                }else{
                    value = http://www.mamicode.com/CommonTool.NVL(String.valueOf(cell.getNumericCellValue()),"0");
                }
                break;
        //公式类型(此处如果使用getNumericCellValue()方法进行抓取,那么得到的数据将是公式的

        //字面值,而不是公式本身)

        case Cell.CELL_TYPE_FORMULA:               

                BigDecimal bd = new BigDecimal(cell.getNumericCellValue())
                bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP)
                value = http://www.mamicode.com/String.valueOf(bd);
                break;

        //布尔类型
        case Cell.CELL_TYPE_BOOLEAN:
                value = http://www.mamicode.com/cell.getBooleanCellValue() +"";
                break;

        //错误类型
        case Cell.CELL_TYPE_ERROR:
                value = http://www.mamicode.com/cell.getErrorCellValue() +"";
                break;

        //其他类型
        default:
                break;
        }
        return value;
    }
}

    6.此时excel表的数据已经完全导入到程序里面,那么如何处理就看业务需要了

    如何使用POI对Excel进行导出:

    流程:构造一个空文件对象--> 根据文件对象构造一个空的输出流 -->  --> 构造sheet对象 --> 根据sheet对象得到row对象(即行对象) --> 根据row对象得到cell对象(即单元格对象)--> 单元格内填充值

    下面使用grails举例,与java语言类似

    1.File file = new File("工资表");  //构造文件对象

    2.FileOutputStream fos = new FileOutputStream(file);//构造文件输出流对象   

    3.HSSFWorkbook wb = new HSSFWorkbook(); // 构造workbook对象 

    4.HSSFSheet sheet = wb.createSheet("工资表"); // 构造工作薄对象

    5.HSSFRow row1 = sheet.createRow(0); // 构造行对象 

    6.HSSFCell cellA1 = row1.createCell(0, Cell.CELL_TYPE_STRING);//构造单元格对象  

    7.cellA1.setCellValue("工资表"); //在单元格内填充值

    8.wb.write(fos); // 把workbook对象写入到输出流

    9.fos.close();// 关闭输出流

    10.在响应中设置文件头和内容类型,表示响应的是一个excel表格类型

    response.setHeader("Content-disposition", "attachment; fileName=" + new String(fileName.getBytes("utf-8"),"iso8859-1"))
    response.contentType = "application/x-rarx-rar-compressed"

    11.把文件写出到响应中,响应到页面进行下载

    def out = response.outputStream
        def inputStream = new FileInputStream(file)
        byte[] buffer = new byte[1024]
        int i = -1
        while ((i = inputStream.read(buffer)) != -1) {
            out.write(buffer, 0, i)
        }
        out.flush()
        out.close()
        inputStream.close()

ps:此处javaJDK版本为1.7,POI版本为3.7,使用POI需要导poi-3.7-20101029.jar,poi-ooxml-3.7-20101029.jar,poi-ooxml-schemas-3.7-20101029.jar三个包

本文出自 “技术随笔” 博客,请务必保留此出处http://6367966.blog.51cto.com/6357966/1579416

如何使用POI对Excel表进行导入和导出