一、导入功能实现逻辑
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还有按钮位置就能用,有问题的可以反馈,包教包会。