前言:
三月的風沒有吹散霧霾,那麼就讓四月的陽光灑滿大地吧,忘記過往,展望未來。三月再見,四月你好。
最近在使用POI 將Excel中的數據導入到數據庫中,接下來我將介紹一下如何使用POI。
概念:
Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。
步驟:
- (1)在pom.xml 中導入jar 包。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
- (2)前端頁面。
<template>
<div class="root">
<el-upload class="zh-upload" :before-upload="beforeExportExcel" :show-file-list=false :action="UploadUrl()" :on-success="exportExcel" :file-list="fileList">
<el-button type="primary" size="mini" >導入模板</el-button>
</el-upload>
</div>
</template>
<script>
export default {
name: "Register",
data() {
return {
fileList:[],
Register: {
phone: '',
sendcode: '',
},
disabled: false,
time: 0,
btntxt: "重新發送",
timeToggle:false,
dataTable:{
pid:"11",
mie:'dasdasdasd'
}
}
},
created() {
const {pid} = this.dataTable
console.log(pid)
},
methods: {
//導入
importClick() {
},
UploadUrl () {
return '/api/readExcelData'
},
// 導出
beforeExportExcel(file) {
console.log(file)
const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
if (!isXLSX) {
this.$message.error('上傳模板只能是 XLSX 格式!');
}
return isXLSX ;
},
exportExcel (file, fileList) {
if (file.result="true") {
this.$message({
message: file.message,
type: 'success'
});
}else {
this.$message({
message: file.message,
type: 'error'
});
}
},
}
}
</script>
- (3)後臺接口。
接口:readExcelData
/**
* 導入excel
*
* @param
* @return
*/
@PostMapping(value = "/readExcelData")
public ResultData readExcel(MultipartFile file, HttpSession session) {
ResultData result = new ResultData();
if (!file.isEmpty()) {
try {
//取得文件原名
String filename = file.getOriginalFilename();
//取得文件後綴名
Integer indexStar = filename.lastIndexOf(".") + 1;
//取得文件後綴名
String excelTypeName = filename.substring(indexStar);
//當前登錄用戶
BosUserModel userModel = (BosUserModel) session.getAttribute("user");
//解析Excel中的數據
result = poiExcelService.readExcelToCustomer(file.getInputStream(), excelTypeName, userModel.getName());
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
- (4)PoiExcelService 類中的信息:
public static final String EXCEL_TYPE_2007 = "xlsx";
/**
* 讀取Excel中的數據到客戶表中
* @param inputStream
* @param excelTypeName
* @param name
*/
@Override
public ResultData readExcelToCustomer(InputStream inputStream, String excelTypeName, String name) {
ResultData resultData = new ResultData();
Workbook wb = null;
try {
if (EXCEL_TYPE_2007.equals(excelTypeName)) {
wb = new XSSFWorkbook(inputStream);
} else {
wb = new HSSFWorkbook(inputStream);
}
//獲得excel中第一個表格
Sheet sheet = wb.getSheetAt(0);
boolean flag = true;
for (Row cells : sheet) {
//跳過第一行
if (flag == true) {
flag = false;
continue;
}
System.out.println("第1個字段:----"+toStringValue(cells.getCell(0)));
System.out.println("第2個字段:----"+toStringValue(cells.getCell(1)));
System.out.println("第3個字段:----"+toStringValue(cells.getCell(2)));
System.out.println("第4個字段:----"+toStringValue(cells.getCell(3)));
System.out.println("第5個字段:----"+toStringValue(cells.getCell(4)));
System.out.println("第6個字段:----"+toStringValue(cells.getCell(5)));
}
resultData.setResult("true");
resultData.setMessage("導入客戶數據成功");
} catch (Exception e) {
resultData.setResult("false");
resultData.setMessage("導入客戶數據失敗");
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("導入數據到商機表單中失敗",e);
}
return resultData;
}
其實我這篇文章讀取Excel 中的數據的時候,有一個問題,就是 toStringValue() 我將讀取到的值全都轉換成了String ,如果Excel 中有一行字段是時間類型的值,解析出來的數據就有問題。我用了下面這個方法就沒問題了。我參考的是這篇文章
public static String getCellStringValue(Cell cell) {
String cellValue = "";
if (cell != null) {
// cell.getCellTypeEnum(),獲取單元格類型,case不同類型進行不同處理
switch (cell.getCellTypeEnum()) {
case _NONE: // 未知類型,用於表示初始化前的狀態或缺少具體類型。僅供內部使用。
break;
case NUMERIC: // 數字類型 小數,整數,日期
// 如果是數字類型的話,判斷是不是日期類型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
cellValue = formatter.format(d);
} else if(cell.getCellStyle().getDataFormat() == 57) {
Date d = cell.getDateCellValue();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
cellValue = formatter.format(d);
} else {
DecimalFormat df = new DecimalFormat("0");
cellValue = df.format(cell.getNumericCellValue());
}
break;
case STRING: // 字符串類型
cellValue = cell.getStringCellValue();
break;
case FORMULA: // 公式類型
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case BLANK: // 空白的單元格
break;
case BOOLEAN: // 布爾類型
break;
case ERROR: // 錯誤類型
break;
default:
break;
}
}
return cellValue;
}
- (5)其他類中的信息:
public static String toStringValue(Cell cell) {
if (cell != null) {
cell.setCellType(Cell.CELL_TYPE_STRING);
return cell.toString();
} else {
return "";
}
}
- (6)測試整個功能:
準備一個Excel
解析後的數據如下:
至此就大功告成了。