这里省略spring配置,就是简单的SMM配置
1.前端我用了一个网上找的esyUI的框架
在前端引入
<link rel="stylesheet" href="static/ace/css/font-awesome.min.css" /> <link rel="stylesheet" type="text/css" href="static/jquery-easyui-1.3.3/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="static/jquery-easyui-1.3.3/themes/icon.css"> <style type=text/css><script type="text/javascript" src="static/jquery-easyui-1.3.3/jquery.min.js"></script> <script type="text/javascript" src="static/jquery-easyui-1.3.3/jquery.easyui.min.js"></script> <script type="text/javascript" src="static/jquery-easyui-1.3.3/locale/easyui-lang-zh_CN.js"></script>按钮
<td><div><a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-import " plain="true" onclick="openUploadFileDialog()">批量导入数据</a></div></td>按钮弹窗
<div id="dlg2" class="easyui-dialog" style="width: 400px; height: 180px; padding: 10px 20px" closed="true" buttons="#dlg-buttons2"> <form id="uploadForm" action="readCaseNumber/sendCase.do" method="post" enctype="multipart/form-data"> <table> <tr> <td>上传文件:</td> <td><input type="file" name="upfile"></td> </tr> </table> </form> </div> <div id="dlg-buttons2"> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-ok" onclick="uploadFile()">上传</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#dlg2').dialog('close')">关闭</a> </div>
漏了js代码
<script> function openUploadFileDialog(){ $("#dlg2").dialog('open').dialog('setTitle','导入数据'); } function uploadFile(){ $("#uploadForm").form("submit",{ success:function(result){ var result=eval('('+result+')'); if(result.errorMsg){ $.messager.alert("系统提示",result.errorMsg); }else{ $.messager.alert("系统提示","上传成功"); $("#dlg2").dialog("close"); $("#dg").datagrid("reload"); } } }); }
后端controller
@Controller @RequestMapping(value = "/readCaseNumber") public class ReadCaseNumber extends BaseController { @RequestMapping(value = "/sendCase") @ResponseBody public String sendCase(HttpServletRequest request) throws Exception {System.out.println("开始上传文件"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; System.out.println("通过传统方式form表单提交方式导入excel文件!"); CaseNm caseNm = new CaseNm(); List<String> caseNumbers = caseNm.upload(multipartRequest);上面 就是获取前端请求的注解
MultipartHttpServletRequest 可以网上查一下
我的业务是获取Excel表格第一sheet页的第一列的数据,返回第一行数据的数组的工具类
public List<String> upload(MultipartHttpServletRequest multipartRequest) throws Exception { InputStream in = null; List<List<Object>> listob = null; MultipartFile file = multipartRequest.getFile("upfile"); if (file.isEmpty()) { throw new Exception("文件不存在!"); } in = file.getInputStream(); listob = new ImportExcelUtil().getBankListByExcel(in, file.getOriginalFilename()); // 因为要导入的excel比较特殊,不是常规的一行类别,其他行都是数据,所以我需要根据具体模板来读取excel List<String> list = new ArrayList<>(); for (int i = 0; i < listob.size(); i++) { DetailInfoVo vo = new DetailInfoVo(); List<Object> list2 = listob.get(i); //vo.setCaseNm(String.valueOf(listob.get(i).get(1))); System.out.println(list2.toString()); list.add((String)list2.get(0)); } System.out.println(list.toString()); in.close(); return list; }
验证Excel是2003的xls还是2007的xlsx工具类
public class ImportExcelUtil { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007+ 版本的excel /** * 描述:获取IO流中的数据,组装成List<List<Object>>对象 * @param in,fileName * @return * @throws IOException */ public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{ List<List<Object>> list = null; //创建Excel工作薄 Workbook work = this.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 int s=work.getNumberOfSheets(); for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if(sheet==null){continue;} int s2=sheet.getLastRowNum(); //遍历当前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(this.getCellValue(cell)); } list.add(li); } } work.close(); return list; } /** * 描述:根据文件后缀,自适应上传文件的版本 * @param inStr,fileName * @return * @throws Exception */ public 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; } /** * 描述:对表格中数值进行格式化 * @param cell * @return */ public Object getCellValue(Cell cell){ Object value = null; DecimalFormat df = new DecimalFormat("0"); //格式化number String字符 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; }