应用.NET控制台应用程序开发批量导入程序。
一.最近一直在调整去年以及维护去年开发的项目,好久没有在进行个人的博客了。每天抽了一定的时间在研究一些开源的框架,Drapper 以及NHibernate以及当前比较流行的SqlSuper框架 并进行对比当前的EF框架。各有优缺点。不多说了。
二.介绍一下批量导入程序的开发。
1.首先找到EXEL的文件的路径进行读取。
2.应用FileInfo进行读取,读取结束EXEL后将EXEL文件进行移动到其他的文件夹里面保存起来。
3.将FileInfo类用于典型的操作,如复制、移动、重命名、创建、打开、删除和追加到文件。
4.许多FileInfo方法在您创建或打开文件时返回其他 I/O 类型。可以使用这些其他类型进一步操作文件。有关更多信息,请参见特定的FileInfo成员,如Open、OpenRead、OpenText、CreateText或Create。
如果打算多次重用某个对象,可考虑使用 FileInfo的实例方法,而不是File类的相应静态方法,因为并不总是需要安全检查。
默认情况下,将向所有用户授予对新文件的完全读/写访问权限。
下表描述了用于自定义各种 FileInfo 方法的行为的枚举。
枚举 |
说明 |
---|---|
指定对文件的读取和写入访问。 |
|
为已在使用中的文件指定允许的访问级别。 |
|
指定是保留还是改写现有文件的内容,并指定创建现有文件的请求是否会导致异常。 |
![]() |
---|
在接受路径作为输入字符串的成员中,路径必须是格式良好的,否则将引发异常。例如,如果路径是完全限定的但以空格开头,则路径在类的方法中不会被修剪。因此,路径的格式不是良好的,并将引发异常。同样,路径或路径的组合不能被完全限定两次。例如,“c:\temp c:\windows”在大多数情况下也将引发异常。在使用接受路径字符串的方法时,请确保路径是格式良好的。 |
5.然后进行逐行读取变可以了。然后我应用的是原始的EF 进行添加的插入数据的效率不高,但是这个一个非常简单的一个程序。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | static void Main( string [] args) { //进行导入Exel数据 try { WxyhData context = new WxyhData(); string fileDir = Properties.Settings.Default.ExcelFileDir; //进行读取Exel的路径 string fishFile = Properties.Settings.Default.FinishedFileDir; //结束的Exel 的路径 List< string > files = FilesGetter.GetFiles(fileDir); //进行获取目录下面的EXEL int successCount = 0; int updateCount = 0; #region 1.先判断目录是否为空 if (files.Count() > 0) { List< string > processedData = new List< string >(); Console.WriteLine( "开始从根目录{0}导入文件" , fileDir); #region 2.去掉读取Copy中的文件夹里面的内容 foreach ( string fileExc in files) { //判断文件是否存在 if (System.IO.File.Exists(fileExc)) { //如果是以E:\temp\finished 那么就不进行读取否则才进行读取原因是这个是备份的文件 if (fileExc.StartsWith(fishFile) == false ) { GlobalTools.WriteLog( "AutoGetMXIntAcct" , 0, "开始从目录:" + fileDir + "导入文件:" + fileExc); try { Workbook book = new Workbook(fileExc); var cells = book.Worksheets[0].Cells; //从文件第1行开始读取 var table = cells.ExportDataTableAsString(0, 0, cells.MaxRow + 1, cells.MaxColumn + 1, true ); GlobalTools.WriteLog( "AutoGetMXIntAcct" , 0, "开始从目录:" + fileDir + "导入文件:" + fileExc + ", 共" + table.Rows.Count + "条数据" ); #region 3.进行逐条的读取Exel中的每一条的数据进行添加到数据库MX_Int_Acct表中 for ( int i = 0; i < table.Rows.Count; i++) { #region 3.进行读取Exel var row = table.Rows[i]; string sys_CifCode = "" ; //手机号码 string sysAccount = "" ; //身份证号 int balance = 0; string acctName = "" ; try { sys_CifCode = (( string )row[ "手机号码" ]).Trim(); balance = int .Parse((row[ "活动积分" ]).ToString().Trim()); acctName = (( string )row[ "显示名称" ]).Trim() ?? string .Empty; sysAccount = (( string )row[ "身份证号码" ]).Trim(); } catch { sysAccount = string .Empty; acctName = string .Empty; } int count = context.MX_INT_ACCT.Where(p => p.SYS_CIF_CODE == sys_CifCode).Count(); //如果存在记录就就行更新否则就就行插入的动作. if (count > 0) { MX_INT_ACCT mxIntAcct = context.MX_INT_ACCT.Where(p => p.SYS_CIF_CODE == sys_CifCode).FirstOrDefault(); mxIntAcct.ACCT_NAME = acctName; mxIntAcct.BALANCE = balance; mxIntAcct.SYS_CIF_CODE = sys_CifCode; mxIntAcct.UPDATE_DATE = DateTime.Now; mxIntAcct.SYS_ACCOUNT = sysAccount; updateCount++; Console.WriteLine( "更新成功{0}数据" , updateCount); } else { if (processedData.Contains(sys_CifCode)) { continue ; } processedData.Add(sys_CifCode); MX_INT_ACCT mxIntAcct = IntitalMxIntAcct(acctName, balance, sysAccount, sys_CifCode); context.MX_INT_ACCT.AddObject(mxIntAcct); successCount++; Console.WriteLine( "导入成功{0}数据" , successCount); } #endregion } using (TransactionScope trans = new TransactionScope(TransactionScopeOption.Required)) { context.SaveChanges(); trans.Complete(); } #endregion } catch (Exception ex) { GlobalTools.WriteLog( "AutoGetMXIntAcct" , 0, "异常消息" + ex.ToString()); GlobalTools.WriteErrLog( "AutoGetMXIntAcct" , ex); } } else { Console.WriteLine( @"E:\temp\File目录中的备份的文件不进行读取!" ); } } } #endregion } #endregion //Exel文件删除 FileInfoExc(files); } catch (Exception ex) { GlobalTools.WriteLog( "AutoMxAcctInt" , 0, "错误的日志" + ex.ToString()); } } /// <summary> ///将添加的文件进行保存到指定目录以及当前的文件进行删除 /// </summary> /// <param name="files"></param> private static void FileInfoExc(List< string > files) { foreach ( string fileExc in files) { FileInfo fileInfo = new FileInfo(fileExc); string copyfileDir = Properties.Settings.Default.FinishedFileDir; string copypath = copyfileDir + "\\" + fileInfo.Name + "-copy-" + DateTime.Now.ToString( "yyyy-MM-dd-HHmmss" ); //File.Move(fileExc, copypath); File.Move(fileExc, copypath); //File.Copy(fileExc, copypath); File.Delete(fileExc); GlobalTools.WriteLog( "AutoGetMXIntAcct" , 0, "文件移动到:" + copypath); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构