Springboot Excle導入導出
導入操作:Excle批量導入
導出操作:下載模版
開發筆記
pom.xml
<!-- Excle相關jar --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
工具類
ExcleUtils:
package com.wechat.cwbt.util; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; /** * * * @Package: com.wechat.cwbt.util * @ClassName: ExcleUtils * @Description:Excle相關工具 * @author: zk * @date: 2019年8月30日 下午4:29:22 */ public final class ExcleUtils { /** * * @description Excle導入 * @author zk * @date 2019年8月30日 * @param file * @return 返回數據對象格式為: 表頭->數據 */ public static Map<String, Object> getDataList(MultipartFile file){ Map<String, Object> result = new HashMap<String, Object>(); // System.out.println(file.getName()+"\t"+file.getOriginalFilename()); List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>(); //判斷Excel文件是否有內容 boolean notNull=false; String filename=file.getOriginalFilename(); if (!filename.matches("^.+\\.(?i)(xls)$") && !filename.matches("^.+\\.(?i)(xlsx)$")) { result.put("msg","上傳文件格式不正確!"); result.put("SUCCESS", false); return result; } //判斷Excel文件的版本 boolean isExcel2003=true; if (filename.matches("^.+\\.(?i)(xlsx)$")) { isExcel2003 = false; } Workbook wb = null; try { InputStream fis=file.getInputStream(); if (isExcel2003) { wb = new HSSFWorkbook(fis); } else { wb = new XSSFWorkbook(fis); } } catch (Exception e) { e.printStackTrace(); } // 總共有多少張sheet表 int sheetnum = wb.getNumberOfSheets(); //判斷有無數據 if(sheetnum == 1) { Sheet sheet = wb.getSheetAt(0); // 第一行數據數據 int rowNum = sheet.getPhysicalNumberOfRows(); if(rowNum==1){ result.put("msg","無數據"); result.put("SUCCESS", false); return result; } } //獲取數據 for (int i = 0; i < sheetnum; i++) { Sheet sheet = wb.getSheetAt(i); // 表頭數據 Row namerow = sheet.getRow(0); // 第一行數據 Row headrow = sheet.getRow(1); if (null != headrow) { // 總行數 int rowNum = sheet.getPhysicalNumberOfRows(); // int rowNum = sheet.getLastRowNum(); // System.out.println(file.getName() + "共:" + rowNum + " 行!"); // 總列數 int colNum = headrow.getPhysicalNumberOfCells(); // 判斷工作表是否為空 if (rowNum == 0) { continue; } // 循環行 for (int j = 1; j <= rowNum; j++) { Row row = sheet.getRow(j); if (null != row) { Map<String, Object> rowmap = new HashMap<String, Object>(); for(int h=0;h<colNum;h++) { String str1 = namerow.getCell(h).getStringCellValue(); row.getCell(h).setCellType(Cell.CELL_TYPE_STRING);//設置Cell的類型,按照String取出數據 String str2 = row.getCell(h).getStringCellValue(); rowmap.put(str1,str2); } dataList.add(rowmap); //continue; } } } } result.put("data", dataList); result.put("SUCCESS", true); return result; } /** * * @description Excle導出 * @author zk * @date 2019年8月30日 * @param filename 文件名稱 * @param namearr 表頭 * @param datalist 數據 * @return */ public static Workbook exportDailyBill(String filename,String[] namearr,List<Map<String, Object>> datalist){ // 創建excel工作簿 Workbook workbook = new XSSFWorkbook(); // 創建第一個sheet(頁),並命名 Sheet sheet = workbook.createSheet(filename); //設置首行標題標題 Row row = sheet.createRow(0); for(int i=0;i<namearr.length;i++) { row.createCell(i).setCellValue(namearr[i]); } if(datalist!=null) { //新增數據行,並且設置單元格數據 int rowNum = 1; for(Map<String, Object> data : datalist) { row = sheet.createRow(rowNum); for(int i=0;i<namearr.length;i++) { row.createCell(i).setCellValue((String)data.get(namearr[i])); } rowNum++; } } return workbook; } }
調用:
controller:
/** * * @description 下載模版 * @author zk * @date 2019年9月9日 * @param request * @param response * @return * @throws Exception */ @RequestMapping("/downloadExcle") public void downloadExcle(HttpServletRequest request, HttpServletResponse response)throws Exception{ String fileName = "按鍵錄入表";//文件名 String[] namearr = {"按鍵類型","按鍵名稱","按鍵編碼"};//標題 List<Map<String, Object>> datalist = null;//數據 Workbook workbook = ExcleUtils.exportDailyBill(fileName, namearr, datalist); String name = new String(fileName.getBytes("utf-8"), "ISO-8859-1");//處理文件名稱 response.setContentType("application/octet-stream;charset=ISO8859-1"); response.setHeader("Content-disposition", "attachment;filename=" + name + ".xlsx"); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); OutputStream out = response.getOutputStream(); workbook.write(response.getOutputStream()); out.flush(); out.close(); } /**
*
* @description 批量導入Excle
* @author 左坤
* @date 2019年9月10日
* @param file
* @param request
* @param response
* @return
* @throws Exception
*/
@Transactional
@RequestMapping("/importExcle")
@ResponseBody
public Map<String, Object> importExcle(MultipartFile file,HttpServletRequest request, HttpServletResponse response){
Map<String, Object> result = new HashMap<String, Object>();
Map<String, Object> resmap = ExcleUtils.getDataList(file);
if((boolean)resmap.get("SUCCESS")) {//有數據
List<Map<String, Object>> list = (List<Map<String, Object>>) resmap.get("data");
List<Keyboard> keyboardlist = new ArrayList<Keyboard>();
if(list!=null) {
for(int i=0;i<list.size();i++) {
Map<String, Object> mapstr = list.get(i);
Keyboard keyboard = new Keyboard();
keyboard.setName((String)mapstr.get("按鍵名稱"));
keyboard.setKeycode(Integer.parseInt((String)mapstr.get("按鍵編碼")));
keyboard.setTypeid((String)mapstr.get("按鍵類型"));
keyboard.setCreatetime(new Date());
keyboard.setUpdatetime(new Date());
keyboard.setIsshow("0");
keyboard.setIsdel("0");
keyboardlist.add(keyboard);
}
int count = keyboardService.insertlist(keyboardlist);//成功條數
if(count<keyboardlist.size()) {//成功條數小於插入條數
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手動回滾
result.put("SUCCESS", false);
result.put("msg", "Excle第"+(count+2)+"行存在問題");
return result;
}
result.put("SUCCESS", true);
result.put("msg", "操作成功");
}
}else {//無數據
result.put("SUCCESS", false);
result.put("msg", "Excle無數據");
}
return result;
}
結束