c#WebApi使用form表单提交excel,实现批量写入数据库
思路:用户点击下载模板按钮,获取到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,实现批量写入数据库的更多相关文章
- Form表单提交数据的几种方式
一.submit提交 在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<input type='submit'>)就可以进行数据的提交, ...
- jQuery Form 表单提交插件-----formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的 应用
一.jQuery Form的其他api 1. formSerialize 将表单序列化成查询串.这个方法将返回一个形如: name1=value1&name2=value2的字符串.是否可 ...
- jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址
一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...
- Checkbox框全选操作,form表单提交与jquery ajax提交两种处理方式
//1.jquery ajax<script type="text/javascript"> $(function(){ var basePath = $(" ...
- form表单提交
1.form表单提交.html页面失败 <%--客户端form--%> <form id="form2" action="LoginOne.html&q ...
- ajax form表单提交 input file中的文件
ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...
- 2017-01-11小程序form表单提交
小程序form表单提交 1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局.事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但 ...
- SpringMVC中使用bean来接收form表单提交的参数时的注意点
这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点 ...
- Form表单提交,Ajax请求,$http请求的区别
做过前端同学想必都避免不了要和后台server打交道.而以下这三种与后台交互的方式想必大家都不陌生. Form表单提交,Ajax请求,Angular的$http请求 以前一直搞不清楚什么时候应该用哪种 ...
随机推荐
- postgresql逻辑结构--表(二)
一.创建表 语法: create table table_name( col01_name data_type, col02_name data_type, col03_name data_type, ...
- spring mvc requestmapping 配置多个
参考 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation. ...
- ASP.NET MVC5+EF6+LayUI实战教程,通用后台管理系统框架(6)- 创建数据库
前言 其实网站就是一座连接用户和数据库的梁桥,数据库通过网站,将信息以不同的方式,展现给客户,客户通过网站,对数据库进行各种操作 下面,我们用一个例子,给大家展示下基本的增删改查操作 创建数据库 创建 ...
- 并发编程之 LinkedBolckingQueue 源码剖析
前言 JDK 1.5 之后,Doug Lea 大神为我们写了很多的工具,整个 concurrent 包基本都是他写的.也为我们程序员写好了很多工具,包括我们之前说的线程池,重入锁,线程协作工具,Con ...
- SQL:多表联合更新
update 表一 set 表一.列1 = 表二.列1 from 表一,表二 where 表一.列2 = 表二.列2
- windows下mongodb集群搭建
本文介绍在windows环境下如何搭建一个高可用性的mongodb集群.系统环境为win7,mongodb版本为3.6.3. 本文采用的是分片+副本集的方式搭建集群,将分别介绍如何使用副本集和分片来提 ...
- 自己写一个java的mvc框架吧(三)
自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...
- Android - ANR小结
Application Not Responding 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Applicatio ...
- hadoop学习之hdfs文件系统
一.hdfs的概念 Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS. Hadoop是Apache Lucene创始人Doug Cu ...
- 大数据java基础day01
day01笔记 1.==操作符和equals方法 equals方法存在于Object类中,所有类的equals方法都继承于Object 2.String类的常用方法 ①.replace()替换字符串 ...