应用.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 进行添加的插入数据的效率不高,但是这个一个非常简单的一个程序。
代码如下:
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);
}
}
应用.NET控制台应用程序开发批量导入程序。的更多相关文章
- 应用控制台应用程序开发批量导入EXEL程序。
一.最近一直在调整去年以及维护去年开发的项目,好久没有在进行个人的博客了.每天抽了一定的时间在研究一些开源的框架,Drapper 以及NHibernate以及当前比较流行的SqlSuper框架 并进行 ...
- [小程序开发] 微信小程序内嵌网页web-view开发教程
为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...
- 微信小程序开发 [01] 小程序基本结构和官方IDE简介
1.小程序账户注册 实际上在进行开发时没有注册小程序账户也是可以的,官方提供的IDE提供实时编译模拟预览,和当前你有没有绑定小程序账户没有关系. 当然,最终你要正式上线你的小程序的话,肯定还是需要账户 ...
- 小程序开发-微信小程序开发入门
分享一个微信小程序开发的基本流程,仅供参考. 第一步:注册微信小程序公众号,注册成功后,登录微信公众号管理后台,等待下一步操作. 第二步:进入微信小程序的后台后,下载微信内置的微信小程序开发者工具,以 ...
- Spark程序开发-环境搭建-程序编写-Debug调试-项目提交
1,使用IDEA软件进行开发. 在idea中新建scala project, File-->New-->Project.选择Scala-->Scala 2,在编辑窗口中完成Word ...
- Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发
1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...
- [小程序开发] 微信小程序audio音频播放组件+api_wx.createAudioContext
引言: audio是微信小程序中的音频组件,可以轻松实现小程序中播放/停止音频等自定义动作. 附上微信小程序audio组件的相关属性说明:https://mp.weixin.qq.com/debug/ ...
- 微信小程序开发——修改小程序原生checkbox、radio默认样式
复选框: 闲话少说,这里直接介绍如何修改小程序提供的复选框的样式,如原生的是这样的: 需要的是这样的: 示例代码: /*复选框外框样式*/ checkbox .wx-checkbox-input { ...
- 微信小程序开发——微信小程序下拉刷新真机无法弹回
开发工具中下拉之后页面回弹有一定的延迟,这个时间也有点久.真机测试,下拉后连回弹都没有,这个问题要解决,就得在下拉函数里加上停止下拉刷新的API,如下: /** * 下拉刷新 */ onPullDow ...
随机推荐
- Linux cal命令详解
cal 显示指定月份的日历 常见命令参数 NAME cal - displays a calendar SYNOPSIS cal [-smjy13] [[[day] month] year] DESC ...
- 铁乐学python_day01-作业
第一题:使用while循环输入 1 2 3 4 5 6 8 9 10 # 使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while (True) : count = ...
- 铁乐学python_day01-和python有关的唠嗑
铁乐学python_day01-和python有关的唠嗑 文:铁乐与猫 2018-03-16 01_python的历史 python的创始人为荷兰人吉多·范罗苏姆(Guido van Rossum). ...
- 使用Ajax无刷新页面登录
<script> window.onload = function () { var myname = document.getElementById("uname") ...
- 4514: [Sdoi2016]数字配对
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
- 20165302 ch02 课下作业
20165302 ch02 课下作业 作业内容 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的测试 发一篇相关内容的博客, ...
- Docker实战(五)之端口映射与容器互联
除了网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问. 1.端口映射实现访 ...
- 论文笔记 Robust face landmark estimation under occlusion
1. Abstract 现实世界中的人脸很多时候都存在遮挡以及大的形状变化,而目前的人脸关键点检测方法在这种情况下表现欠佳, 因为它们未能提供一种系统的方法来处理异常.因而authors提出一种新的方 ...
- C语言程序设计I—第四周教学
第四周教学安排 第四周是本课程的第三次课,依然是我来讲解,学生听讲,也依然继续在寻找大班授课(100人).条件有限(民办学校教学经费投入不够)的情况下如何更好的组织教学. 教学内容 第二章 用C语言编 ...
- Mac端 Open GL初探
一.环境配置 1.创建macOS工程 2.添加OpenGL.framework和GLUT.framework两个系统库 3.拖入资源文件 如果libGLTools.a问价先拖入到工程其他位置,后再移到 ...
注意