导航
导航

POI学习笔记

最近项目中遇到大量Excel操作,特别学习了下POI文档。先做下总结也方便以后复习。

HSSF和XSSF是POI项目对Excel文件操作的两种实现,其中HSSF支持Excel 97(-2007),XSSF支持Excel 2007。而且使用这两个所导入的jar包是不一样的。如果导入poi-3.10.1.jar是HSSF实现,导入poi-ooxml-3.10.1.jar则是XSSF实现。XSSF比起HSSF拥有更简单的操作,但是内存消耗更大,在POI 3.8bate3之后POI提供了一个更低内存消耗的SXSSF实现。

这里我主要是用到的HSSF实现,有兴趣的可以学习下文档的其他部分。

  • 创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //new Worlbook
    Workbook wb = new HSSFWorkbook();
    fileOut = new FileOutputStream("workbook.xls");
    //new Sheet
    //命名中不要包含 0x0000 0x0003 : \ * ? / [ ]
    //可以用org.apache.poi.ss.util.WorkbookUtil类的createSafeSheetName(String nameProposal)
    //创建一个安全的名字
    Sheet sheet = wb.createSheet("new sheet");

    //new Cell
    // Create a row and put some cells in it. Rows are 0 based.
    Row row = sheet.createRow((short)0);
    //
    CreationHelper createHelper = wb.getCreationHelper();
    // Create a cell and put a value in it.
    Cell cell = row.createCell(0);
    cell.setCellValue(1);

    // Or do it on one line.
    row.createCell(1).setCellValue(1.2);
    row.createCell(2).setCellValue(createHelper.createRichTextString("This is a string"));
    row.createCell(3).setCellValue(true);

    //new Date Cells
    CellStyle cellStyle = wb.createCellStyle();
    cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
    Cell dateCell = row.createCell(4);
    dateCell.setCellValue(new Date());
    dateCell.setCellStyle(cellStyle);


    wb.write(fileOut);
    fileOut.close();
  • 读取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    //这里有很多方法得到一个Excel的对象
    //1,WorkbookFactory.create(new FileInputStream("workbook.xls"))

    //2,NPOIFSFileSytem fs = new NPOIFSFileSystem(new File("workbook.xls"));
    //HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(),false);
    ////上面方式2需要操作完成之后关闭文件
    Workbook wb = WorkbookFactory.create(new File("workbook.xls"));

    //得到第1页
    Sheet sheet = wb.getSheetAt(0);
    //遍历所有的row
    for (Row row : sheet) {
    for (Cell cell : row) {
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING://字符串
    System.out.println(cell.getRichStringCellValue().getString());
    break;
    case Cell.CELL_TYPE_NUMERIC:
    //日期类型
    if (DateUtil.isCellDateFormatted(cell)) {
    System.out.println(cell.getDateCellValue());
    } else {
    //数字类型
    System.out.println(cell.getNumericCellValue());
    }
    break;
    case Cell.CELL_TYPE_BOOLEAN:
    System.out.println(cell.getBooleanCellValue());
    break;
    case Cell.CELL_TYPE_FORMULA:
    //表达式类型
    System.out.println(cell.getCellFormula());
    break;
    default:
    System.out.println();
    }
    }
    }