思路:用户点击下载模板按钮,获取到excel模板,然后向里面填写数据保存。from表单提交的时候选择保存好的excel,实现数据的批量导入过程

先把模板放在服务器的项目目录下面:如

模板我一般放在:File\download\检测项目价格导入模板.xls

模板内容如:

下载模板的按钮只需指向服务器的文件地址,模板会自动下载。

地址如:var FilePath = "http://*********/File/download/检测项目价格导入模板.xls",但是地址一般不写死,而是域名是从webConfig文件中获取的。

例如:<add key="FileServiceAddr" value="http://localhost:8066/"/>

接口如:

/// <summary>
/// 下载模板
/// </summary>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public string DownLoadTemple()
{
try
{ //var FilePath = "http://testadmin.hysyzs.com/download/检测项目价格导入模板.xls";
var FilePath = System.Configuration.ConfigurationManager.AppSettings["FileServiceAddr"].ToString() +"/download/检测项目价格导入模板.xls";
//var excel = new Aspose.Cells.Workbook();
//打开上传文件
//excel.Open(FilePath);
//var fileMemoryStream = FilePath.Write(ms);
//HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
//response.Content = new ByteArrayContent(fileMemoryStream.ToArray());
//response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
//response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
//{
// FileName = "会议签到汇总表.xls"
//};
return FilePath;
}
catch (Exception e)
{
return e.ToString();
} }

然后用户下载后,编辑内容,form表单提交,后台的处理直接上代码

 /// <summary>
/// 批量导入价格(form表单方式提交数据)
/// </summary>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public ReturnObject<List<string>> UploadImportPrize()
{
ReturnObject<List<string>> ret = new ReturnObject<List<string>>();
List<string> errors = new List<string>();
List<string> fails = new List<string>(); string completePath = "";
HttpFileCollection filelist = HttpContext.Current.Request.Files;
if (filelist != null && filelist.Count > )
{
for (int i = ; i < filelist.Count; i++)
{
HttpPostedFile file = filelist[i];
String Tpath = DateTime.Now.ToString("yyyy-MM-dd") + @"/import/";
string filename = file.FileName;
//string FilePath = "D:\\" + Tpath + filename; //
string FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/") + Tpath + filename;
//这里应该获取当前项目路径地址,再在后面创建文件,如果按上面的注释掉的写法,在服务器上没有找到d盘,则会报错。
                    string diPath = Path.GetDirectoryName(FilePath);    //获取到当前目录的文件夹,没有就创建

                    if (!Directory.Exists(diPath)) { Directory.CreateDirectory(diPath); };
try
{
completePath = FilePath;
file.SaveAs(completePath); //生成一个文件目录,把上传的文件写入到目录中去,
var d = ImportPrize(completePath); //然后获取这个目录的文件,用DataTable进行读取,然后解析excel的每行数据,批量写入到数据库中
ret.datas = d.datas;
ret.isOK = true;
ret.errorCode = ; }
catch (Exception ex)
{
ret.msg = "上传文件写入失败:" + ex.Message;
ret.isOK = false;
ret.errorCode = ; }
}
}
else
{
ret.msg = "上传的文件信息不存在!";
ret.isOK = false;
ret.errorCode = ; } return ret; }

将excel的数据加载到DataTable中去

 /// <summary>
///
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private DataTable ReadExcelToTable(string path)
{
DataTable result = new DataTable();
Workbook workbook = new Workbook();
workbook.Open(path);
Cells cells = workbook.Worksheets[].Cells;
result = cells.ExportDataTableAsString(, , cells.MaxDataRow + , cells.MaxColumn + , false);
return result;
}

批量写入数据库的过程

/// <summary>
/// 写入数据到数据库
/// </summary>
/// <param name="completePath"></param>
/// <returns></returns>
public ReturnObject<List<string>> ImportPrize(string completePath)
{
ReturnObject<List<string>> ret = new ReturnObject<List<string>>();
List<string> errors = new List<string>();
List<string> fails = new List<string>();
int succescount = ;
int failcount = ; try
{
var a = ReadExcelToTable(completePath).Rows;
List<InPrize> list = new List<InPrize>();
if (a.Count > )
{
for (var i = ; i < a.Count; i++)
{
if (i == )
{
#region 判断列名
var col_one = a[i][].ToString();
if (col_one != "版本")
{
throw new Exception("格式错误,导入文件的第一列应为【版本】!");
}
//var col_two = a[i][1].ToString();
//if (col_two != "版本状态")
//{
// throw new Exception("格式错误,导入文件的第一列应为【版本状态】!");
//}
var col_three = a[i][].ToString();
if (col_three != "检测机构检测项")
{
throw new Exception("格式错误,导入文件的第一列应为【检测机构检测项】!");
}
var col_five = a[i][].ToString();
if (col_five != "区域市场")
{
throw new Exception("格式错误,导入文件的第一列应为【区域市场】!");
}
var col_six = a[i][].ToString();
if (col_six != "区域市场价格")
{
throw new Exception("格式错误,导入文件的第一列应为【区域市场价格】!");
}
var col_even = a[i][].ToString();
if (col_even != "VIP零售价格")
{
throw new Exception("格式错误,导入文件的第一列应为【VIP零售价格】!");
} #endregion
}
else
{
//int intType2; var intTypeStr2 = a[i][1].ToString();
//if (!int.TryParse(intTypeStr2, out intType2))
//{
// throw new Exception("格式错误,【版本状态】【第" + (i + 1) + "行】应为整数类型数据!");
//}
int intType1; var intStr1 = a[i][].ToString();
if (!int.TryParse(intStr1, out intType1))
{
throw new Exception("格式错误,【检测机构检测项】【第" + (i + ) + "行】应为整数类型数据!");
}
int intType; var intStr = a[i][].ToString();
if (!int.TryParse(intStr, out intType))
{
throw new Exception("格式错误,【区域市场】【第" + (i + ) + "行】应为整数类型数据!");
}
decimal docmoney_int; var docmoney_str = a[i][].ToString();
if (!decimal.TryParse(docmoney_str, out docmoney_int))
{
throw new Exception("格式错误,【区域市场价格】【第" + (i + ) + "行】应为数字类型数据!");
} decimal doczmoney_int; var doczmoney_str = a[i][].ToString();
if (!decimal.TryParse(doczmoney_str, out doczmoney_int))
{
throw new Exception("格式错误,【VIP零售价格】【第" + (i + ) + "行】应为数字类型数据!");
}
list.Add(new InPrize()
{
Version = a[i][].ToString(),
//VersionState = false,
DetectionOrgDetectionItemID = intType1,
AreaMarketID = intType,
Price = docmoney_int,
vipPrice = doczmoney_int
});
}
} #region ListForEach using (YZS_BUSEntities context = new YZS_BUSEntities())
{
foreach (var item in list)
{
var entities = context.Set<区域产品信息>().Where(n => n.检测机构检测项.Value == item.DetectionOrgDetectionItemID && n.区域市场.Value == item.AreaMarketID && n.版本状态.Value == false).ToList();
if (entities.Count() > )
{
fails.Add("检测项:" + item.DetectionOrgDetectionItemID + "区域市场:" + item.AreaMarketID);
failcount++;
}
else
{
context.区域产品信息.Add(new 区域产品信息()
{
版本 = item.Version,
版本状态 = false,
检测机构检测项 = item.DetectionOrgDetectionItemID,
区域市场 = item.AreaMarketID,
区域市场价格 = item.Price,
VIP零售价格 = item.vipPrice
});
succescount++;
}
}
context.SaveChanges();
string failRemark = "";
if (failcount > )
{
failRemark = ",失败的数据:" + string.Join(",", fails);
}
errors.Add($"成功导入{succescount}条样本信息!失败{failcount}条{failRemark}");
} ret.isOK = true;
ret.errorCode = ;
ret.msg = "";
ret.count = succescount;
ret.datas = errors; #endregion
}
else
{
throw new Exception("所选文件格式错误,或者未匹配到有效数据!");
}
}
catch (Exception error)
{
ret.isOK = false;
ret.errorCode = ;
ret.msg = error.Message;
ret.count = ;
ret.datas = errors;
}
return ret;
}

实体模型

        public class InPrize
{
/// <summary>
///检测机构检测项ID
/// </summary>
public int DetectionOrgDetectionItemID { get; set; } /// <summary>
///区域市场ID
/// </summary>
public int AreaMarketID { get; set; }
/// <summary>
///价格
/// </summary>
public decimal? Price { get; set; }
/// <summary>
/// vip零售价格
/// </summary>
public decimal? vipPrice { get; set; }
/// <summary>
/// 版本
/// </summary>
public string Version { get; set; }
///// <summary>
///// 版本状态
///// </summary>
//public int? VersionState { get; set; } }

c#WebApi使用form表单提交excel,实现批量写入数据库的更多相关文章

  1. Form表单提交数据的几种方式

    一.submit提交 在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<input type='submit'>)就可以进行数据的提交, ...

  2. jQuery Form 表单提交插件-----formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的 应用

    一.jQuery Form的其他api  1.  formSerialize 将表单序列化成查询串.这个方法将返回一个形如: name1=value1&name2=value2的字符串.是否可 ...

  3. jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址

     一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...

  4. Checkbox框全选操作,form表单提交与jquery ajax提交两种处理方式

    //1.jquery ajax<script type="text/javascript"> $(function(){ var basePath = $(" ...

  5. form表单提交

    1.form表单提交.html页面失败 <%--客户端form--%> <form id="form2" action="LoginOne.html&q ...

  6. ajax form表单提交 input file中的文件

    ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...

  7. 2017-01-11小程序form表单提交

    小程序form表单提交 1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局.事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但 ...

  8. SpringMVC中使用bean来接收form表单提交的参数时的注意点

    这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点 ...

  9. Form表单提交,Ajax请求,$http请求的区别

    做过前端同学想必都避免不了要和后台server打交道.而以下这三种与后台交互的方式想必大家都不陌生. Form表单提交,Ajax请求,Angular的$http请求 以前一直搞不清楚什么时候应该用哪种 ...

随机推荐

  1. Android之内存泄漏

    开篇之前,我们要先理解:什么是内存泄漏.百度百科:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等 ...

  2. mycat中间件--schema.xml配置文件详解

    schema.xml管理着MyCat的逻辑库.表.分片规则.DataNode以及DataSource.弄懂这些配置,是正确使用MyCat的前提. <?xml version="1.0& ...

  3. Solidity字符串和函数

    字符串:需要使用双引号""或者单引号''括起来,例如:定义一个字符串变量:string name="jake":string字符串不能通过length方法获得长 ...

  4. Jni如何传递并且修改两个基础参数

    最近在开发jni时,需要返回多个参数给java.这个过程中,碰到了一些问题,值得探讨一下.   具体是这样,jni方法jni_do_something作了底层处理后,得出两个int数据,需要将他们的值 ...

  5. 百度全站 https FAQ:技术宅告诉你如何搜索更安全

    百度从 14 年开始对外开放了 https 的访问,并于 3 月初正式对全网用户进行了 https 跳转. 你也许会问,切换就切换呗,和我有啥关系?我平常用百度还不是照常顺顺当当的,没感觉到什么切换. ...

  6. 管理git生成的多个ssh key

    http://www.bootcss.com/p/git-guide/ 问题阐述 当有多个git账号的时候,比如一个github,用于自己进行一些开发活动,再来一个gitlab,一般是公司内部的git ...

  7. LR监测windows资源一般监测哪几个项?

    计数器        指标 1.        平均事务响应时间 Average Transation Response Time        优秀:<2s 良好:2-5s 及格:6-10s ...

  8. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  9. javascript 易错点、难点笔记

    本文主要记录在学习过程中遇到的JavaScript难点或者容易疏忽的细节,也方便自己日后翻阅学习. 1.arr.length === + arr.length arr.length === + arr ...

  10. PHP缓存库phpFastCache

    phpFastCache是一个开源的PHP缓存库,只提供一个简单的PHP文件,可方便集成到已有项目,支持多种缓存方法,包括:apc, memcache, memcached, wincache, fi ...