首先是jsp页面:
<body scroll=no style="overflow-y:hidden;" onselectstart="return false"> <div class="container" style="overflow-y:auto; padding-top:0px;" onscroll="hideAutoTiShi();"> <div class="row"> <form action="/ds/excelUploadServlet" enctype="multipart/form-data" method="post"> <input id="file" type="file" name="file" value="选择文件"/> <input id="submit" type="submit" onclick="undo();" value="提交"/> </form> </div> </div> <script src="jquery.min.js"></script> <script src="jquery.form.js"></script> <script src="excel_import.js"></script> </body>
然后是Servlet的Java服务类
package com.inspur.dtdcommon.ds.cmd; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.loushang.next.dao.DaoFactory; import com.inspur.dtdcommon.ds.dao.DtdCheckEntBasicInfoDao; import com.inspur.dtdcommon.ds.dao.DtdCheckEntBasicInfoDetailDao; import com.inspur.dtdcommon.ds.data.DtdCheckEntBasicInfo; import com.inspur.dtdcommon.ds.data.DtdCheckEntBasicInfoDetail; import com.inspur.dtdcommon.util.DtdUtil; import com.inspur.dtdcommon.util.ImportExecl; public class ExcelUploadServlet extends HttpServlet{ private DtdUtil dtdUtil = DtdUtil.getInstance(); private DtdCheckEntBasicInfoDao dao = (DtdCheckEntBasicInfoDao) DaoFactory .getDao("com.inspur.dtdcommon.ds.dao.DtdCheckEntBasicInfoDao"); private DtdCheckEntBasicInfoDetailDao dao_detail = (DtdCheckEntBasicInfoDetailDao) DaoFactory .getDao("com.inspur.dtdcommon.ds.dao.DtdCheckEntBasicInfoDetailDao"); public ExcelUploadServlet() { super(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } /** * //遍历Excel文件,然后读取文件封装成List数据 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String zhi=null; FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); InputStream inputStream = null; DtdCheckEntBasicInfo entity = new DtdCheckEntBasicInfo(); List<DtdCheckEntBasicInfo> listInfo = new ArrayList<>(); DtdCheckEntBasicInfoDetail bean = new DtdCheckEntBasicInfoDetail(); List<DtdCheckEntBasicInfoDetail> listBean = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 读取上传文件 */ try { List items = upload.parseRequest(req); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { inputStream = item.getInputStream(); } } } catch (FileUploadException e) { e.printStackTrace(); } /** * POI遍历Excel文件,然后读取文件封装成List数据 */ ImportExecl poi = new ImportExecl(); List<List<String>> list = poi.read(inputStream, false); if (list != null) { for (int i = 1; i < list.size(); i++) { List<String> cellList = list.get(i); String ID = dtdUtil.getUUID().toUpperCase(); entity.setId(ID); entity.setEntid(ID); entity.setEntname(cellList.get(0)); entity.setAreaid(cellList.get(1)); entity.setAreaname(cellList.get(2)); entity.setRegisteraddress(cellList.get(3)); entity.setAddress(cellList.get(4)); entity.setSocietycreditcode(cellList.get(5)); entity.setLerepname(cellList.get(6)); entity.setLerepmobile(cellList.get(7)); entity.setLereptelephonenum(cellList.get(8)); entity.setIssueDate(cellList.get(9)); entity.setValidDate(cellList.get(10)); entity.setDataStatus("10"); entity.setCreateTime(new Date()); listInfo.add(entity);//处理生成List数组 System.out.println(); bean.setId(ID); bean.setEntid(ID); bean.setEntname(cellList.get(0)); bean.setRecordInfo(cellList.get(11)); bean.setFund(cellList.get(12)); bean.setAssets(cellList.get(13)); bean.setQualification(cellList.get(14)); bean.setRegulators(cellList.get(15)); bean.setBusinessScope(cellList.get(16)); bean.setRegisteredCapital(cellList.get(17)); bean.setEstablishTime(sdf.format(new Date())); bean.setBusinessStartDate(cellList.get(9)); bean.setBusinessEndDate(cellList.get(10)); bean.setRegistrationAuthority(cellList.get(18)); bean.setApprovalDate(cellList.get(19)); if("已登记".equals(cellList.get(20))){ bean.setRegistrationStatus("1"); }else{ bean.setRegistrationStatus("0"); } listBean.add(bean); } //遍历Excel文件,然后读取文件封装成List数据,然后插入到数据中 dao.batchInsert(listInfo); dao_detail.batchInsert(listBean); }else{ throw new RuntimeException("请填写Excel内容"); } } }
ImportExecl 读取Excel的工具类
package com.inspur.dtdcommon.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; 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; /** * excel读取 工具类 * * @jar包 * 该类使用到了以下jar: * 1、poi-ooxml-3.9.jar * 2、poi-3.9.jar */ public class ImportExecl { /** * main测试 */ public static void main(String[] args) throws Exception { ImportExecl poi = new ImportExecl(); List<List<String>> list = poi.read("E:/批量导入客户模板.xlsx"); if (list != null) { for (int i = 0; i < list.size(); i++) { List<String> cellList = list.get(i); for (int j = 0; j < cellList.size(); j++) { System.out.print(" " + cellList.get(j)); } System.out.println(); } } } //总行数 private int totalRows = 0; //总列数 private int totalCells = 0; //错误信息 private String errorInfo; //构造方法 public ImportExecl() { } /** * 得到总行数 */ public int getTotalRows() { return totalRows; } /** * 得到总列数 */ public int getTotalCells() { return totalCells; } /** * 得到错误信息 */ public String getErrorInfo() { return errorInfo; } /** * 验证excel文件 */ public boolean validateExcel(String filePath) { /** 检查文件名是否为空或者是否是Excel格式的文件 */ if (filePath == null || !(CheckExcelUtil.isExcel2003(filePath) || CheckExcelUtil.isExcel2007(filePath))) { errorInfo = "文件名不是excel格式"; return false; } /** 检查文件是否存在 */ File file = new File(filePath); if (file == null || !file.exists()) { errorInfo = "文件不存在"; return false; } return true; } /** * 根据文件路径读取excel文件 */ public List<List<String>> read(String filePath) throws IOException { List<List<String>> dataLst = new ArrayList<List<String>>(); InputStream is = null; try { /** 验证文件是否合法 */ if (!validateExcel(filePath)) { System.out.println(errorInfo); return null; } /** 判断文件的类型,是2003还是2007 */ boolean isExcel2003 = true; if (CheckExcelUtil.isExcel2007(filePath)) { isExcel2003 = false; } /** 调用本类提供的根据流读取的方法 */ File file = new File(filePath); is = new FileInputStream(file); dataLst = read(is, isExcel2003); is.close(); is = null; } catch (Exception ex) { ex.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { is = null; e.printStackTrace(); } } } return dataLst; } /** * 根据流读取Excel文件 * * @param inputStream 文件输入流 * @param isExcel2003 标识是否2003的excel。 * true:是2003的excel,false:是2007的excel * @return * * @扩展说明 * 如果使用springmvc的MultipartFile接收前端上传的excel文件的话,可以使用MultipartFile的对象,获取上传的文件名称, * 然后,可以通过 CheckExcelUtil 类的方法,接收文件名称参数,来判断excel所属的版本。最后再调用此方法来读取excel数据。 * */ public List<List<String>> read(InputStream inputStream, boolean isExcel2003) { List<List<String>> dataLst = null; try { /** 根据版本选择创建Workbook的方式 */ Workbook wb = null; if (isExcel2003) { wb = new HSSFWorkbook(inputStream); } else { wb = new XSSFWorkbook(inputStream); } dataLst = read(wb); } catch (IOException e) { e.printStackTrace(); } return dataLst; } /** * 读取数据 */ private List<List<String>> read(Workbook wb) { List<List<String>> dataLst = new ArrayList<List<String>>(); //得到第一个shell Sheet sheet = wb.getSheetAt(0); //得到Excel的行数 this.totalRows = sheet.getPhysicalNumberOfRows(); //得到Excel的列数 if (this.totalRows >= 1 && sheet.getRow(0) != null) { this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells(); } //循环Excel的行 for (int r = 0; r < this.totalRows; r++) { Row row = sheet.getRow(r); if (row == null) { continue; } List<String> rowLst = new ArrayList<String>(); //循环Excel的列 for (int c = 0; c < this.getTotalCells(); c++) { Cell cell = row.getCell(c); String cellValue = ""; if (null != cell) { cell.setCellType(HSSFCell.CELL_TYPE_STRING); //把所有的Excel内容当做字符串处理 // 以下是判断数据的类型 switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: // 数字 cellValue = cell.getNumericCellValue() + ""; break; case HSSFCell.CELL_TYPE_STRING: // 字符串 cellValue = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean cellValue = cell.getBooleanCellValue() + ""; break; case HSSFCell.CELL_TYPE_FORMULA: // 公式 cellValue = cell.getCellFormula() + ""; break; case HSSFCell.CELL_TYPE_BLANK: // 空值 cellValue = ""; break; case HSSFCell.CELL_TYPE_ERROR: // 故障 cellValue = "非法字符"; break; default: cellValue = "未知类型"; break; } } rowLst.add(cellValue); } //保存第r行的第c列 dataLst.add(rowLst); } return dataLst; } } class CheckExcelUtil { /** * 检查是否是2003的excel,若是,则返回true */ public static boolean isExcel2003(String filePath) { return filePath.matches("^.+\\.(?i)(xls)$"); } /** * 检查是否是2007的excel,若是,则返回true */ public static boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); } }
最后不要忘了web.xml
<servlet> <servlet-name>ExcelUploadServlet</servlet-name> <servlet-class>com.inspur.dtdcommon.ds.cmd.ExcelUploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ExcelUploadServlet</servlet-name> <url-pattern>/excelUploadServlet</url-pattern> </servlet-mapping>
然后就完成了Excel内容读取,Excel如下:
读取Excel的时候,是从第二行开始读取的,如果需要从第一行开始读取修改ExcelUploadServlet.java文件中
for (int i = 1; i < list.size(); i++) {}
把其中的i=1修改成i=0就会从Excel第一行开始读取。