因為業務需要用到導入數據的功能,所以自己也研究了下,記錄下來
先看下maven包
<!--poi--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</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>
前端的index.jsp 先下載excel模板再填寫內容后導入mysql(大致是這個流程)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache" /> <base target="_self"> <title>文件上傳</title> </head> <body> <a href="test/download.do?fileName=test.xls">下載Exel模板</a> <form method="post" action="test/import.do" enctype="multipart/form-data"> <input type="file" name="files" value="file"> <input type="submit" value="確定"> </form> </body> </html>
mapper的sql語句(我用的測試表里面只有這三個字段)
<!--Excel批量導入--> <insert id="insertInfoBatch" parameterType="java.util.List"> insert into my_test(id,name,endTime) VALUES <foreach collection="list" item="item" index="index" separator=","> (#{item.id},#{item.name},#{item.endTime}) </foreach> </insert>
這是service層方法(注:這里的PageData等同於map)
//excel批量導入數據 public void importExcelInfo(InputStream in, MultipartFile file) throws Exception { List<List<Object>> listob = ExcelUtil.getBankListByExcel(in,file.getOriginalFilename()); List<PageData> salaryList = new ArrayList<>(); //遍歷listob數據,把數據放到List中 for (int i = 0; i < listob.size(); i++) { List<Object> ob = listob.get(i); PageData pd=new PageData(); //設置編號 pd.put("id",String.valueOf(ob.get(1))); //通過遍歷實現把每一列封裝成一個model中,再把所有的model用List集合裝載 pd.put("name",String.valueOf(ob.get(2))); pd.put("endTime",String.valueOf(ob.get(3))); //object類型轉Double類型 salaryList.add(pd); } //批量插入 dao.batchSave("TestMapper.insertInfoBatch",salaryList); }
因為我用的是SqlSessionTemplate進行增刪查改,沒有用實體類的方式(框架為ssm)
dao
package com.pskj.JXGSLZ.dao; import java.util.List; public interface Dao { /** * 保存對象 * * @param str * @param obj * @return * @throws Exception */ Object save(String str, Object obj) throws Exception; /** * 批量保存 * @param str * @param objs * @return * @throws Exception */ Object batchSave(String str, List objs)throws Exception; /** * 修改對象 * * @param str * @param obj * @return * @throws Exception */ Object update(String str, Object obj) throws Exception; /** * 刪除對象 * * @param str * @param obj * @return * @throws Exception */ Object delete(String str, Object obj) throws Exception; /** * 查找對象 * * @param str * @param obj * @return * @throws Exception */ Object findForObject(String str, Object obj) throws Exception; /** * 查找對象 * * @param str * @param obj * @return * @throws Exception */ Object findForList(String str, Object obj) throws Exception; }
DaoImpl(dao的實現類)
package com.pskj.JXGSLZ.dao.daoImpl; import com.pskj.JXGSLZ.dao.Dao; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.util.List; @Repository("daoImpl") public class DaoImpl implements Dao { @Resource(name="sqlSessionTemplate") private SqlSessionTemplate sqlSessionTemplate; /** * 保存對象 * * @param str * @param obj * @return * @throws Exception */ public Object save(String str, Object obj){ return sqlSessionTemplate.insert(str, obj); } /** * 批量保存 * @param str * @param objs * @return * @throws Exception */ public Object batchSave(String str, List objs ){ return sqlSessionTemplate.insert(str, objs); } /** * 批量保存 * @param str * @param objs * @return * @throws Exception */ // public void batchSave(String str, List objs ){ // SqlSessionFactory sqlSessionFactory=sqlSessionTemplate.getSqlSessionFactory(); // //批量執行器 // SqlSession sqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH,false); // try{ // if(objs!=null){ // for(int i=0,len=objs.size();i<len;i++){ // sqlSession.insert(str,objs.get(i)); // } // sqlSession.flushStatements(); // sqlSession.commit(); // sqlSession.clearCache(); // // } // }catch (Exception e){ // e.printStackTrace(); // }finally { // sqlSession.close(); // } // } /** * 修改對象 * * @param str * @param obj * @return * @throws Exception */ @Override public Object update(String str, Object obj){ return sqlSessionTemplate.update(str,obj); } /** * 刪除對象 * * @param str * @param obj * @return * @throws Exception */ public Object delete(String str, Object obj){ return sqlSessionTemplate.delete(str, obj); } /** * 查找對象 * * @param str * @param obj * @return * @throws Exception */ @Override public Object findForObject(String str, Object obj){ return sqlSessionTemplate.selectOne(str, obj); } /** * 查找對象 * * @param str * @param obj * @return * @throws Exception */ @Override public Object findForList(String str, Object obj){ return sqlSessionTemplate.selectList(str, obj); } }
操作excel需要的操作類
ExcelUtil
package com.pskj.JXGSLZ.utils.Excel; 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 java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; /** * @date 2018/10/11 * 導出excel */ public class ExcelUtil { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007+ 版本的excel /** * Excel導入 */ public static List<List<Object>> getBankListByExcel(InputStream in, String fileName) throws Exception { List<List<Object>> list = null; //創建Excel工作薄 Workbook work = getWorkbook(in,fileName); if(null == work){ throw new Exception("創建Excel工作薄為空!"); } Sheet sheet = null; Row row = null; Cell cell = null; list = new ArrayList<List<Object>>(); //遍歷Excel中所有的sheet for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if(sheet==null){continue;} //遍歷當前sheet中的所有行 //包涵頭部,所以要小於等於最后一列數,這里也可以在初始值加上頭部行數,以便跳過頭部 for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { //讀取一行 row = sheet.getRow(j); //去掉空行和表頭 if(row==null||row.getFirstCellNum()==j){continue;} //遍歷所有的列 List<Object> li = new ArrayList<Object>(); for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); li.add(getCellValue(cell)); } list.add(li); } } return list; } /** * 描述:根據文件后綴,自適應上傳文件的版本 */ public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception { Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的文件格式有誤!"); } return wb; } /** * 描述:對表格中數值進行格式化 */ public static Object getCellValue(Cell cell){ Object value = null; DecimalFormat df = new DecimalFormat("0"); //格式化字符類型的數字 SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); //日期格式化 DecimalFormat df2 = new DecimalFormat("0.00"); //格式化數字 switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getRichStringCellValue().getString(); break; case Cell.CELL_TYPE_NUMERIC: if("General".equals(cell.getCellStyle().getDataFormatString())){ value = df.format(cell.getNumericCellValue()); }else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){ value = sdf.format(cell.getDateCellValue()); }else{ value = df2.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: break; } return value; } }
再就是controller層(注testService是我自己寫的service)
//Excel導入數據 @RequestMapping("import") public void impotr(HttpServletRequest request) { Map map=new HashMap(); //獲取上傳的文件 MultipartHttpServletRequest multipart = (MultipartHttpServletRequest) request; MultipartFile file = multipart.getFile("files"); try{ InputStream in = file.getInputStream(); //數據導入 testService.importExcelInfo(in,file); in.close();//關閉流 map.put("success",true); }catch(Exception e){ e.printStackTrace(); map.put("success",false); } JsonUtils.writeJson(map, this.getRequest(), this.getResponse()); }
先看看測試表數據
啟動項目后的index.jsp頁面
點擊下載Excel模板得到如下(這是事先制作好的模板)
添加數據進去上傳文件
再刷新測試表就可以看到數據了