`
chengyu2099
  • 浏览: 471201 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

json-jquery-struct 解析例子(map) - 批量导入解析和批量导出

阅读更多
1、点击批量导入,先做个弹出层
   弹出层里面选择文件和返回信息
   确定导入
   返回信息,追加到div里面展示

$.getJSON(encodeURI('xxxAction!toImportExcel.action?filePat
h='+filePath),function(result){
	$.each(result.ERROR_LIST,function(key,value){
		$("#message").append("<font 
	color='red'>"+key+":"+value.errorInfor+"</font><br/>");
	});
});

ACTION - service 主要调用组件类,封装了map集合,列出错误格式集合或正确导入集合

private JSONObject jsonObject = new JSONObject();
//get-set method JSONObject 
// 获取 excel path路径
String filePath = new String(ServletActionContext.getRequest().getParameter("filePath").getBytes("iso8859-1"),"utf-8");
// 获取 map 集合
Map<String,List<ExcelBean>> map = 
	this.customerService.toImportExcel(filePath );
//遍历 map
Iterator it = map.entrySet().iterator();
	List<ExcelBean> errorList = null;
	List<ExcelBean> successList = null;
	while(it.hasNext()){
		Map.Entry mapEntry = (Map.Entry)it.next();
		if(mapEntry.getKey().equals("fail")){
			errorList = (List<ExcelBean>)mapEntry.getValue();
		}else if(mapEntry.getKey().equals("success")){
			successList = (List<ExcelBean>)mapEntry.getValue();
		}
	}
// 返回错误集合 或 操作 批量插入
if(errorList.size() != 0){
    		System.out.println("有错误excel格式,不执行批量操作,返回错误列表");
    		ServletActionContext.getResponse().setCharacterEncoding("UTF-8");
    		JSONArray jsonArray = JSONArray.fromObject(errorList);
    		jsonObject.put("ERROR_LIST", jsonArray);
    		ServletActionContext.getResponse().getWriter().write(jsonObject.toSt
			ring());
    		System.out.println("json :" + jsonObject.toString());
    		return null;
    	}else{
//    		调用dao层执行批量插入操作
    		System.out.println("调用dao层执行批量插入操作");
//    		封装解析成功的数据格式返回
//    		dosomething ...
    		return null;
    	}

xml配置

xml 配置层
<!-- cheng ren yin (structs-jquery-json) -->
<result-types>
	<result-type name="json" 
	class="com.opensymphony.webwork.dispatcher.json.JSONResult"></result-type>
</result-types>
<!-- cry -->
<action name="toExportExcel" class="xxxAction" 
method="toExportExcel"></action>
<action name="toImportExcel" class="xxxxAction" method="toImportExcel">
	<result name="success" type="json"/>
</action>

解析xml组件,把错误的放到 错误集合,正确的放到正确集合

/**
 * ClassName:ImportExcelUtil
 * Project: 
 * Company: 
 *
 * @author   程仁银
 * @version  
 * @since    Ver 1.1
 * @Date	 2011	Apr 20, 2011		10:41:21 AM
 * @see
 */
public class ImportExcelUtil
{
    private HSSFWorkbook book = null;
    
    private HSSFSheet sheet = null;
    
    private HSSFRow row = null;// 行对象
    
    public Map<String,List<ExcelBean>> readTemplateFile(String path)
    {
    	HSSFWorkbook work=null;
    	Map<String,List<ExcelBean>> map = new HashMap<String, 
		List<ExcelBean>>();
        List<ExcelBean> listFail = new ArrayList<ExcelBean>();
        List<ExcelBean> listSuccess = new ArrayList<ExcelBean>();;
        try
        {
            FileInputStream file = new FileInputStream(path);
            work=new HSSFWorkbook(file);
            HSSFSheet sheet=work.getSheetAt(0);
    		HSSFRow row=null;//行对像;
    		HSSFCell cell=null;//列对像;
    		
    		int rowNum ;
    		rowNum=sheet.getLastRowNum();//得到总行数
    		System.out.println("总行数为"+rowNum);
    		for(int i=1;i<=rowNum;i++)
    		{
    			ExcelBean errorBean = new ExcelBean();
    			ExcelBean successBean = new ExcelBean();
    			
    			System.out.println("第 "+i+" 行");
    			row=sheet.getRow(i);
    			
    			//获取名称
    			cell=row.getCell((short)0);
    			String name=this.chickCell(cell);
    			System.out.println("名称 = "+ name);
    			if(("".equals(name) || (null == name))){
    				errorBean.setErrorInfor("第 "+i+" 行 名称"+name+" 格式错误
					!");
    			}else{
    				successBean.setName(name);
    			}
    			//获取客户名称
    			cell=row.getCell((short)1);
    			String nameCn=this.chickCell(cell);
    			System.out.println("客户名称 = "+ nameCn);
    			if(("".equals(nameCn) || (null == nameCn))){
    				errorBean.setErrorInfor("第 "+i+" 行 客户名称"+nameCn+" 格式
					错误!");
    			}else{
    				successBean.setNameCn(nameCn);
    			}
    			//获取邮箱
    			cell=row.getCell((short)2);
    			String email=this.chickCell(cell);
    			System.out.println("邮箱 = "+ email);
    			String check = 
				"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+
				)?\\.)+[a-zA-Z]{2,}$";
    			Pattern regex = Pattern.compile(check);
    			Matcher matcher = regex.matcher(email);
    			boolean isMatched = matcher.matches();
    			if(isMatched){
    				successBean.setEmail(email);
    			}else{
    				errorBean.setErrorInfor("第 "+i+" 行 邮箱"+email+" 格式错误
					!");
    			}
    			//获取电话
    			cell=row.getCell((short)3);
    			String tel=this.chickCell(cell);
    			System.out.println("电话 = "+ tel);
    			String checkTel = 
				"^(13[4,5,6,7,8,9]|15[0,3,8,9,1,7]|188|187)\\d{8}$";
    			Pattern regexTel = Pattern.compile(checkTel);
    			Matcher matcherTel = regexTel.matcher(tel);
    			boolean isMatchedTel = matcherTel.matches();
    			if(isMatchedTel){
    				successBean.setTel(tel);
    			}else{
    				errorBean.setErrorInfor("第 "+i+" 行 电话"+tel+" 格式错误
					!");
    			}
    			//客户主管
    			int responsible = 0 ;
    			cell=row.getCell((short)4);
    			String khzg=this.chickCell(cell);
    			if(("".equals(khzg) || (null == khzg))){
    				errorBean.setErrorInfor("第 "+i+" 行 客户主管"+khzg+" 格式错
					误!");
    			}else{
    				successBean.setFlag(khzg=="是"?"0":"1");
    			}
    			System.out.println("客户主管 = "+ responsible);
    			
    			if(successBean.getEmail() != null && successBean.getFlag() != 
				null &&
    					successBean.getName() != null && successBean.getNameCn() 
						!= null 
    					&& successBean.getTel() != null){
    				listSuccess.add(successBean);
    			}else if(successBean.getEmail() != null || successBean.getFlag() 
				!= null ||
    					successBean.getName() != null || successBean.getNameCn() 
						!= null 
    					|| successBean.getTel() != null){
    				listFail.add(errorBean);
    			}
    			System.out.println("----------------------------------");
    		}
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        /*System.out.println("正确的 " + listSuccess.size());
        for(ExcelBean eb:listFail){
        	System.out.println(eb.getEmail()+" "+ eb.getFlag() +" "+eb.getName() 
			+" "+eb.getNameCn() +" "+eb.getTel() );
        }
        System.out.println("错误的 " + listFail.size());
        for(ExcelBean ebc:listSuccess){
        	System.out.println(ebc.getEmail()+" "+ ebc.getFlag() +" 
			"+ebc.getName() +" "+ebc.getNameCn() +" "+ebc.getTel() );
        }*/
        map.put("success",listSuccess);
        map.put("fail",listFail);
        return map;
    }
    
    private  String chickCell(HSSFCell cell)
	{
//		判断是否为String型
		String all="";
		if(cell.getCellType()==cell.CELL_TYPE_STRING){
				all=cell.getStringCellValue();
				//all=all.replaceAll(",","").trim();
				all.trim();
		}else{
			//判断是否为数值型				
			if(cell.getCellType()==cell.CELL_TYPE_NUMERIC){
				//判断是否为日期型
				if(HSSFDateUtil.isCellDateFormatted(cell))
				{
					Date date=cell.getDateCellValue();
					SimpleDateFormat formatter = new 
					SimpleDateFormat("yyyy-MM-dd"); 
					all=formatter.format(date);
					
				}else{//一般数值型
					double d=cell.getNumericCellValue();
					all=Double.toString(d);
					}	
				}
			}
		return all;
	}
}

POJO

public class ExcelBean implements Serializable{
	private String name ;
	private String nameCn ;
	private String email ;
	private String tel ;
	private String flag ;
	private String errorInfor ;

批量导出 代码 - 根据 sql 语句导出EXCEL

/**
 * ClassName:ExportExcelUtil
 * Project: 
 * Company: xxxxxxxx 人才库 ....
 *
 * @author   程仁银
 * @version  
 * @since    Ver 1.1
 * @Date	 2011	Apr 20, 2011		2:21:45 AM
 * @see
 */
public class ExportExcelUtil {
	private static String shtName = "";
	private static String[] cNames = null;
	private static String[] cLabels = null;
	private static int rpp = 200;
	private static HSSFCellStyle style = null;

	/**
	 * 通过给定的Sql导出Excel文件到Response输出流,需要指定Connection 
	 * 
	 * @param response
	 *            HttpServletResponse Response 
	 * @param conn
	 *            Connection 指定的数据库连接
	 * @param sqlStr
	 *            String 查询的Sql语句
	 * @param sheetName
	 *            String 导出的Excel Sheet名称 
	 * @param columnNames
	 *            String[] 导出的 Excel 列名称
	 * @param rowPerPage
	 *            int 每一个Sheet页的行数 
	 * @throws SQLException
	 *             48.
	 */
	public static void export(Connection conn,
			String sqlStr, String sheetName, String columnNames[],
			int rowPerPage,HttpServletResponse response) throws SQLException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		ps = conn.prepareStatement(sqlStr);
		rs = ps.executeQuery();

		ResultSetMetaData rsmd = rs.getMetaData();
		if (rowPerPage <= 10000 && rowPerPage >= 1) {
			rpp = rowPerPage;
		}
		if (!"".equals(sheetName) && null != sheetName) {
			shtName = sheetName;
		} else {
			shtName = rsmd.getTableName(0);
		}
		cNames = getColumnNames(rsmd);
		if (null != columnNames) {
			cLabels = columnNames; // compare( columnNames ) ;
		} else {
			cLabels = cNames;
		}

		HSSFWorkbook wb = new HSSFWorkbook();
		style = wb.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

		HSSFSheet sheet = createSheet(wb, 1);
		setSheetColumnTitle(sheet);
		int rowCnt = 0;
		int sheetNum = 2;

		while (rs.next()) {
			if (rowCnt == rpp) {
				sheet = createSheet(wb, sheetNum);
				setSheetColumnTitle(sheet);
				rowCnt = 0;
				sheetNum++;
			}
			HSSFRow row = sheet.createRow(rowCnt + 1);
			for (int i = 0; i < cNames.length; i++) {

				HSSFCell cell = row.createCell((short) i);
//				cell.setEncoding(HSSFCell.ENCODING_UTF_16);
				String val = rs.getString(cNames[i]);
				if (null == val) {
					val = "";
				}
				cell.setCellValue(val.toUpperCase());
			}
			rowCnt++;
		}
		try {
			OutputStream os = response.getOutputStream();
			response.reset();
			response.setContentType("application/vnd.ms-excel");
			response.setHeader("Content-disposition", "attachment; 
			filename="+getFileName(shtName));
			wb.write(os);
//			FileOutputStream fos = new FileOutputStream(new 
File("d:\\","saveName.xls"));
//			fos.close();
//			wb.write(fos);
			if (conn != null) {
				conn.close();
			}
		} catch (IOException ex) {
			MyLogger.logserverLogger.info("Export Excel file error ! " + 
			ex.getMessage());
		}
	}

	/**
	 *设置Sheet页的列属性
	 * @param sht
	 * HSSFSheet 124.
	 */
	private static void setSheetColumnTitle(HSSFSheet sht) {
		HSSFRow row = sht.createRow(0);
		for (int i = 0; i < cLabels.length; i++) {
			HSSFCell cell = row.createCell((short) (i));
//			cell.setEncoding(HSSFCell.ENCODING_COMPRESSED_UNICODE);
			cell.setCellValue(cLabels[i]);
			cell.setCellStyle(style);
		}
	}

	/**
	 *  获得源数据中的列名称
	 * @param rsmd
	 * ResultSetMetaData
	 * @return String[] 139.
	 */
	private static String[] getColumnNames(ResultSetMetaData rsmd) {
		try {
			StringBuffer result = new StringBuffer("");
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				result.append(rsmd.getColumnLabel(i)).append(",");
			}
			if (result.length() > 0) {
				return result.substring(0, result.length() - 
				1).toString().split(",");
			}
		} catch (Exception e) {
			return null;
		}
		return null;
	}

	/**
	 *创建一个Sheet页并返回该对象 
	 * @param wb
	 * HSSFWorkbook 
	 * @param seq int 
	 * @return HSSFSheet 
	 */
	private static HSSFSheet createSheet(HSSFWorkbook wb, int seq) {
		int sup = seq * rpp;
		int sub = (seq - 1) * rpp + 1;
		if (sub < 1) {
			sub = 1;
		}
		return wb.createSheet(shtName + "(" + sub + "-" + sup + ")");
	}
	
	private static String getFileName(String tableName) {
		return tableName + new java.util.Date().getTime() + ".xls";
	}
}

========================dao
 @Override
    public void toExportExcel(HttpServletResponse response) {
    	System.out.println("************ - ExportExcelUtil ....");
    	ExportExcelUtil eeu = new ExportExcelUtil();
    	 String[] columnNames = {"名称","邮箱","电话 "};
    	 String QUERY_EXP_SQL = " 自定义,要把这上面几个列查询出来 ";
    	 try {
				eeu.export(this.getSession().connection(), QUERY_EXP_SQL, 
				"excelName_", columnNames,100000,response);
			} catch (SQLException e) {
				e.printStackTrace();
			}
    }

//后期修改
$(function(){
    		$('#sub').click(function()
    		{
    			var filePath = $('#fileId').val();
    			var theform = $('#fileId').val();
    			if(theform==''){
    				alert('请选择excel文件!');
					return   false;
    			}
				if(theform.match(/^(.*)(\.)(.{1,8})$/)[3] != 'xls')   
				{
					alert('文件格式不对,请重新选择!');   
					return   false;   
				}
				// import excel
	    		$.getJSON(encodeURI('customToImportExcel!toImportExcel.action?filePath='+filePath),function(result){
					$.each(result.ERROR_LIST,function(key,value){
						if(value.state=='0'){
							if(key==0){
								//$("#success").append("<font color='red'>错误"+(value.totalRow-result.ERROR_LIST.length)+"行"+"</font><br/>");
								for(var i=0;i<result.ERROR_LIST.length;i++){
									var obj = {};
									for(var j in result.ERROR_LIST[i])   
				                    {
				                        if(j == 'errorInfor')   
				                        {
				                            obj.errorInfor = result.ERROR_LIST[i][j];   
				                        }
				                    }
				                    $("#success").append("<font color='red'>"+obj.errorInfor+"</font><br/>");
								}
							}
							
						}else
						{	
							if(key==0){
							$("#success").append("<font color='red'>成功导入"+(value.totalRow-result.ERROR_LIST.length)+"行"+"</font><br/>");
								for(var i=0;i<result.ERROR_LIST.length;i++){
									var obj = {};
									for(var j in result.ERROR_LIST[i])   
				                    {
				                        if(j == 'errorInfor')   
				                        {
				                            obj.errorInfor = result.ERROR_LIST[i][j];   
				                        }
				                    }
				                   $("#success").append("<font color='red'>"+obj.errorInfor+"</font><br/>");
								}
						}
						}
					});
	     	 	});
    		});
    	});
分享到:
评论
2 楼 snowday88 2011-07-01  
还有这样在页面迭代也是有问题的!太麻烦!可以直接把集合传过来!
1 楼 snowday88 2011-07-01  
王国波:这样做导入是有问题的!如果项目部署在服务器 在本地机导入的话,它的file控件获取path是获取不到的!所以应该先把文件上传然后再解析。
上传有两种方式 异步和同步  异步使用ajaxfileupload.js插件实现ajax文件上传。 同步的话 可以使用struts2文件上传

相关推荐

    json-c-0.9.zip

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于网络数据传输,因为它易于人阅读和编写,同时也易于机器解析和生成。JSON-C是一个针对C语言的JSON库,它提供了解析、生成JSON以及将JSON...

    JSON-C库的源码

    给出的代码片段并不是json-c库的一部分,而是Python与C扩展模块相关的代码,用于定义Python中的JSON解析器和编码器类。尽管如此,我们仍然可以从中学到一些关于C语言和Python扩展编程的知识: ```c #include ...

    mapstruct-1.1.0.Final-API文档-中文版.zip

    赠送jar包:mapstruct-1.1.0.Final.jar; 赠送原API文档:mapstruct-1.1.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.1.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.1.0.Final.pom; 包含翻译后...

    Armink-struct2json-master.zip

    《深入理解Armink-struct2json工具:从结构体到JSON的转换之道》 在现代软件开发中,数据交换和序列化是至关重要的环节。JSON(JavaScript Object Notation)因其简洁明了的格式,被广泛应用于跨平台的数据交互。 ...

    struct2json-master C结构体

    通过"struct2json-master"库,开发者无需从零开始编写复杂的JSON解析和生成代码,而是可以专注于业务逻辑,大大提高了开发效率和代码可维护性。在进行C语言编程并涉及JSON数据交换的项目时,这个库是一个非常实用的...

    Json-lib 是一个 Java 类库

    同时也易于机器解析和生成。它基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯...

    推荐一款Java实体映射工具---mapstruct(csdn)————程序.pdf

    MapStruct 的工作原理是基于Java的JSR 269注释处理器,它通过getter和setter方法进行字段拷贝,避免了反射带来的性能损耗。如果源对象和目标对象的字段名称相同,MapStruct会自动进行映射;对于字段名称不同的情况,...

    Go-go-json-rest一种快速和容易的方式来搭建一个RESTfulJSONAPI

    Go语言是一种高效、轻量级且并发性能出色的编程语言,尤其适合构建网络服务和API。在Go语言中,`go-json-rest`是一个流行的开源库,它简化了创建RESTful JSON API的过程。本篇文章将深入探讨如何使用`go-json-rest`...

    JSON-c语言开发指南剖析.pdf

    ` 和 `double json_object_get_double(struct json_object *this);`:对应于双精度浮点数的创建和获取。 - `struct json_object* json_object_new_string(char *s);` 和 `char* json_object_get_string(struct json_...

    json-to-go:立刻将 JSON 转化为 Go 类型定义的工具 这是一个用 JavaScript 写的在线小工具,可以直接

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。Go语言,由Google开发,是现代编程中的一种高效、简洁的静态类型语言,特别适合构建网络服务和API。在...

    mapstruct-jdk8-1.2.0.Final-API文档-中文版.zip

    赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0....

    mapstruct-spi-protobuf:Mapstruct的Protobuf访问器命名策略

    用于协议缓冲区的Mapstruct SPI实现 这种命名策略有助于在您的域类和protobuf类之间生成有效的映射代码。 无论和类支载。 注意:取决于mapstruct 1.4.0.CR1ProtobufAccessor命名策略扩展...

    struts2-json-plugin-2.3.1.jar

    关于使用struct2框架时部分缺失的json的jar包的补充

    mapstruct-jdk8-1.2.0.Final-API文档-中英对照版.zip

    赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0....

    json、xml解析库x2struct-master

    `x2struct` 是一个针对这两种格式的解析库,它旨在简化JSON和XML的处理,提供类似于JAVA的API,使得在C++中操作这些格式的数据更加简便和高效。 `x2struct` 的核心功能是提供了一套易于理解和使用的接口,用于读取...

    Struts2返回json -- demo

    在Struts2中,返回JSON数据是一种常见的需求,尤其在处理AJAX请求时,它允许前端和后端进行无刷新的数据交互。这篇博客"Struts2返回json -- demo"可能是关于如何在Struts2框架中实现JSON响应的教程。 在Struts2中,...

    json C语言 接口函数

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其特点在于格式简单、易于理解和编写,并且易于机器解析和生成。它基于JavaScript编程语言标准ECMA-262第三版(1999年12月)的一个子集。JSON采用了...

    mapstruct-reference-guide.pdf

    1. **简介**:这部分通常会介绍MapStruct的基本概念和设计原则,包括约定优于配置的哲学,以及如何利用它来简化Java Bean之间的数据转换。MapStruct通过注解驱动的方式工作,开发者只需要定义映射接口,而具体的实现...

    map 和 bean 之间的转换

    map 和 bean 之间的转换,可以利用反射的原理实现

    mapstruct-1.3.1.Final-API文档-中英对照版.zip

    赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后...

Global site tag (gtag.js) - Google Analytics