前一段時間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
這裡需要注意,在讀取單元格的值時需要先判斷資料型別,不然獲取資料會報資料型別錯誤。