今天的系统开发中有一个需要解析excel数据的功能,然后将excel的数据插入到数据库。
首先要制作一个excel的导入模版,然后按模版格式读取数据。
实现代码如下,
前台代码:
<script> //确定 function ok_onclick(){ var validateForm = new Validater(); var frm = document.certificateForm; //TODO: 以后要把其他校验规则加上 validateForm.addRule(new SimpleRule(frm.CERTBATCH, validateRequired,"批量证书excel附件")); if ( validateForm.validate() ){ if(confirm("<bean:message key="common.tip.addConfirm"/>") == true){ frm.submit(); } } } function downloadCert(){ var url = '<c:url value="/itms/template/certTemplate.xls"/>'; var obj = document.getElementById('download'); obj.contentWindow.location.href = url; } windowHandler.onload = function(){ <c:if test="${ not empty _tipMsg}"> alert("${_tipMsg}"); </c:if> } </script> </head> <body> <html:form action="/certificate/certificateAction" method="POST" enctype="multipart/form-data" > <input type="hidden" id="_actionType" name="_actionType" value="certBatchInput" /> <table class="buttonTable"> <tr> <td> <owk:button property="okBtn" onclick="ok_onclick()" value="导入"/> <owk:button property="okBtn" onclick="downloadCert()" value="下载模版"/> </td> <td width="60px" ></td> </tr> </table> <table class="subjectEditTable"> <tr> <td><div class="subject"> <img src="<c:url value='/owk/common/images/Title1.gif'/>"> 批量证书录入 </div></td> </tr> </table> <table class="updateTable"> <tr> <td class="label"> 批量证书上传 </td> <td class="input" colspan="120"> <input type="file" required="true" id="CERTBATCH" name="CERTBATCH" style="width:600px;"></input> </td> </tr> </table> </html:form>
后台的action代码:
//批量证书信息导入功能,解析excel数据 @SuppressWarnings("unchecked") public ActionForward certBatchInput(ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest, HttpServletResponse pResponse) throws Exception { //读取上传的模版文件 FormFile fileItem = (FormFile) pForm.getMultipartRequestHandler() .getFileElements().get("CERTBATCH"); InputStream is = null; try { is = fileItem.getInputStream(); } catch (IOException e) { e.printStackTrace(); throw new BusinessException("获取文件对象输入流出错"); } Workbook workbook = ExcelUtil.getWorkBook(is); // 获取导入列表sheet(0) Sheet sheet = workbook.getSheet(0); if (sheet == null) { throw new BusinessException("获取Excel第一个列表数据失败"); } Cell[] row1 = sheet.getRow(1); Cell[] row2 = sheet.getRow(2); if ( !row1[0].getContents().trim().equalsIgnoreCase( "招商银行分行IT管理系统证书信息录入模板") || !row2[0].getContents().trim().equalsIgnoreCase("分行名称") || !row2[1].getContents().trim().equalsIgnoreCase("姓名") || !row2[2].getContents().trim().equalsIgnoreCase("一事通ID") || !row2[3].getContents().trim().equalsIgnoreCase("专业条线") || !row2[4].getContents().trim().equalsIgnoreCase("级别") || !row2[5].getContents().trim() .equalsIgnoreCase("认证时间")) { throw new BusinessException("对不起,模板格式不匹配,无法完成上传,请下载模板填写并上传!"); } // 获取sheet数据 List<Map<String, String>> dataList = ExcelUtil.getRowList(sheet, 3, 0); // 处理sheet数据 List<String> errorList = new ArrayList<String>(); LOOP: for (int i = 0; i < dataList.size(); i++) { OWKMap params = new OWKHashMap(); Map<String, String> data = dataList.get(i); // 获取excel中分行编号 String branchCode = (String) data.get("0"); // 获取excel中姓名 String certOwner = (String) data.get("1"); // 获取excel中一事通ID String certOwnerID = (String) data.get("2"); // 获取excel中责任条线 String busLine = (String) data.get("3"); // 获取excel中级别 String level = (String) data.get("4"); // 获取excel中认证获取时间 String certDate = (String) data.get("5"); // 分行编号验证 if (StringUtils.isEmpty(branchCode)) { errorList.add(String.format("第%d行制度名称为空。", i + 4)); continue LOOP; } //证书人姓名验证 if (StringUtils.isEmpty(certOwner)) { errorList.add(String.format("第%d行制度级别内容为空或不符合格式。", i + 4)); continue LOOP; } //证书人一事通ID验证 if (StringUtils.isEmpty(certOwnerID)) { errorList.add(String.format("第%d行制度级别内容为空或不符合格式。", i + 4)); continue LOOP; } // 责任条线校验以及翻译 if (StringUtils.isEmpty(busLine)) { errorList.add(String.format("第%d行责任条线内容为空或不符合格式。", i + 4)); continue LOOP; } // 证书级别校验 if (StringUtils.isEmpty(level)) { errorList.add(String.format("第%d行证书级别为空。", i + 4)); continue LOOP; } else if (level.trim().equalsIgnoreCase("初级")) { level = Constants.CERTIFICATE_CERTLEVEL_LOWLEVEL; }else if (level.trim().equalsIgnoreCase("中级")) { level = Constants.CERTIFICATE_CERTLEVEL_MIDDLELEVEL; }else if (level.trim().equalsIgnoreCase("高级")) { level = Constants.CERTIFICATE_CERTLEVEL_HIGHLEVEL; }else { errorList.add(String.format("第%d行证书级别输入级别不对。", i + 4)); continue LOOP; } // 认证获取时间校验 if (StringUtils.isEmpty(certDate)) { errorList.add(String.format("第%d行认证获取时间为空。", i + 4)); continue LOOP; } else if(certDate.length() != 8){ errorList.add(String.format("第%d行认证获取时间输入格式不正确。", i + 4)); continue LOOP; } // 证书录入日期 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm"); Date today = new Date(); String inputDate = format.format(today); params.put("INPUTDATE", inputDate); params.put("BRANCHNO", branchCode); params.put("CERTOWNER", certOwner); params.put("CERTOWNERID", certOwnerID); String lineName = Mapper.getLineName(busLine); params.put("LINEID", lineName); params.put("LEVEL", level); params.put("CERTDATE", certDate); //获取分行拼音简写,用于生成编号 String branchSpell = Mapper.getBranchSpell(branchCode); params.put("BRANCHSPELL", branchSpell); //首先检查数据库中是否已存在该人员的证书记录,如存在先删除再插入新数据 try { List certList = CertificateService.getInstance().getCertByCertownerID(params); if (certList.size()>0) { CertificateService.getInstance().deleteCertRepeat(params); } CertificateService.getInstance().insertCertificate(params); } catch (BusinessException ex) { ex.printStackTrace(); pRequest.setAttribute("_tipMsg", "证书信息新增失败!" + ex.getMessage()); } } return pMapping.findForward("batchIndex"); }
excelutil的代码:
/** * */ package com.rb.itms.util; /** * * @author HO274755 * */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; import com.rb.owk.commons.lang.base.orm.BusinessException; import com.rb.owk.commons.lang.key.KeyGeneratorHelper; /** * EXCEL工具类 * * @author HO274509 * */ public class ExcelUtil { private ExcelUtil() { }; /** * 获取excel对象 * * @param is * @return * @throws BusinessException */ public static Workbook getWorkBook(InputStream is) throws BusinessException { Workbook workBook = null; try { workBook = Workbook.getWorkbook(is); } catch (BiffException e) { throw new BusinessException("生成Excel工作薄出错!"); } catch (IOException e) { throw new BusinessException("读取输入流出错!"); } return workBook; } /** * 获取sheet内容,以行为map对象(key值为列值)组装的数组 * * @param sheet * @return */ public static List<Map<String, String>> getRowList(Sheet sheet) { return getRowList(sheet, 0, 0); } /** * 获取sheet内容,以行为map对象(key值为列值)组装的数组 下标从0开始 * * @param sheet * @return */ @SuppressWarnings("unchecked") public static List<Map<String, String>> getRowList(Sheet sheet, int startRowIndex, int startColumnIndex) { int rowCount = sheet.getRows();// 总行数 int columnCount = sheet.getColumns();// 总列数 List<Map<String, String>> result = new ArrayList<Map<String, String>>(); for (int r = startRowIndex; r < rowCount; r++) {// 遍历 Map data = new HashMap<String, String>(); for (int c = startColumnIndex; c < columnCount; c++) { data.put(String.valueOf(c), sheet.getCell(c, r).getContents() .trim()); } result.add(data); } return result; } /** * 把对象数组写到一行excel的不同单元格中 * * @param ws * @param rowNum * @param cells * @throws WriteException * @throws RowsExceededException */ public static void putRows(WritableSheet ws, int rowNum, String[] cells) throws RowsExceededException, WriteException { for (int c = 0; c < cells.length; c++) {// 写一行 Label cell = new Label(c, rowNum, cells[c]); ws.addCell(cell); } } /** * 把对象数组写到一列excel的不同单元格中 * * @param ws * @param rowNum * @param cells * @throws WriteException * @throws RowsExceededException */ public static void putColumns(WritableSheet ws, int columnNum, String[] cells) throws RowsExceededException, WriteException { for (int r = 0; r < cells.length; r++) {// 写一行 Label cell = new Label(columnNum, r, cells[r]); ws.addCell(cell); } } @SuppressWarnings("unchecked") public static void main(String[] args) throws BusinessException, IOException, RowsExceededException, WriteException { InputStream is = new FileInputStream( "E:\\FireFly\\内控风险管理系统\\01文档\\02需求文档\\01客户需求类文档\\1.xls"); Workbook workBook = getWorkBook(is); List<Map<String, String>> rowList = getRowList(workBook.getSheet(0)); // OutputStream os = new FileOutputStream("E:\\xiaolu.txt"); FileWriter writer = new FileWriter("E:\\xiaolu.txt"); BufferedWriter bufferWriter = new BufferedWriter(writer); for (Map row : rowList) { StringBuffer sb = new StringBuffer(); sb.append("\""); sb.append(KeyGeneratorHelper.generateUUIDHex()); sb.append("\","); sb.append("\""); sb.append((String) row.get("0")); sb.append("\","); sb.append("\""); sb.append((String) row.get("1")); sb.append("\","); sb.append("\""); sb.append((String) row.get("2")); sb.append("\"\n"); bufferWriter.write(sb.toString()); } bufferWriter.close(); workBook.close(); // 创建可编辑excel文件 WritableWorkbook writeBook = Workbook.createWorkbook(new File( "E:\\sz.xls")); // 创建sheet页 WritableSheet ws = writeBook.createSheet("深圳用户", 0); String[] title={"员工号","姓名","所在机构","分行代码","网点代码"}; int rowNum = 0; putRows(ws, rowNum, title);//标题 FileReader reader = new FileReader("E:\\sz_users.txt"); BufferedReader bufferReader = new BufferedReader(reader); String value; while ((value = bufferReader.readLine()) != null) { rowNum++; String[] cells = value.split(" "); putRows(ws, rowNum, cells); } writeBook.write(); writeBook.close(); bufferReader.close(); } }
相关推荐
Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件 功能介绍链接 https://z-c-s.blog.csdn.net/article/details/125608062
之前做的一个外包项目,现公布源码和可执行程序 1、使用qt在pc上面创建、解析excel文件,动态导入到手机 2、从手机导出excel文件到pc并在软件上面打开,修改...3、主要时excel的使用,解析excel数据,需要的可以看看
Java解析大数据量Excel,支持解析百万行excel数据,十万数据基本上十来秒就解析完毕,亲测过最大excel1048576行数据用时219秒,硬件好点的PC估计跑起来更快。
通过Java Poi 解析EXCEL数据,内附实现代码,绝对可以用。要分不为别的,只为能给个评论。
1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....
java 解析Excel 并判断解析的数据类型__Eclipse工程,纯手工,无复制
解析excel数据,支持xls、xlsx (03、07版本)excel 数据读取,数据转换成map。实测,54万数据解析完成8-20秒内(远古版i5、16G内存台式机)。
function readExcel(file_obj){ var myIndex = layer.load(2, { shade : [ 0.3, '#C8C8C8' ] }); var reader = new FileReader(); var file = file_obj.files[0]; reader.readAsBinaryString(file); reader...
使用java或android语言解析Excel数据时,通常采用poi的jar包进行解析,当前Apache最近的jar包是3.17,但有时版本过高导致出错,所以也附上poi-3.10的jar包
WEG-Excel-to-JSON 补充工具,用于将《军事全球设备指南》(WEG)Excel数据解析为单个JSON文件。 用作美国陆军OE数据集成网络(ODIN)项目的数据处理工具。
读取EXCEL数据到数据库(C#)\ 读取EXCEL数据到数据库(C#)
前端js解析/读取excel文件,完整解析,简单操作,官网地址 http://oss.sheetjs.com/js-xlsx/
js解析Excel数据xlsx.full.min.js,js解析Excel数据xlsx.full.min.js,js解析Excel数据xlsx.full.min.js,js解析Excel数据xlsx.full.min.js
解析excel 并另存为生成新的excel
使用poi解析excel文件,并将数据写入到数据库 项目说明 这个项目实现的功能是读取excel文件中的数据,解析并写入数据库。 读取的excel文件位于项目目录下的 excel\0805.xlsx 使用IntelliJ IDEA开发此项目 使用MYSQL...
js对excel表格的导入解析成table展示,可以对数据进行筛选处理等等,然后可以把把显示的table按照excel的格式导出
上传本地文件到服务器进行解析,通过poi继续操作数据,易懂简单。
Excel解析类,可以方便实现Excel数据的读取和写入,将最主要的函数接口进一步封装,每个函数都有详细注释。
EXCEL数据的读取方法,数据解析问题,XML 的JSON格式保存数据,大量节省资源。
.net导入excel的数据解析,然后可以添加到数据库中.