思路:用户点击下载模板按钮,获取到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. postgresql逻辑结构(一)

    一.数据库逻辑结构介绍 数据库:应用连接到一个数据库时,一般不能访问其它数据库,除非使用dblink等其他手段. 表.索引:postgresql中标的术语为relation,其它数据库中成为table ...

  2. Nginx图片防盗链【实战】

    访问我的博客 前言 博主目前在一家原创小说网站公司工作,由于站内的作品全部是原创,于是乎不可避免地会被一些盗版网站爬取盗版,对于防盗版一直没有很好的对策,让公司很是苦恼. 最近去一些盗版网站上搜索我们 ...

  3. SpringBoot入门 (十四) Security安全控制

    本文记录在SpringBoot使用SpringSecurity进行安全访问控制. 一 什么是Security Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访 ...

  4. GoogLeNetv1 论文研读笔记

    Going deeper with convolutions 原文链接 摘要 研究提出了一个名为"Inception"的深度卷积神经网结构,其目标是将分类.识别ILSVRC14数据 ...

  5. Redhat6.8安装Oracle11g下遇到两个问题记录

    问题一: 刚刚安装完毕Oracle之后,尝试sqlplus登陆报错,TNS:net service name is incorrectly specified 参考文章:关于环境变量ORACLE_SI ...

  6. 【转载】Nginx+Tomcat 动静分离实现负载均衡

    0.前期准备 使用Debian环境.安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等. 1.一份Nginx.conf配置文件 1 # 定义Nginx运行的用户 和 用户组 如 ...

  7. Java - "JUC线程池" 架构

    Java多线程系列--“JUC线程池”01之 线程池架构 概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介 ...

  8. Android组件化搭建

    什么是组件化 为了降低项目耦合性,在Android工程中如何实施,目前有两种途径,也是两大流派,一个是组件化,一个是插件化.在这里只介绍组件化,插件化暂不介绍 正常的APP只有一个applicatio ...

  9. Java图片验证码乱码问题

    有时部署到linux服务器上的web项目的图形验证码可能会出现乱码问题 这不是编码格式出错了,而是可能服务器上没有图形验证码中限定的那种字体 比如生成图形验证码的代码: Font font = new ...

  10. HDU1816(二分+2-SAT)

    Get Luffy Out * Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...