#星空云诊所#项目中如何在星空中自己根据EXCEL导入模板写一个定制的导入功能呢

在很多项目中,有挺多的特殊场景,标准的导入功能可能无法满足导入的需求,并且在导入单据中基础资料特别多的时候,需要先把基础资料导入后对应关联ID需要抓过来后才可以进行导入,存在一些不方便性,另外可能实际导入过程中还有一些特殊想处理和干预的场景,只能通过开发定制一个导入功能,实现方案如下:
一、上传页面尽量使用一个动态表单,需先加入一个附件上传控件

二、并需要对上传做一些基本控制,比如附件在使用中不能上传,上传过程中上传按钮不能使用等基本控制。
public override void CustomEvents(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.CustomEventsArgs e)
{
if (e.Key.ToUpper() == FILEUPLOAD.ToUpper())
{
this.View.GetControl(FILEUPLOAD).SetCustomPropertyValue("NeedCallback", true);
this.View.GetControl(FILEUPLOAD).SetCustomPropertyValue("IsRequesting", false);
if (e.EventName.ToUpper() == FILECHANGED)
{
//上传结束保存上传结果
JSONObject uploadInfo = Kingdee.BOS.JSON.KDObjectConverter.DeserializeObject<JSONObject>(e.EventArgs);
if (uploadInfo != null)
{
JSONArray json = new JSONArray(uploadInfo["NewValue"].ToString());
if (json.Count > 0)
{
string fileName = (json[0] as Dictionary<string, object>)[SERVERFILENAME].ToString();
ExportFileName = fileName;
CheckFile(fileName);
_filePath = GetFilePath(fileName);
this.View.StyleManager.SetEnabled("F_PEIZ_Import", "uploadLock", true);
this.View.GetControl("F_PEIZ_ShowWait").Text = "可以点击导入数据按钮了";
}
else
{
this.View.StyleManager.SetEnabled("F_PEIZ_Import", "uploadLock", false);
this.View.GetControl("F_PEIZ_ShowWait").Text = "请等待文件上传完成后才可点击导入数据按钮";
}
}
}
else if (e.EventName.ToUpper() == STATECHANGED)
{
JSONObject state = Kingdee.BOS.JSON.KDObjectConverter.DeserializeObject<JSONObject>(e.EventArgs);
if (state["State"].ToString() != "2")
{
this.View.StyleManager.SetEnabled("F_PEIZ_Import", "uploadLock", false);
this.View.GetControl("F_PEIZ_ShowWait").Text = "请等待文件上传完成后才可点击导入数据按钮";
}
}
}
base.CustomEvents(e);
}
private void CheckFile(string fileName)
{
string[] fileType = fileName.Split('.');
if (fileType.Length == 2)
{
if (!fileType[1].EqualsIgnoreCase("xls") && !fileType[1].EqualsIgnoreCase("xlsx"))
{
throw new KDException(Kingdee.BOS.Resource.ResManager.LoadKDString("文件上传", "002013030003865", Kingdee.BOS.Resource.SubSystemType.BOS), Kingdee.BOS.Resource.ResManager.LoadKDString("请选择正确的文件进行引入", "002013030003868", Kingdee.BOS.Resource.SubSystemType.BOS));
}
}
}
/// <summary>
/// 获取服务器文件路径,写个方法 便于修改存储路径
/// </summary>
/// <param name="serverFileName"></param>
/// <returns></returns>
private string GetFilePath(string serverFileName)
{
string dir = "FileUpLoadServices\\UploadFiles";
return PathUtils.GetPhysicalPath(dir, serverFileName);
}
三、导入时从EXCEL获取根据字段名称循环获取EXCEL内容,并可以对导入前文件的内容做一些校验。
using (ExcelOperation helper = new ExcelOperation(this.View))
{
DataSet ds = helper.ReadFromFile(_filePath, 1, 0);
//不能选择在Excel转DataSet帮助方法内跳过“枚举值对应表”页签,因为是通用的帮助方法,所以改在外面移除DataTable表。
//而ExcelOperation.ReadFromFile()方法里,能跳过“引入模板说明”页签是因为最后有值得列序号colIndex == 0
bool hasData = ds.Tables.Cast<DataTable>().Any(p => p.Rows.Count > 0);
if (!hasData)
{
this.View.Session["ProcessRateValue"] = 100;
ResultErrInfo= "引入数据为空!";
this.View.ShowErrMessage(Kingdee.BOS.Resource.ResManager.LoadKDString(ResultErrInfo, "002013030003994", Kingdee.BOS.Resource.SubSystemType.BOS));
return;
}
else
{
if (!ds.Tables[0].Columns.Contains("销售单号") || !ds.Tables[0].Columns.Contains("任务单号") || !ds.Tables[0].Columns.Contains("客户编码")
|| !ds.Tables[0].Columns.Contains("产品代码") || !ds.Tables[0].Columns.Contains("产品名称") || !ds.Tables[0].Columns.Co
#星空云诊所#项目中如何在星空中自己根据EXCEL导入模板写一个定制的导入功能呢
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



