對於一個程序員來說,文件操作是經常遇到的,尤其是對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(); } } }效果圖如下: