写在前面
想尽快的使用HSSF和XSSF对电子表格进行操作吗?这个指南正是您所需要的。现在稳定的POI的版本为3.6。但最近在查阅POI的资料时发现,虽然资料很多,但是大都局限于2.x的版本,3.x中文资料比较少,查阅apache网站的时候发现了这份文档,看着不错,就翻译了一下,希望能够对大家有所帮助。由于时间仓促难免有翻译不当之处,还望不吝赐教,费神指正,感激不尽!
岑坚(高凯)
2010-08-08
目录
创建新工作簿
创建新sheet页
鉴于现在大部分应用是以Maven作为构建,可在pom.xml中加入POI的maven依赖,但是maven现在只支持到3.1版本,对3.5版本还不提供支持。
<dependency>
<groupId>poi</groupId>
<artifactId>poi</artifactId>
<version>3.1-FINAL</version>
</dependency>
因此可以直接在Apache 官网下载POI3.5版本,作为reference library加入工程中
Workbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
Workbook wb = new XSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
wb.write(fileOut);
fileOut.close();
Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
Sheet sheet1 = wb.createSheet("new sheet");
Sheet sheet2 = wb.createSheet("second sheet");
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
//创建一列,在其中加入多个单元格,列索引号从0开始,单元格的索引号也是从0
//开始
Row row = sheet.createRow((short)0);[1]
//创建一个单元格,并在其中加入内容.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// 上面的多行代码可以采用下面的一行代码的方式完成
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(
createHelper.createRichTextString("This is a string"));
row.createCell(3).setCellValue(true);
//将输出流写入一个文件
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
//创建一列,在其中加入多个单元格,列索引号从0开始,单元格的索引号也是从0
//开始
Row row = sheet.createRow(0);
//创建一个单元格,并在其中加入内容. 第一个单元格的内容不设置为日期时间格式
Cell cell = row.createCell(0);
cell.setCellValue(new Date());
//我们将第二个单元格设置成日期(和时间)格式。对这个文件来说创建一个新的单//元格格式非常重要,除非您能够不用内置的格式来渲染所有的单元格
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(
createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);
//也可以用java.util.Calendar来设置单元格格式
cell = row.createCell(2);
cell.setCellValue(Calendar.getInstance());
cell.setCellStyle(cellStyle);
// 将输出流写入一个文件
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow((short)2);
row.createCell(0).setCellValue(1.1);
row.createCell(1).setCellValue(new Date());
row.createCell(2).setCellValue(Calendar.getInstance());
row.createCell(3).setCellValue("a string");
row.createCell(4).setCellValue(true);
row.createCell(5).setCellType(HSSFCell.CELL_TYPE_ERROR);
//将输出流写入一个文件
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
有些时候您仅希望遍历一个sheet页中所有的列或是一列中所有的单元格。这可以用一个简单的for循环来实现。
幸运的是,这非常简单。Row对象定义了一个CellIterator内部类用来处理单元格的遍历(可以通过调用row.cellIterator() 来获得Iterator 对象),另外,Sheet 对象提供了一个rowIterator()方法对所有列进行遍历
除此之外,Sheet 和Row对象都实现了java.lang.Iterable 接口,因此如果您用的是Java 1.5 及以上版本,您可以简单的调用内置的“foreach”来实现。请看:
Sheet sheet = wb.getSheetAt(0);
for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext(); ) {
Row row = rit.next();
for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext(); ) {
Cell cell = cit.next();
// Do something here
}
}
使用Java1.5 foreach 循环遍历列和单元格
有时候您仅希望遍历一个sheet页中所有的列或是一列中所有的单元格。如果您使用的是java1.5或是以上版本,那么这将十分的方便,因为它支持新的 foreach 循环。
幸运的是,这非常的简单。Sheet 和Row对象都实现了java.lang.Iterable 接口支持foreach 循环。对Row对象来说它支持通过调用CellIterator内部类用来处理单元格的遍历,对于Sheet对象来说它提供了一个rowIterator()方法对所有列进行遍历。
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
// Do something here
}
}
要想获得单元格内的内容,您首先要要知道单元格内容的格式(比如您想获得从字符格式的单元格内获得一个数字,您将得到的是NumberFormatException错误)。因此,您将希望能够切换到该单元格格式,然后为获得该单元格内容调用合适的getter方法。
在以下的代码中我们将对一个sheet页中的所有单元格进行遍历,并打印出单元格的引用和内容。
// import org.apache.poi.ss.usermodel.*;
Sheet sheet1 = wb.getSheetAt(0);
for (Row row : sheet1) {
for (Cell cell : row) {
CellReference cellRef = new CellReference(row.getRowNum(), cell.getCellNum());
System.out.print(cellRef.formatAsString());
System.out.print(" - ");
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();
}
}
}
对于大多数的文本提取需求,标准的ExcelExtractor类应该能够满足您所有的需求。
InputStream inp = new FileInputStream("workbook.xls");
HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));
ExcelExtractor extractor = new ExcelExtractor(wb);
extractor.setFormulasNotResults(true);
extractor.setIncludeSheetNames(false);
String text = extractor.getText();
对于特殊的文本提取,比如将xls文件内容写入csv文件,可以参考:
/src/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java 文件
单元格的各种对齐方式
public static void main(String[] args) throws Exception {
Workbook wb = new XSSFWorkbook(); //或者是 new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow((short) 2);
row.setHeightInPoints(30);
createCell(wb, row, (short) 0, XSSFCellStyle.ALIGN_CENTER, XSSFCellStyle.VERTICAL_BOTTOM);
createCell(wb, row, (short) 1, XSSFCellStyle.ALIGN_CENTER_SELECTION, XSSFCellStyle.VERTICAL_BOTTOM);
createCell(wb, row, (short) 2, XSSFCellStyle.ALIGN_FILL, XSSFCellStyle.VERTICAL_CENTER);
createCell(wb, row, (short) 3, XSSFCellStyle.ALIGN_GENERAL, XSSFCellStyle.VERTICAL_CENTER);
createCell(wb, row, (short) 4, XSSFCellStyle.ALIGN_JUSTIFY, XSSFCellStyle.VERTICAL_JUSTIFY);
createCell(wb, row, (short) 5, XSSFCellStyle.ALIGN_LEFT, XSSFCellStyle.VERTICAL_TOP);
createCell(wb, row, (short) 6, XSSFCellStyle.ALIGN_RIGHT, XSSFCellStyle.VERTICAL_TOP);
//将输出流写入一个文件
FileOutputStream fileOut = new FileOutputStream("xssf-align.xlsx");
wb.write(fileOut);
fileOut.close();
}
/**
*创建一个单元格并为其设定指定的对齐方式.
*
* @param wb 工作簿
* @param row 单元格所在的列
* @param column 单元格所在的行索引号
* @param halign 单元格的水平对齐方式.
*/
private static void createCell(Workbook wb, Row row, short column, short halign, short valign) {
Cell cell = row.createCell(column);
cell.setCellValue(new XSSFRichTextString("Align It"));
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(halign);
cellStyle.setVerticalAlignment(valign);
cell.setCellStyle(cellStyle);
}
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
//创建一列,在其中加入多个单元格,列索引号从0开始,单元格的索引号也是从0
//开始.
Row row = sheet.createRow(1);
//创建一个单元格,并在其中加入内容.
Cell cell = row.createCell(1);
cell.setCellValue(4);
//设置单元格边框为四周环绕.
CellStyle style = wb.createCellStyle();
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
</
我的博客地址:www.aitawo.com