美文网首页
POI:操作Excel

POI:操作Excel

作者: no_today | 来源:发表于2017-10-16 14:58 被阅读0次

    Apache POI 工具包操作 Excel
    测试用的版本是 3.16,目前版本最新为3.17。
    2017年10月16日

    大纲

    • POI 工具包简介
    • 导包
    • 核心类
    • 对象的创建
    • 读取Excel数据
    • 写出Excel文件
    • 格式化Excel style

    #POI 工具包

    JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。

    1. JXL 只能操作Excel 95、97、 2000也即以.xls为后缀的excel。
    2. POI 可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。

    #导包 点击下载 poi 3.16

    • commons-collections4-4.1.jar lib目录
    • log4j-1.2.17.jar lib目录
    • poi-3.16.jar
    • poi-ooxml-3.16.jar
    • poi-ooxml-schemas-3.16.jar
    • xmlbeans-2.6.0.jar ooxml-lib目录

    #核心类

    每个接口都有两个实现类,分别用于 07前 HSS 版本和 07和07后 XSS 版本的操作,类名只是 H 和 X 的区别,下面不再赘述。

    HSSFWorkbook 07前版本 .xls
    XSSFWorkbook 07和07后版本 .xlsx

    1. Workbook 接口 工作簿
    2. Sheet 接口 工作表
    3. Row 接口
    4. Cell 接口 单元格

    #对象的创建

    // 1. 创建工作簿对象
    XSSFWorkbook workbook = new XSSFWorkbook();
    
    // 2. 从工作簿对象创建工作表对象
    XSSFSheet sheet = workbook.createSheet("成员表");
    
    // 3. 从工作表对象创建行对象 从0开始
    XSSFRow row = sheet.createRow(0);
    
    // 4. 从行对象创建具体单元格对象 从0开始
    XSSFCell cell = row.createCell(0);
    

    层次结构

    #读取Excel数据

    这里用的是接口而非类,WorkbookFactory.create() 工厂方法会识别文件版本返回相应的子对象。这样避免两个版本两份代码的问题。

    public void readExel() throws IOException {
        String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls";
        FileInputStream fileInputStream = new FileInputStream(fileName);
    
        // 1. 创建工作簿
        Workbook workbook = WorkbookFactory.create(fileInputStream);
    
        // 2. 创建工作类
        Sheet sheet = workbook.getSheetAt(0);
    
        // 3. 创建行 , 第三行 注意:从0开始
        Row row = sheet.getRow(2);
    
        // 4. 创建单元格, 第三行第三列 注意:从0开始
        Cell cell = row.getCell(2);
        String cellString = getValue(cell);
    
        System.out.println("第三行第三列的值为 : " + cellString );
    
        workbook.close();
        fileInputStream.close();
    }
    

    POI 需要按照数据类型获取数据,如果类型错误会抛异常,这里我们将表格数据全用String类型获取。

    // 把单元格数据以字符串形式输出
    private String getString(Cell cell) {
        int cellType = cell.getCellType();
    
        switch (cellType) {
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            case Cell.CELL_TYPE_BOOLEAN:
                return cell.getBooleanCellValue() + "";
            case Cell.CELL_TYPE_NUMERIC: {
                // 为了美观 去掉数值类型末尾的.0
                String value = cell.getNumericCellValue() + "";
                return (value.charAt(value.length() - 2) == '.' ? value.substring(0, value.length() - 2) : value);
            }
            default:
                return "";
        }
    }
    

    #输出Excel文件

    public void outputExcel() throws IOException {
        // 1. 创建工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
    
        // 2. 创建工作类
        HSSFSheet sheet = workbook.createSheet("hello world");
    
        // 3. 创建行 , 第三行 注意:从0开始
        HSSFRow row = sheet.createRow(2);
    
        // 4. 创建单元格, 第三行第三列 注意:从0开始
        HSSFCell cell = row.createCell(2);
        cell.setCellValue("Hello World");
    
        String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls";
        FileOutputStream fileOutputSteam = new FileOutputStream(fileName);
    
        workbook.write(fileOutputSteam);
        workbook.close();
    
        fileOutputSteam.close();
    }
    

    #格式化Excel style

    ##合并单元格

    CellRanageAddress 类:单元格范围定义类

    由 Sheet 类的 addMergedRegion() 方法添加进Excel。

    // 合并单元格
    /*
     * 单元格范围对象
     * 参1:起始行 0
     * 参2:结束行 1
     * 参3:起始列 0
     * 参4:结束列 1
     */
    CellRangeAddress address = new CellRangeAddress(0, 1, 0, 1);
    sheet.addMergedRegion(address);
    

    起始行和起始列得到左上点 0.0
    结束行和结束列得到右下点 1.1
    包括的范围就是单元格合并的范围

    ##设置单元格样式

    XSSFCellStyle 类:单元格样式类

    由XSSFWorkBook 类的 createCellStyle();方法得到

    单元格居中

    XSSFCellStyle cellStyle = workbook.createCellStyle();
    // 水平居中
    cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    // 垂直居中
    cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    ...
    // 给单元格设置样式
    cell.setCellStyle(cellStyle);
    

    单元格字体

    HSSFFont 类:字体类

    由XSSFWorkBook 类的 createFont();方法得到

    XSSFFont font = workbook.createFont();
    // 粗体
    font.setBold(true);
    // 字体
    font.setFontName("黑体");
    // 字体大小
    font.setFontHeight(12);
    ...
    // 给单元格样式对象添加字体样式
    cellStyle.setFont(font);
    

    行高列宽

    行高 列宽
    // 设置全局列宽
    sheet.setDefaultColumnWidth(20 * 256);
    // 设置全局行高
    sheet.setDefaultRowHeightInPoints(30);
    
    // 设置第 1 列的列宽
    sheet.setColumnWidth(0, 20 * 256);
    // 设置当前行的行高
    row.setHeightInPoints(30);
    

    相关文章

      网友评论

          本文标题:POI:操作Excel

          本文链接:https://www.haomeiwen.com/subject/gzaquxtx.html