java實現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫
本文是基于Apache poi類實現(xiàn)的批量導(dǎo)入讀取Excel文件,所以要先引入Apache poi的依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.1</version> </dependency>
在引入依賴之后,我們就可以開始進(jìn)行操作了,首先,導(dǎo)入Excel數(shù)據(jù),我們要先能夠讀取Excel每一行每一列的內(nèi)容,只有讀取到內(nèi)容了,才可以將內(nèi)容存入數(shù)組,最后實現(xiàn)插入數(shù)據(jù)庫。所以我們要先讀取Excel表格的數(shù)據(jù),我的項目是springboot,我在service定義了一個讀取方法,然后在impl里面進(jìn)行實現(xiàn),具體代碼為
public class ImportOrderDTO {
private String filePath;
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
/**
* 讀取導(dǎo)入數(shù)據(jù) excel 內(nèi)容
*
* @param importOrderDTO 導(dǎo)入?yún)?shù)
* @param rootPath 根路徑
* @return result
*/
public static final String SEPA = File.separator;//這是下面用到的常量,自己放好位置
private List<User> readExcel(ImportOrderDTO importOrderDTO, String rootPath) {
List<User> excelContent = new ArrayList<>();
try {
InputStream inputStream = new FileInputStream(rootPath + SEPA + importOrderDTO.getFilePath());
XSSFWorkbook wb = new XSSFWorkbook(inputStream);
//遍歷所有表,只支持xlsx,xls的是H的類
XSSFSheet xssfSheet = wb.getSheetAt(0);
int lastRowNum = xssfSheet.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
// 通過下標(biāo)獲取行
XSSFRow row = xssfSheet.getRow(i);
// 從行中獲取數(shù)據(jù)
if (row.getRowNum() == 0) {
continue;
}
//第一列為空就跳出
if (row.getCell(0) == null) {
continue;
}
/**
* getNumericCellValue() 獲取數(shù)字
* getStringCellValue 獲取String,設(shè)置表格類型為String,可以避免很多問題
*/
row.getCell(0).setCellType(CellType.STRING);
row.getCell(1).setCellType(CellType.STRING);
row.getCell(3).setCellType(CellType.STRING);
row.getCell(5).setCellType(CellType.STRING);
//UserInformPO是我自己定義的數(shù)據(jù)類,你們導(dǎo)入需要哪些數(shù)據(jù)就封裝哪些,這就不用多講了吧
UserInformPO userInformPO = new UserInformPO();
userInformPO.setAccount(row.getCell(0).getStringCellValue());
userInformPO.setIdCard(row.getCell(1).getStringCellValue());
userInformPO.setAvatar(row.getCell(2).getStringCellValue());
userInformPO.setNickname(row.getCell(3).getStringCellValue());
userInformPO.setSex(row.getCell(4).getStringCellValue());
String salt = EncryptUtils.createSalt();
userInformPO.setSalt(salt);
//職業(yè)類別
userInformPO.setIntegral(0);
userInformPO.setVipLevel(0);
userInformPO.setIsEnabled(0);
userInformPO.setDelFlag(0);
//然后將po轉(zhuǎn)到我的實體類entity里面并將實體類加入到數(shù)組,方便正式執(zhí)行批量導(dǎo)入的時候可以用,一些沒有的類是我自己定義的加密的(規(guī)范)
User user = new User();
if (userInformPO.getSex().equals(SexEnum.MAN.getText())) {
user.setSex(SexEnum.MAN.getValue());
} else {
user.setSex(SexEnum.WOMAN.getValue());
}
user.setAccount(userInformPO.getAccount());
user.setIdCard(userInformPO.getIdCard());
user.setAvatar(userInformPO.getAvatar());
user.setNickname(userInformPO.getNickname());
user.setPassword(userInformPO.getPassword());
user.setSalt(userInformPO.getSalt());
user.setIntegral(userInformPO.getIntegral());
user.setVipLevel(userInformPO.getVipLevel());
user.setDepartmentId(31);
user.setIsEnabled(userInformPO.getIsEnabled());
user.setDelFlag(userInformPO.getDelFlag());
user.setUpdateTime(new Timestamp(System.currentTimeMillis()));
user.setCreateTime(new Timestamp(System.currentTimeMillis()));
//加入到數(shù)組中并且該方法返回該數(shù)組
excelContent.add(user);
}
} catch (FileNotFoundException e) {
throw new ServerException("文件不存在");
} catch (IOException e) {
System.out.println(e);
throw new ServerException("讀取文件失敗");
}
return excelContent;
}
在上面寫完讀取Excel表單數(shù)據(jù)后,就可以開始寫插入數(shù)據(jù)庫的方法了,我用的是mybatis plus ,方法直接寫到下面,大家不會陌生,返回方法是我封裝的類,大家用自己項目的稍加修改就可以
public Result importUserWithExcel(ImportOrderDTO importOrderDTO, String rootPath) {
try {
//調(diào)用上面的方法,讀取前端傳過來的參數(shù)和文件路徑
List<User> excelContent = readExcel(importOrderDTO, rootPath);
if (excelContent.isEmpty()) {
return ResultUtil.error("數(shù)據(jù)為空");
}
//下面都是一些邏輯處理,大家一定看得懂就不多說了
List<User> userList = userMapper.selectList(new EntityWrapper<User>());
List<User> sameList = new ArrayList<>();
List<User> differentList = new ArrayList<>();
for (User excelStudent : excelContent) {
//數(shù)據(jù)不同
boolean flag = true;
for (User user : userList) {
if (user.getAccount().equals(excelStudent.getAccount())) {
//相同的數(shù)據(jù)
flag = false;
sameList.add(excelStudent);
}
}
if (flag) {
//如果導(dǎo)入的數(shù)據(jù)與上面判斷的條件相等了,就執(zhí)行插入操作
differentList.add(excelStudent);
userMapper.insert(excelStudent);
}
}
if (differentList.size() == 0) {
//判斷如果導(dǎo)入的數(shù)據(jù)跟當(dāng)前的數(shù)據(jù)一致的話
return ResultUtil.error("導(dǎo)入數(shù)據(jù)與當(dāng)前數(shù)據(jù)一致!");
}
return ResultUtil.successWithMessage("數(shù)據(jù)導(dǎo)入成功");
} catch (Exception e) {
System.out.println(e);
return ResultUtil.error("數(shù)據(jù)導(dǎo)入失敗,請檢查導(dǎo)入文件格式與模板文件是否相同!");
}
}
service層方法寫完了,接著就是controller了,直接上代碼,工具類在下面
@PostMapping(value = "/importExcel")
public Result importExcel(HttpServletRequest request, @RequestBody ImportOrderDTO importOrderDTO) {
String rootPath = ExcelUtils.getRootPath(request);
System.out.println(importOrderDTO.getFilePath());
return userService.importUserWithExcel(importOrderDTO, rootPath);
}
這是獲取根路徑的工具類
public class ExcelUtils {
/**
* 獲取上傳根路徑
*
* @param request 請求信息
* @return string
*/
public static String getRootPath(HttpServletRequest request) {
return request.getSession().getServletContext().getRealPath(UtilConstant.UPLOAD_PATH);
}
public static Workbook getWorkbook(String excelType) {
try {
return WorkbookFactory.create(!ExcelTypeEnum.XLS.getVal().equals(excelType));
} catch (IOException e) {
throw new ServerException("創(chuàng)建excel文件失敗", e);
}
}
/**
* 創(chuàng)建表
*
* @param wb 目標(biāo)文件
* @param sheetName 表名
* @param sheetTitle 表頭
* @return sheet
*/
public static Sheet createSheet(Workbook wb, String sheetName, String[] sheetTitle) {
Sheet sheet = wb.createSheet(sheetName);
Row row = sheet.createRow(0);
for (int i = 0; i < sheetTitle.length; i++) {
row.createCell(i).setCellValue(sheetTitle[i]);
}
return sheet;
}
/**
* 創(chuàng)建單元格.
*
* @param row 行
* @param column 列
* @param value 值
*/
public static void createCell(Row row, int column, String value) {
Cell cell = row.createCell(column);
cell.setCellValue(value);
}
}
好了,一個簡單的Excel批量導(dǎo)入數(shù)據(jù)就完成了,感謝支持,大家有什么問題都可以評論留言哦
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springmvc項目web.xml中servlet-mapping路徑映射配置注意說明
這篇文章主要介紹了Springmvc項目web.xml中servlet-mapping路徑映射配置注意說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
java解析xml匯總_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了java解析xml匯總_動力節(jié)點Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-07-07
Springboot調(diào)整接口響應(yīng)返回時長詳解(解決響應(yīng)超時問題)
當(dāng)后端對于數(shù)據(jù)量較大的處理或是某些耗時的操作時,需要先對請求接口的請求進(jìn)行響應(yīng),下面這篇文章主要給大家介紹了關(guān)于Springboot調(diào)整接口響應(yīng)返回時長(解決響應(yīng)超時問題)的相關(guān)資料,需要的朋友可以參考下2023-01-01
解決websocket 報 Could not decode a text frame as UTF-8錯誤
這篇文章主要介紹了解決websocket 報 Could not decode a text frame as UTF-8錯誤,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Hibernate實現(xiàn)many-to-many的映射關(guān)系
今天小編就為大家分享一篇關(guān)于Hibernate實現(xiàn)many-to-many的映射關(guān)系,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03

