1、poi簡介
Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。
2、maven依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
3、ExcelReaderUtil.java
public class ExcelReaderUtil {
// 默認單元格內容爲數字時格式
private static DecimalFormat df = new DecimalFormat("0");
// 默認單元格格式化日期字符串
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static class ExcelRow {
//所在行標,從1開始
private int row;
//該行數據
private List<Object> datas = new ArrayList<>();
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public List<Object> getDatas() {
return datas;
}
public void setDatas(List<Object> datas) {
this.datas = datas;
}
@Override
public String toString() {
return "[" + datas + "]";
}
}
/**
* 讀取Excel文件,支持2007和2003兩種版本
* 去掉空行,空單元格對應"",浮點數原樣輸出
* @param inputStream 輸入流
* @param containTitle 是否包含表頭
* @return
* @throws IOException
* List<List<Object>>
*/
@SuppressWarnings("deprecation")
public static List<ExcelRow> readExcel(InputStream inputStream, boolean isExcel2007, boolean containTitle) throws IOException {
List<ExcelRow> rowList = new ArrayList<>();
try {
//初始化Workbook對象
Workbook wb = null;
if (isExcel2007) {
wb = new XSSFWorkbook(inputStream);
} else {
wb = new HSSFWorkbook(inputStream);
}
//讀取標題行,獲取列數
Sheet sheet = wb.getSheetAt(0);
//第一列開始的行標
int firstRowNum = sheet.getFirstRowNum();
int lastRowNum = sheet.getLastRowNum();
Row row = sheet.getRow(firstRowNum);
//表頭列數
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
//遍歷數據表,i是遊標,要將有數據的讀完,中間沒數據的行也加入
int i = firstRowNum;
if (!containTitle) {
i = firstRowNum +1;
}
for (; i < lastRowNum + 1 ; i++) {
row = sheet.getRow(i);
//一行數據
List<Object> colList = new ArrayList<Object>();
if (row == null) {
continue;
}
boolean allBlank = true;
for (int j = firstCellNum; j < lastCellNum ; j++) {
Cell cell = row.getCell(j);
Object value = "";
if (cell == null) {
colList.add(value);
continue;
}
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
double num = cell.getNumericCellValue();
if(isInteger(num)) {
value = df.format(cell.getNumericCellValue());
} else {
value = num;
}
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = Boolean.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}// end switch
if(StringUtils.isNotBlank(value.toString())){
allBlank = false;
}
colList.add(value);
} // end for j
if (!allBlank) {
ExcelRow excelRow = new ExcelRow();
excelRow.setRow(i+1);
excelRow.setDatas(colList);
rowList.add(excelRow);
}
} // end for i
wb.close();
} catch (OfficeXmlFileException e){
throw new IOException("文件後綴與實際文件類型不符", e);
}
return rowList;
}
//判斷整數(int)
private static boolean isInteger(double value) {
if(value % 1 == 0){// 是這個整數,小數點後面是0
return true;
}else{//不是整數,小數點後面不是0
return false;
}
}
}
4、調用
boolean isExcel2007 = false;
if (StringUtils.endsWithIgnoreCase(fileName, ".xlsx")) {
isExcel2007 = true;
}
List<ExcelRow> datas = ExcelReaderUtil.readExcel(file.getInputStream(), isExcel2007, true);
String col1 = (String) datas.get(i).getDatas().get(0);