有需求把excel导入到数据库,很长时间没有写过文件IO方面的代码,第一时间没有选择用什么插件,第一时间就是找资料,
在这感谢http://blog.csdn.net/tmaskboy/article/details/51755305 文章java代码只是进行了部分改造
不多说直接上过程
读取文件流,页面需设置表单的MIME编码enctype="multipart/form-data",表单内容
<form action="xxx" id="importExcelForm" method="post" enctype="multipart/form-data"> <input type="file" name="excelFile" id="file" /> <input type="button" id="importExcel" class="uum_inputbutton" value="导入"> </form> 如果需要使用异步上传,提交表单可以使用jquery.from.js
$("#importExcelForm").ajaxSubmit({ //定义返回JSON数据,还包括xml和script格式 dataType:'json', beforeSend: function() { //表单提交前做表单验证 }, success: function(data) { //提交成功后调用 alert(data); showProdList(); }, error:function(data){ alert(data); } });java后端使用springmvc自动注入file对象,获取文件输入流,读取文件 @RequestMapping(value=Url.IMPORT_EXCEL_REWARD) public @ResponseBody String importExcelReward(HttpServletRequest req,HttpServletResponse resp,@RequestParam MultipartFile excelFile){ String message = ""; try { List<Map<String, Object>> lists = ReadExcel.read2007Excel(excelFile.getInputStream()); message = rewardService.importExcelReward(lists); } catch (Exception e) { e.printStackTrace(); message = "导入失败!失败原因如下:<br>"+e.getMessage(); return message; } return message; }通过输入流读取文件
public static String[] paramArray = {"参数名称"....}; /** * 读取Office 2007 excel * */ public static List<Map<String, Object>> read2007Excel(InputStream fileInputStream) throws IOException { List<Map<String, Object>> list = new LinkedList<Map<String, Object>>(); // 构造 XSSFWorkbook 对象,strPath 传入文件路径 XSSFWorkbook xwb = new XSSFWorkbook(fileInputStream); // 读取第一章表格内容 XSSFSheet sheet = xwb.getSheetAt(0); Object value = null; XSSFRow row = null; XSSFCell cell = null; int counter = 1; DecimalFormat df = new DecimalFormat("0");// 格式化 number String SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串 DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字 for (int i = sheet.getFirstRowNum(); counter < sheet.getPhysicalNumberOfRows(); i++) { row = sheet.getRow(i); if (row == null||i==0) { //表头不取 continue; } else { counter++; } Map<String, Object> linked = new HashMap<String, Object>(); for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) { cell = row.getCell(j); if (cell == null) { value=null; }else{ switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_NUMERIC: if ("@".equals(cell.getCellStyle().getDataFormatString())) { value = df.format(cell.getNumericCellValue()); } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { value = nf.format(cell.getNumericCellValue()); } else { value = sdf.format(HSSFDateUtil.getJavaDate(cell .getNumericCellValue())); } break; case XSSFCell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: value = ""; break; default: value = cell.toString(); } } linked.put(paramArray[j],value); } list.add(linked); } return list; } 因为偷懒,我直接自己定义了一个String数据,put进map对象,想优化的可以将excel的标题行命名为key,这样会更灵活
注:数据库操作省略,oracle不支持批量插入(可以使用UNION ALL方式,前提是字段值没有序列)