Springboot實現Excel批量導入數據并保存到本地
前言
當我們給數據庫中的表中添加數據時一般都是進入圖形化界面進行手動添加,或者進直接導入現成的sql文件,但是有的時候我們會需要去導入大量的數據,這個時候我們不論是使用寫好的接口還是去圖形化界面添加都是十分費時費力的,這個時候使用Excel讀取表格數據并進行導入就十分有必要了。本篇更著重于單個功能的開發(fā),不會從頭構建一個項目。
成果展示
只是為了證明功能正常運行所以并沒有加太多
了解Excel表格基本屬性
workbook :一整個表格文件
一個文件中有多個sheet
row 是 行
cell是一個單元格
這是打開了一個表跟文件,可以看出是可以有多個Sheet的,知道這幾點也就夠用了
表設計
這里使用的是我之前的用戶表。
字段比較多我們只取關注2~4 也就是用戶名,密碼,個性簽名.id是自增的我們導入數據也不會去有用戶id這一項。這三個都是varchar類型,一會兒傳入時轉成String類型就行,如果是int的話我們需要先轉成Double再使用intValue即可。
引入依賴
<!-- 表格處理--> <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>
工具類
public class ExcelUtil { public static Object getCellValue(Cell cell){ switch (cell.getCellTypeEnum()){ //字符串 case STRING: return cell.getStringCellValue(); //布爾 case BOOLEAN: return cell.getBooleanCellValue(); //數值 case NUMERIC: return cell.getNumericCellValue(); } return null; } }
Controller
@PostMapping("/send/upload") @ResponseBody public ApiRestResponse uploadUser(@RequestParam("file")MultipartFile multipartFile) throws IOException { //獲取文件名 String fileName = multipartFile.getOriginalFilename(); String fixName = fileName.substring(fileName.lastIndexOf(".")); //生成唯一UUID UUID uuid = UUID.randomUUID(); String newFileName = uuid.toString() + fixName; //創(chuàng)建文件 File file = new File(Constant.FILE_UPLOAD_DIR); File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName); if(!file.exists()){ if(!file.mkdir()){ throw new XatuMallException(0000000,"文件創(chuàng)建失敗"); } } try { multipartFile.transferTo(destFile); } catch (IOException e) { e.printStackTrace(); } userService.addUserList(destFile); return ApiRestResponse.success(); }
這里注意,我們這個文件地址是需要配置的,并不是寫一個路徑就行。參考:Springboot實現圖片上傳功能的示例代碼
配置方法這里有說,但是要記得還要在appli那個配置文件里加一行
file.upload.dir=D:/pictures/ 每個人不一樣,但是這與你contant類里的地址是綁定的
entity
public class User { private Integer id; private String username; private String password; private String personalizedSignature; private Integer role; private Date createTime; private Date updateTime; private String emailAddress; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username == null ? null : username.trim(); } public String getPassword() { return password; } public void setPassword(String password) { this.password = password == null ? null : password.trim(); } public String getPersonalizedSignature() { return personalizedSignature; } public void setPersonalizedSignature(String personalizedSignature) { this.personalizedSignature = personalizedSignature == null ? null : personalizedSignature.trim(); } public Integer getRole() { return role; } public void setRole(Integer role) { this.role = role; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public String getEmailAddress() { return emailAddress; } public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress == null ? null : emailAddress.trim(); } }
Mapper
public interface UserMapper { User selectByName(String username); }
xml
<select id="selectByName" parameterType="java.lang.String" resultMap="BaseResultMap"> select <include refid="Base_Column_List"></include> from xatu_mall_user where username = #{username,jdbcType=VARCHAR} </select>
理解原理就好,不要去糾結表名。
UserService
Imp
@Override public void addUserList(File destFile) throws IOException { List<User> users = readUsersFromExcel(destFile); for (int i = 0; i < users.size(); i++){ User user = users.get(i); User userOld = userMapper.selectByName(user.getUsername()); if(userOld != null){ System.out.println("重名"); } int count = userMapper.insertSelective(user); if(count == 0){ System.out.println("添加失敗"); } } } private List<User> readUsersFromExcel(File excelFile) throws IOException { ArrayList<User> listUser =new ArrayList<>(); FileInputStream fileInputStream = new FileInputStream(excelFile); XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream); XSSFSheet firstSheet = xssfWorkbook.getSheetAt(0); Iterator<Row> iterator = firstSheet.iterator(); while(iterator.hasNext()){ org.apache.poi.ss.usermodel.Row nextRow = iterator.next(); Iterator<Cell> cellIterator = nextRow.cellIterator(); User aUser = new User(); while(cellIterator.hasNext()){ Cell nextCell = cellIterator.next(); int columnIndex = nextCell.getColumnIndex(); switch (columnIndex){ case 0: aUser.setUsername((String) ExcelUtil.getCellValue(nextCell)); break; case 1: aUser.setPassword((String) ExcelUtil.getCellValue(nextCell)); break; case 2: aUser.setPersonalizedSignature((String) ExcelUtil.getCellValue(nextCell)); break; } } listUser.add(aUser); } xssfWorkbook.close(); fileInputStream.close(); return listUser; }
重名那里偷懶了,按理說應該拋出異常的。
void addUserList(File destFile) throws IOException;
測試
打開postman 這里需要注意的地方是我們是postMapping 并且
選擇的是Body 和form-data
后面就能去選擇我么要讀取的表格文件了,但是我們讀取的是xlsx xls是不能讀的,你改后綴也是不行的,要建立時就是xlsx。
總結
這個技術也是很實用的技術,讓我們可以很便捷的快速從表格中讀取數據并將數據上傳。文件保存到本地可以去看放的鏈接,實際上與上傳圖片是一樣的。
以上就是Springboot實現Excel批量導入數據并保存到本地的詳細內容,更多關于Springboot Excel批量導入數據的資料請關注腳本之家其它相關文章!
相關文章
Java 利用dom方式讀取、創(chuàng)建xml詳解及實例代碼
這篇文章主要介紹了Java 利用dom方式讀取、創(chuàng)建xml的相關資料,需要的朋友可以參考下2017-03-03解決springboot自定義配置Boolean屬性不能生效的問題
這篇文章主要介紹了解決springboot自定義配置Boolean屬性不能生效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解
這篇文章主要介紹了Spring?IOC中對象的創(chuàng)建、策略及銷毀時機和生命周期詳解,Spring默認使用類的空參構造方法創(chuàng)建bean,假如類沒有空參構造方法,將無法完成bean的創(chuàng)建,需要的朋友可以參考下2023-08-08java WebSocket的實現以及Spring WebSocket示例代碼
本篇文章主要介紹了java WebSocket的實現以及Spring WebSocket,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01Spring Boot 2 整合 QuartJob 實現定時器實時管理功能
Quartz是一個完全由java編寫的開源作業(yè)調度框架,形式簡易,功能強大。接下來通過本文給大家分享Spring Boot 2 整合 QuartJob 實現定時器實時管理功能,感興趣的朋友一起看看吧2019-11-11