Apache POI處理Excel文件

maweiliang發表於2019-03-04

    前一段時間Java處理Excel檔案都是使用JXL這個庫,後來發現這個庫並不支援xlsx這種高版本的格式,並且不能處理大量的資料,就找到了POI這個庫

1:Apache POI 是什麼

    Apache POI專案的任務是根據Office Open XML標準(OOXML)和Microsoft的OLE 2複合文件格式(OLE2)建立和維護Java API,以處理各種檔案格式。簡而言之,可以使用Java讀取和寫入Microsoft Excel檔案。此外,您可以使用Java讀取和寫入Microsoft Word和Microsoft PowerPoint檔案

1.1 Apache POI環境

    從poi.apache.org/download.ht… 下載最新的POI庫,之後解壓,獲取我們需要的jar

1.2 建立一個SHEET

建立一個sheet的步驟時首先必須來建立一個工作簿物件(XSSFWorkbook),第二不就是在使用XSSFWorkbook物件建立一個sheet

//創件一個工作簿
XSSFWorkbook workbook = new XSSFWorkbook(); 
//建立一個電子表格
XSSFSheet spreadsheet = workbook.createSheet("Sheet Name");複製程式碼

XSSFWorkbook類:可以對對Excel進行讀寫,它相容.xls和.xlsx格式,支援office的2007或者更高版本,
HSSFWorkbook類:可以對對Excel進行讀寫,它相容.xls格式,不支援高版本的office
所以一般我們會使用XSSFWorkbook來操作表格,看看如何向單元格里儲存資料

public class WriteSheetTest {

 private static final String PATH = "WriteSheet.xlsx"; //檔案路徑

 public static void main(String[] args) throws Exception {
      FileInputStream fis = new FileInputStream(PATH);
      //建立一個工作簿
      XSSFWorkbook workbook = new XSSFWorkbook();
      //建立一個電子表格
      XSSFSheet sheet = workbook.createSheet("mySheet");
      //行物件
      XSSFRow row ;
      for(int r = 0 ;r<3;r++) {
         //1.建立一個行物件
          row = sheet.createRow(r);
          for(int c = 0;c<3;c++) {
              //2.建立一個單元格
              Cell cell = row.createCell(c);
              cell.setCellValue(r+c);
          }
      }
      FileOutputStream fos = new FileOutputStream(PATH);
      workbook.write(fos);
      workbook.close();
  }
}複製程式碼

上面的程式中建立了名字為mySheet的電子表格,寫了三行三列的資料,POI中使用XSSFRow物件表示行物件,使用XSSFRow row = sheet.createRow(r);建立一個行物件,引數是行號,Cell表示一個單元格物件,可以使用行物件XSSFRow建立一個單元格格物件,Cell cell = row.createCell(c);引數是列號。

1.3 讀取一個SHEET

public class Readsheet 
{
   static XSSFRow row;

public static void main(String[] args) throws Exception 
   {
      FileInputStream fis = new FileInputStream(
      new File("WriteSheet.xlsx"));
      //開啟需要讀取的檔案
      XSSFWorkbook workbook = new XSSFWorkbook(fis);
      //按照SHEET的名稱讀取一個電子表格
      XSSFSheet sheet = workbook.getSheet("mySheet");
//      int size = sheet.getLastRowNum();
//      System.out.println(size);
//      int s= sheet.getPhysicalNumberOfRows();
//      System.out.println(s);
      //獲取一個行的迭代器
      Iterator<Row> rowIterator = sheet.rowIterator();
      while(rowIterator.hasNext()) {
           row = (XSSFRow) rowIterator.next();
           Iterator<Cell> cellIterator = row.cellIterator();
           while(cellIterator.hasNext()) {
               Cell cell = cellIterator.next();
               switch(cell.getCellTypeEnum() ) {
               case NUMERIC:
                  double val = cell.getNumericCellValue();
                  System.out.print(val+"		");
                  break ;
               case STRING:
                   String str = cell.getStringCellValue();
                   System.out.print(str+"		");

               }
           }
           System.out.println();
      }
      fis.close();
   }
}複製程式碼

執行結果:
0.0    1.0    2.0
1.0    2.0    3.0
2.0    3.0    4.0
這裡需要注意,在讀取單元格的值時需要先判斷資料型別,不然獲取資料會報資料型別錯誤。

相關文章