最近项目中遇到大量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();
}
}
}