NC客开入门与代码示例(导入开发)

一、导入功能实现逻辑

  NC63以上,留下了可以客户开发的重要节点,功能注册,在这个节点,你甚至可以开发一个节点,今天我们要讲的导入既是最基础的类的结合体,但是也是NC甲方公司最常用的功能,下面我们就先分析一下开发的代码逻辑。

  代码逻辑很简单,拦截器+excel相关实现类,这些都是系统内置的类,首先我来介绍下拦截器,与spring的拦截器很像,在xml加一个按钮监听,绑到功能注册,下面是一段示例

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd">
	
<bean class="nc.ui.pubapp.plugin.action.InsertActionInfo">
    <property name="actionContainer" ref="actionsOfList" />
    <property name="actionType" value="notedit"/>
    <property name="target" ref="printActionGroup"/>
    <property name="pos" value="after"/>
    <property name="action" ref="tidaiping"></property> <!-- 注册按钮的action-->
  </bean>  
  	<bean id="tidaiping" class="nc.ui.so.m5x.excel.action.ImportAction">
  	   
		<property name="model" ref="ManageAppModel" />
	</bean> 

  绑定了按钮之后我们就要进行导入代码的开发,我们先要调用Dlg类,弹出框给用户选择excel文件

JComponent parent = this.getModel().getContext().getEntranceUI();
ExcelImportDlg dlg = new ExcelImportDlg(parent);
 String path = dlg.getExcelPath(ExcelParameter.IMPORT);
		
		if (path == null) {
			return;
		}
		String filetype = "xls";

		File file = new File(path);
		if (file.getPath().endsWith("xlsx")) {
			filetype = "xlsx";
		}

  获取到excel的输入流,将数据放入sheet类

InputStream istream = new FileInputStream(file);

		Workbook wb = operator.read(istream, filetype);
		// 获取Excel两个页签
		Sheet sheet = wb.getSheetAt(0);
		Sheet sheet1 = wb.getSheetAt(1);
		List data = new ArrayList();
		List updata = new ArrayList();
		int lastrow = sheet.getLastRowNum();
		int lastrow1 = sheet1.getLastRowNum();

		boolean flag = false;
		for (int j = 4, m = 0; j <= lastrow; j++, m++) {
			BuyLargessHVO  hvo = new BuyLargessHVO();
			List insblist = new ArrayList();
			List upblist = new ArrayList();
			Row row = sheet.getRow(j);
			String cprioritycode  = null;
			
				if (flag == false) {
                //获取第一行
                String mcode = row.getCell(0)
									.getStringCellValue();
                //第一页为表头,第二页为表体,表头表体互相连接
                boolean flagno = false;
					
					List binslist = new ArrayList();
					List <BuyLargessBVO> bupdlist= new ArrayList();
					for (int i = 4; i <= lastrow1; i++) {
						// 设置订单表体信息
						BuyLargessBVO bvo = new BuyLargessBVO();
						
						Row row1 = sheet1.getRow(i);
						int bodyno=0;
						int headno =0;
						try{
							
							 bodyno = Integer.valueOf(row1.getCell(0).toString());
						}catch(Exception e){
							 bodyno =(int) row1.getCell(0).getNumericCellValue();
						}
						try{
							
							headno = Integer.valueOf(row.getCell(0).toString());
						}catch(Exception e){
							headno =(int) row.getCell(0).getNumericCellValue();
						}
						
						
						// 确定表头表体对应关系
						if (bodyno == headno) {
							flagno = true;
						} else {
							flagno = false;
						}
						// 如果表体序号和表头相同则将表体这行数据的Cbillid和表头的Cbillid同步 
                        //(建立对应关系)
						if (flagno == true) {
                           String dbegdate  = row1.getCell(1)
											.getStringCellValue();
                          }
             }

将表头表体放到vo中,NC开发基本上是把表头set进vo.parent,表体,set进vo.children,最后将vo放进List中,访问接口

BuyLargessVO vo = new BuyLargessVO();
					vo.setParentVO(hvo);
vo1.setChildrenVO((CircularlyAccessibleValueObject[]) binslist.toArray(new BuyLargessBVO[binslist.size()]));

接口是需要录日志,然后慢慢debug的,一般的接口都是maintain开头或者结尾的类,查找一下就行,按照他的要求封装vo后,传参调用就行,不行的话,只能自己写接口,然后增删改查。

  代码骨架大概就是这样了,类全是nc原生的,我就是把他们聚到一起,然后开发,需要的就是一点点经验就能开发了,需要的话我会在下一个文章发出来,基本上改一改model还有按钮位置就能用,有问题的可以反馈,包教包会。

上一篇:【Azure 应用服务】探索在Azure上设置禁止任何人访问App Service的默认域名(Default URL)


下一篇:Python语法——实现nc文件可视化