對於一個程序員來說,文件操作是經常遇到的,尤其是對Excel文件的操作。
在這裡介紹一下我在項目中用到的一個操作Excel的工具——POI。關於POI的一些概念,網絡上很多,詳細信息大家可以自行百度,我在這裡只做簡單介紹。POI是apache的類庫,主要是為java開發人員提供對Office文件(word、ppt、Excel)處理的支持。我這裡主要給出幾個例子來說明演示一下。
准備工作
我用的版本是3.10.1,需要的jar有:
dom4j.jarlog4j-1.2.13.jarpoi-3.10.1-20140818.jarpoi-ooxml-3.10.1-20140818.jarpoi-ooxml-schemas-3.10.1-20140818.jarpoi-scratchpad-3.10.1-20140818.jar 代碼示例1.讀取Excelpublic void testReadExcel() {
try {
// 讀取Excel
Workbook wb = new HSSFWorkbook(new FileInputStream("d:\\2.xls"));
// 獲取sheet數目
for (int t = 0; t < wb.getNumberOfSheets(); t++) {
Sheet sheet = wb.getSheetAt(t);
Row row = null;
int lastRowNum = sheet.getLastRowNum();
// 循環讀取
for (int i = 0; i <= lastRowNum; i++) {
row = sheet.getRow(i);
if (row != null) {
// 獲取每一列的值
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
String value = getCellValue(cell) ;
if(!value.equals("")){
System.out.print(value + " | ");
}
}
System.out.println();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
用到了一個方法:/***
* 讀取單元格的值
*
* @Title: getCellValue
* @Date : 2014-9-11 上午10:52:07
* @param cell
* @return
*/
private String getCellValue(Cell cell) {
Object result = "";
if (cell != null) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
result = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
result = cell.getNumericCellValue();
break;
case Cell.CELL_TYPE_BOOLEAN:
result = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_FORMULA:
result = cell.getCellFormula();
break;
case Cell.CELL_TYPE_ERROR:
result = cell.getErrorCellValue();
break;
case Cell.CELL_TYPE_BLANK:
break;
default:
break;
}
}
return result.toString();
}
解釋一下,首先將文件讀入到工作簿Workbook中,Workbook是一個接口,他有2個實現:HSSFWorkbook和XSSFWorkbook。前者是用來讀取97-03版的Excel,擴展名為xls,後者是讀取07及以後的版本,擴展名為xlsx。讀入到workbook中,然後循環所有的sheet,在sheet循環所有的有效行和有效列。其中sheet.getLastRowNum()獲得最後一行的索引值(從0開始),而sheet.getPhysicalNumberOfRows()則是獲取的最後一行的行號(從1開始)。這裡要注意的是循環列不是在sheet中循環,而是在row中循環。



public void testWriteExcel() {
String excelPath = "d:/3.xls";
Workbook workbook = null;
try {
// XSSFWorkbook used for .xslx (>= 2007), HSSWorkbook for 03 .xsl
workbook = new HSSFWorkbook();// XSSFWorkbook();//WorkbookFactory.create(inputStream);
} catch (Exception e) {
System.out.println("創建Excel失敗: ");
e.printStackTrace();
}
if (workbook != null) {
Sheet sheet = workbook.createSheet("測試數據");
Row row0 = sheet.createRow(0);
for (int i = 0; i < 6; i++) {
Cell cell = row0.createCell(i, Cell.CELL_TYPE_STRING);
cell.setCellValue("列標題" + i );
//sheet.autoSizeColumn(i);//自動調整寬度
}
for (int rowNum = 1; rowNum < 10; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int i = 0; i < 6; i++) {
Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);
cell.setCellValue("單元格" + String.valueOf(rowNum + 1)
+ String.valueOf(i + 1));
}
}
try {
FileOutputStream outputStream = new FileOutputStream(excelPath);
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
System.out .println("寫入Excel失敗: ");
e.printStackTrace();
}
}
}
效果圖如下: