`
珊瑚成长日记
  • 浏览: 21028 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

excel数据解析

    博客分类:
  • java
 
阅读更多

今天的系统开发中有一个需要解析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'/>">
						&nbsp;
		    批量证书录入
	    </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();
	}
}

 

分享到:
评论

相关推荐

    【Unity】升级版·Excel数据解析,自动创建C#类,自动创建ScriptableObject生成类,自动序列化Asset

    Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件 功能介绍链接 https://z-c-s.blog.csdn.net/article/details/125608062

    Qt 集成adb工具,excel工具使用,excel数据解析

    之前做的一个外包项目,现公布源码和可执行程序 1、使用qt在pc上面创建、解析excel文件,动态导入到手机 2、从手机导出excel文件到pc并在软件上面打开,修改...3、主要时excel的使用,解析excel数据,需要的可以看看

    导入excel数据到数据库 .net上传解析excel

    在.NET框架中,导入Excel数据到数据库是一项常见的任务,它涉及到文件上传、Excel数据解析以及数据库操作。以下是对这一过程的详细阐述。 首先,我们需要理解.NET中的文件上传机制。这通常涉及用户通过Web表单或者...

    python解析excel数据成proto、idl或者struct格式

    本主题聚焦于如何使用Python语言将Excel数据解析并转化为proto、IDL(Interface Definition Language)或struct格式。这三种格式各有其特点和用途,通常在分布式系统、网络通信以及数据序列化中扮演重要角色。 1. *...

    Java解析大数据量Excel,可解析1048576行excel

    本文将深入探讨如何利用Java和Apache POI来高效地解析百万行的Excel数据。 首先,理解Excel文件的结构至关重要。Excel 2007及以上版本(.xlsx格式)使用了基于OpenXML标准的ZIP文件结构,这使得文件可以被分割成多...

    java版excel解析,并上传至mysql数据库

    在Java编程环境中,将Excel数据解析并上传到MySQL数据库是一项常见的任务,特别是在数据处理和导入导出场景下。本项目提供了完整的解决方案,包括所需的jar包、数据库SQL语句以及一个可直接在Eclipse环境中运行的...

    Java Poi 解析EXCEL数据

    **解析Excel数据的基本步骤如下:** 1. **添加依赖**:首先,在你的项目中引入Poi库。如果你使用Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi &lt;version&gt;4.1.2 ...

    基于SpringBoot、JDBC、Mybatis和EasyExcel的Java Excel批量导入导出设计源码

    该项目是一款基于SpringBoot、JDBC、Mybatis和EasyExcel的Java Excel批量导入导出解决方案...该系统适用于实现高效的Excel数据处理,支持SpringBoot框架和Mybatis持久层技术,并通过EasyExcel实现Excel的快速读写操作。

    SpringBoot实现Excel文件解析

    在Spring Boot框架中,实现Excel文件的解析是一个常见的需求,特别是在数据导入、导出或数据分析的应用场景中。本文将深入探讨如何使用Spring Boot结合Java来处理Excel文件。 首先,我们需要引入处理Excel文件的库...

    java 解析Excel 并判断解析的数据类型__Eclipse工程

    本项目特别强调“判断解析的数据类型”,这意味着在处理Excel数据时,开发者可能着重于检查每个单元格的数据是否符合预期的类型,以确保后续处理的正确性。例如,如果一个单元格应该存储日期,但实际包含的是文本,...

    java解析Excel文件并把数据存入数据库和导出数据为excel文件SpringBoot代码示例

    1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....

    java解析excel并做数据有效性校验

    在Java编程中,解析Excel文件是一项常见的任务,特别是在数据处理、报表生成或数据分析等领域。Excel文件格式主要有两种:老式的`.xls`(基于BIFF格式)和较新的`.xlsx`(基于Open XML标准)。本篇将详细介绍如何...

    java上传excel并且解析入库

    解析出Excel数据后,下一步是将这些数据存入数据库。这通常涉及到JDBC或ORM框架如Hibernate。如果你选择JDBC,可以创建PreparedStatement来执行SQL语句,将解析出的数据插入到对应的数据库表中。例如: ```java ...

    Java读取Excel解析为JavaBean

    本教程将详细介绍如何使用Apache POI库将Excel数据解析为JavaBean对象。 首先,我们有两个关键的Java类:`NewModel.java` 和 `ExcelHead.java`。`NewModel.java` 应该是定义了与Excel工作表列对应的JavaBean。这个...

    excel复制数据,粘贴到页面表格插件.zip

    `tableCJ`可能是实现此功能的自定义JavaScript代码,可能包含了对Excel数据解析和页面表格操作的逻辑。 1. **jQuery**:在这个项目中,jQuery被用来操作DOM(文档对象模型)元素,如选取表格元素、添加和删除表格行...

    js读取excel,解析excel数据

    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...

    flex excel智能比对导入数据功能

    2. **Excel数据解析**:Java提供了强大的API,如Apache POI库,用于读取和操作Excel文件。通过这些API,可以解析Excel的工作表,获取每一行和每一列的数据。项目中,Flex前端上传的Excel文件会被Java后端解析,找到...

    上传下载EXCEL与解析

    标题中的“上传下载EXCEL与解析”涉及到的IT知识点主要集中在Excel文件的处理,这通常包括文件的上传、下载操作以及对Excel数据的解析。在Web应用开发中,这些功能非常常见,例如在数据分析、报表生成或者用户交互...

    实现大数据量的excel文件解析POI

    在大数据处理领域,高效地解析Excel文件是一项关键任务,尤其是当面对海量数据时。Apache POI是一个流行的开源库,专门用于读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇将深入探讨如何利用...

    前端js解析/读取excel文件

    在前端开发中,有时我们...总结,使用`js-xlsx`库,前端开发者可以轻松地实现Excel文件的读取和解析,从而在网页上实现与Excel数据的交互。通过熟练掌握这个库,你可以构建功能丰富的数据导入导出功能,提升用户体验。

Global site tag (gtag.js) - Google Analytics