金蝶EAS开发 第四弹:获取Excel数据并显示到UI中的KDTable控件上

导读:本篇文章讲解 金蝶EAS开发 第四弹:获取Excel数据并显示到UI中的KDTable控件上,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

已具备条件:整体已搭建完毕,仅差代码部分

1.UI已经建好,包含KDTable等控件
2.与该KDTable对应的实体类,作为接收数据的载体
3.KDTable已经建立好表头表列信息,一般与实体类属性对应
4.一张Excel表格,实体类的属性一般也会与表格内容对应

功能描述:

点击按钮→弹出选择框,从本地选择Excel文件→在KDTable上显示Excel内容

具体实现:

  public void importdata_actionPerformed(ActionEvent e) throws Exception
    {
		//创建文件选择器对象
		JFileChooser file = new JFileChooser();
		//创建文件名过滤器对象,只显示xls,xlsx格式文件
		FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel文件",
				"xls", "xlsx");
		//从可用文件过滤器的列表中移除 AcceptAll文件过滤器
		file.setAcceptAllFileFilterUsed(false);
		//将filter设置为文件过滤器
		file.setFileFilter(filter);
		//弹出Open File对话框如果选择的不是确认则直接终止
		if (file.showOpenDialog(this) != JFileChooser.APPROVE_OPTION)
			return;
		//获得用户选择的文件的路径
		this.fileName = file.getSelectedFile().getPath();
		//长时间对话框对象
		LongTimeDialog dialog = new LongTimeDialog((Frame) SwingUtilities
				.getWindowAncestor(this));
		//为长时间对话框对象设置长时间任务,直接创建ILongTimeTask的局部内部类
		dialog.setLongTimeTask(new ILongTimeTask() {

			@Override
			public Object exec() throws Exception {
				try {
					//创建KDSBook的引用
					KDSBook book = null;
					//根据ImpCashDetailUI的对象获得文件名
					String fileName = ImpCashDetailUI.this.fileName;
					//如果选择的这个文件的后缀是xls,则利用POIXlsReader解析这个文件
					if (ImpCashDetailUI.this.fileName.toLowerCase().endsWith(
							"xls"))
						book = POIXlsReader.parse(fileName);
					else if (fileName.toLowerCase().endsWith("xlsx"))  //后缀为xlsx同上
						book = POIXlsxReader.parse(fileName);
					else {  //不符合EXCEL文件格式显示提示
						return "不支持的文件格式。";
					}
					//如果book没有被赋上解析文件后产生的对象
					if (book == null) {
						return "不支持的文件格式。";
					}
					
					//清除目前的记录(防止再次读取文件时叠加)
			    	kdtCash.removeRows();
			    	
					//========================导入start===========================
					//利用解析后的book对象获得sheet对象(这里为0则是第一个sheet)
					KDSSheet sheet = book.getSheet(new Integer(0));
					//创建ImpCashDetailCollection对象(根据实体自动生成)
					ImpCashDetailCollection impCashDetailCollection = new ImpCashDetailCollection();
					//循环工作表取出数据
					for (int i = 2; i < sheet.getRowCount(); i++) {
						//创建ImpCashDetailInfo对象
						ImpCashDetailInfo cashinfo=new ImpCashDetailInfo(); 
						
						//公司名称(自有属性)
						String companyName=sheet.getCell(i,0,true).getText();
						//银行名称(自有属性)
						String bankName=sheet.getCell(i,1,true).getText();
		
						//当前工作表中公司和银行的名称都为空则判定为已经没有值了,结束从工作表读取数据
						if("".equals(companyName)&&"".equals(bankName)){  
							break;
						}
		
						//账户(连接属性)
						String bankNumber=sheet.getCell(i,2,true).getText();
						if(bankNumber==null||bankNumber.length()<1){
							return "导入失败,存款工作表第"+(i+1)+"行账户不得为空";
						}
						bankNumber=bankNumber.replaceAll(" ", ""); //去除账户中的空格
						AccountBankCollection accountBankColl=AccountBankFactory.getRemoteInstance().getAccountBankCollection(
								"select *,company.* where bankAccountNumber = '" + bankNumber + "'");  //根据账户可查到对应的银行名与公司名
						if(accountBankColl!=null &&accountBankColl.size()>0)
						{
							//为cashinfo赋上银行名,账户,公司名
							cashinfo.setBanknumber(bankNumber);
							cashinfo.setBankaccountid(accountBankColl.get(0));
							cashinfo.setCompanyid(accountBankColl.get(0).getCompany());
						}else{
							return "导入失败,存款工作表第"+(i+1)+"行账户查询不到";
						}
						//日期(自有属性)
						String dateStr=sheet.getCell(i, 3, true).getText();
						if(dateStr==null||dateStr.length()<1){
							return "导入失败,存款工作表第"+(i+1)+"行日期不得为空";
						}
						//对日期的字符串处理
						String[] split = dateStr.split("="); 
						String[] split2 = split[1].split(",");
						Date bizdate=new Date(Long.parseLong(split2[0]));
						cashinfo.setBizdate(bizdate);
						
						//导入对应的容器对象中
						impCashDetailCollection.add(cashinfo);	
					}
					//========================导入end============================
					//========================回显start==========================
					//将查询到的数据存入map中
					HashMap<Integer,ImpCashDetailInfo> map = new HashMap<Integer,ImpCashDetailInfo>();
					for(int i=0;i< impCashDetailCollection.size();i++){
						map.put(i, impCashDetailCollection.get(i));
					}
					//根据map的key进行排序
					Integer[] items =new Integer[map.size()];
					Set<Integer> keyset= map.keySet();
					keyset.toArray(items);
					Arrays.sort(items);
					//循环所有数据回显到UI中
					for(Integer item : items){
						ImpCashDetailInfo impCashDetailInfo = map.get(item);
						IRow row = kdtCash.addRow();
						row.getCell("fcompanyid").setValue(impCashDetailInfo.getCompanyid());
						row.getCell("fbankaccountid").setValue(impCashDetailInfo.getBankaccountid());
						row.getCell("fbanknumber").setValue(impCashDetailInfo.getBanknumber());
						row.getCell("fbizdate").setValue(impCashDetailInfo.getBizdate());
						//自适应列宽
						KDTableHelper.autoFitColumnWidth(kdtCash, 0);
						KDTableHelper.autoFitColumnWidth(kdtCash, 1);
						KDTableHelper.autoFitColumnWidth(kdtCash, 2);
						KDTableHelper.autoFitColumnWidth(kdtCash, 3);
					}
					//========================回显end==========================
					
			
					return "导入成功。";
				}catch (Exception ex) {
					ex.printStackTrace();
					String message = ex.getMessage();
					return message == null ? "导入失败,请查看日志。" : message;
				}
			}

			@Override
			public void afterExec(Object result) throws Exception {
				if (result != null) {
					com.kingdee.eas.util.client.MsgBox.showInfo(result
							.toString());
				}
			}
		});
		
		Component[] cps = dialog.getContentPane().getComponents();
		for (Component cp : cps) {
			if (cp instanceof JLabel) {
				((JLabel) cp).setText("执行中,请稍后.......");
			}
		}
		dialog.show();
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16675.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!