概述
Excel表格是常用的數據存儲工具,項目中經常會遇到導入Excel和導出Excel的功能。
常見的Excel格式有xls和xlsx。07版本以后主要以基於XML的壓縮格式作為默認文件格式xlsx。新格式主要是使用了OpenXML標准,結合了XML與Zip壓縮技術。在這里就不細說,感興趣的讀者可以自行去查找相關知識。本文將重點以這兩種文件格式的解析來展開。
Excel主要有以下部分組成:
一個Excel相當於一個工作簿(WorkBook);
每個sheet相當於一張表格;
sheet里面又由單元格Cell組成;
操作Excel的方式
Java提供了操作Excel的api JXL(Java Excel API),但是JXL只支持07版本以前,也就是xls后綴的Excel。因此使用中通常使用apache的POI
maven中的POI依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<!-- 07版本以后的格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
其中最頂層接口Workbook;主要有三個實現類XSSFWorkbook、HSSFWorkbook、SXSSFWorkbook。
XSSFWorkbook
XSSFWorkbook主要用於解析xlsx。
@Test
public void testXlsx(){
File file = new File("C:\\Users\\Administrator\\Desktop\\pdf\\test.xlsx");
if(!file.exists()){
System.out.println("文件不存在");
return ;
}
FileInputStream fis = null;
Workbook workBook = null;
try {
fis = new FileInputStream(file);
workBook = new XSSFWorkbook(fis); // 使用XSSFWorkbook
dealWorkBook(workBook); // 將代碼封裝復用,見下一個方法
} catch (Exception e) {
e.printStackTrace();
} finally{ //關流
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(workBook != null){
try {
workBook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void dealWorkBook(Workbook workBook){
Sheet sheet = workBook.getSheetAt(0); // 獲取第一個sheet
Map<Integer, List<String>> map = new HashMap<Integer, List<String>>(); //第一個參數表示行數 第二個List保存該行的cell數據
int i = 0;
for(Row row : sheet){
map.put(i, new ArrayList<String>());
for(Cell cell : row){ // 遍歷當前行的所有cell
switch(cell.getCellType()) {
case STRING:
map.get(i).add(cell.getRichStringCellValue().getString()); // 如果是字符串則保存
break;
case _NONE:
break;
case NUMERIC:
map.get(i).add(cell.getNumericCellValue()+""); //將數值轉換為字符串
break;
case BOOLEAN:
break;
case FORMULA:
break;
case BLANK:
break;
case ERROR:
break;
}
}
i++;
}
Set<Integer> keys = map.keySet(); // 以下為遍歷 Map看解析結果
Iterator<Integer> it = keys.iterator();
while(it.hasNext()){
List<String> list = map.get(it.next());
for(String s : list){
System.out.print(s+" ");
}
System.out.println();
}
}
運行結果如下
1.0 2.0 3.0 4.0
a b c d
7.0 8.0 9.0 10.0
e f g h
HSSFWorkbook
HSSFWorkbook主要用於解析xls
代碼如下
@Test
public void testXls() throws Exception{
File file = new File("D:\\excelTest\\test2.xls");
if(!file.exists()){
System.out.println("文件不存在");
return ;
}
FileInputStream fis = new FileInputStream(file);
Workbook workBook = new HSSFWorkbook(fis, true); // 使用HSSFWorkbook 構造函數略有不同 true表示轉化成為Nodes
dealWorkBook(workBook); // 復用上面的方法
workBook.close();
fis.close();
}
解析結果如下
1.0 2.0 3.0 4.0
a b c d
7.0 8.0 9.0 10.0
e f g h
11.0 12.0 13.0 14.0
注
本文參考了https://blog.csdn.net/holmofy/article/details/82532311