1. 功能介绍

    导入数据

  2. 开发步骤

    1. 准备导入的配置(import/xxx.xml),可以配置格式校验
    2. 准备导入错误的EXCEL的配置(export/xxximport.xml),为了保证原始数据,最好将type="1";这样不会做任何的格式转换,
      同时,需要加上IMPORT_ERROR的配置用来显示具体得导入错误
    3. 编写批量导入业务逻辑,业务方面的校验需要自己写
    4. 编写批量导入的页面类方法
    5. 编写批量导入的页面,注意Form必须设置enctype="multipart/form-data",否则无法读取文件
    6. 准备批量导入模板供用户下载,模板一般放在templet/xxx/xxx.xls下
    7. 必须加上标准的验证方法,如verifyAll,confrimForm,cinfrimInfo等方法,否则后台无法获取数据
  3. 代码片段

    1. XML配置文件代码(参考quickstart/etc/../import/examples/basic/VipcustList.xml)

      1. 导入需要的配置文件

        <sheet desc="VIP客户资料">
        	<header isshow="true" height="300">
        		<cell
        			name="USECUST_ID"
        			desc="客户标识"
        			type="2"
        			align="1"
        			width="4000"
        			nullable="no"
        			maxsize="16"
        		/>
        		<cell
        			name="USECUST_NAME"
        			desc="客户名称"
        			type="1"
        			align="1"
        			width="6000"
        			nullable="no"
        			maxsize="100"
        		/>
        		.......
        	</header>
        </sheet>
        

        说明:需要关注导入的excel列的输入格式,如最大输入长度,是否必填,日期、金额的格式等(参考quickstart/etc/../export/examples/basic/VipcustList.xml)
      2. 导入失败的数据,需要配置的文件

        <sheet name="VIP客户资料" desc="日程信息">
        	<header isshow="true" height="300">
        		<cell
        			name="SCHE_SUBJECT"
        			desc="日程主题"
        			type="1" //类型(1:字符串;2:数字;3:时间)
        			align="1" //排列方式
        			width="6000" //所占宽度
        		/>
        		<cell
        			name="IMPORT_ERROR"
        			desc="导入错误"
        			type="1"
        			align="1"
        			width="10000"
        		/>
        	</header>
        </sheet>
        

        说明:
        1. 由于失败的数据需要和输入前的保持一致,故最好将所有列的配置设为type="1",将所有的数据生成时不做转换都生成为文本格式,比如:如果设置了type="3"(时间类型),并设置了format="yyyy-MM-dd HH:mm",如果导入的数据填的是2007-03-01,但由于指定了类型和格式,导出会将数据转换为2007-03-01 00:00形式,这样就丢失了数据的原有形式。
        2. 导出的配置不需要设定格式
    2. HTML写法(参考quickstart/web/examples/basic/VipcustList.html)

      1. 设置form对象属性
      2. 设置enctype="multipart/form-data" //以文件流形式提交服务器,这样服务器可以取到文件流
      3. <input type="file" name="FILE_PATH"/> //选择文件
      4. <a href="#" jwcid="@LinkSubmit" listener="ognl:listeners.importSchedules" value="导入" desc="日程信息">
      5. <a href="attach?file_name=日程批量导入模板.xls&file_path=/templet/examples/basic/VipcustTemplet.xls" target="printframe">
      说明:file_name是下载导出模板的名称,file_path是模板文件所在路径
    3. JAVA(PAGE)写法(参考quickstart/src/doc/../examples/basic/VipcustImport.java)

      /**
       * 导入VIP客户资料
       * @param cycle
       * @throws Exception
       */
      public void importVipcusts(IRequestCycle cycle) throws Exception {
      	PageData pd = getPageData();
      	
      	IDataset dataset = ExcelParser.importExcel(pd, "examples/basic/VipcustList.xml", pd.getUploadFile("FILE_PATH").getStream())[0];
      	
      	/* 执行导入并获取错误的数据 */
      	ExamplesBean bean = new ExamplesBean();
      	IDataset failds = bean.importVipcusts(pd, dataset);
      	
      	/* 将失败的数据生成excel */
      	if (failds.size() != 0) {
      		String file_id = ExcelParser.writeExcelByImport(pd, "examples/basic/VipcustImport.xml", new IDataset[] { failds });
      		/* 导入情况汇总,并下载导入失败的数据 */
      		redirectToMsgByPopup("VIP客户资料批量导入情况:共导入" + dataset.size() + "条,
      		成功" + (dataset.size() - failds.size()) + "条,失败" + failds.size() + "条,
      		请击[" + ExcelParser.getFailedLinkByImport(file_id, "日程批量导入失败列表.xls") + "]下载导入失败文件");	
      	} else {
      		redirectToMsgByPopup("VIP客户资料批量导入成功,按【关闭】关闭窗口回到主页面");
      	}
      }
      
    4. JAVA(BEAN)写法(参考quickstart/src/doc/../examples/basic/ExamplesBean.java)

      /**
       * 批量导入VIP客户资料
       * @param pd
       * @param dataset
       * @return IDataset
       * @throws Exception
       */
      public IDataset importVipcusts(PageData pd, IDataset dataset) throws Exception {	    
      	ExamplesDAO dao = new ExamplesDAO(pd);
      	
      	IDataset succds = new DatasetList();	//成功结果集
      	IDataset failds = new DatasetList();	//失败结果集
      	for (int i=0; i<dataset.size(); i++) {
      		IData data = (IData) dataset.get(i);
      		
      		boolean import_result = data.getBoolean("IMPORT_RESULT");
      		/* 判断导入数据输入校验是否通过 */
      		if (!import_result) {
      			failds.add(data);
      			continue;
      		}
      		
      		/* 判断导入数据业务逻辑校验是否通过 */
      		String net_type_code = (String) data.get("NET_TYPE_CODE");
      		
      		StringBuffer import_error = new StringBuffer();
      		/* 判断网别类型是否是系统支持的,仅作为举例说明下业务逻辑的判断,这种校验在xml中配置datasrc即可 */
      		if (net_type_code != null && !(ExampleFactory.VIP_NETTYPE_DEFAULT.equals(net_type_code))) {
      			import_error.append("网别类型系统不支持;");
      		}
      		/* 存放失败数据 */
      		if (import_error.length() > 0) {
      			data.put("IMPORT_RESULT", "false");
      			data.put("IMPORT_ERROR", import_error.toString());
      			failds.add(data);
      			continue;
      		}
      		
      		/* 正确数据处理 */
      		data.put("USER_ID", data.get("USECUST_ID"));
      		data.put("CUST_ID", data.get("USECUST_ID"));
      		data.put("CUST_NAME", data.get("USECUST_NAME"));
      		data.put("VIP_ID", dao.getSequence("SEQ_VIP_ID"));
      		data.put("REMOVE_TAG", ExampleFactory.VIP_REMOVETAG_VALID);
      		data.put("NET_TYPE_CODE", ExampleFactory.VIP_NETTYPE_DEFAULT);
      		data.put("IN_STAFF_ID", pd.getContext().getStaffId());
      		data.put("IN_DEPART_ID", pd.getContext().getDeptId());
      		data.put("CITY_CODE", pd.getContext().getCityId());
      		data.put("EPARCHY_CODE", pd.getContext().getEpachyId());
      		data.put("JOIN_DATE", common.getSysTime());
      		data.put("IN_DATE", common.getSysTime());    		
      		succds.add(data);
      	}
      	dao.insert("TF_F_CUST_VIP", succds);	//批量创建数据到表
      	
      	return failds; //返回错误的结果集
      }