POI:操作Excel

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);

POI:操作Excel_第1张图片
层次结构

#读取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);

行高列宽

POI:操作Excel_第2张图片
行高 列宽
// 设置全局列宽
sheet.setDefaultColumnWidth(20 * 256);
// 设置全局行高
sheet.setDefaultRowHeightInPoints(30);

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

你可能感兴趣的:(POI:操作Excel)