思路:用户点击下载模板按钮,获取到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. Liferay7.0与cas单点登录配置

    1.简介     Liferay7.0支持多种登录方式,包括:常规的.opensso.cas.ntlm.ldap.openid.Facebook.Google等. 其中, (1) 常规:则是默认Lif ...

  2. jQuery同步Ajax带来的UI线程阻塞问题及解决方法

    遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收不同参数,只负责 ...

  3. linux-程序发布脚本

    写了个启动程序, 调优jvm的脚本 #!/bin/bash MEM=`free -m | grep Mem | awk '{print int($2 * 90 / 100)}'` JAVA_OPTS= ...

  4. centos 修改时区

    # date 2014年 07月 22日 星期二 :: EDT # cat /etc/sysconfig/clock -------------------------- ZONE="Ame ...

  5. Linux配置多个Tomcat同时运行

    Linux系统下怎样配置多个Tomcat同时运行呢,首先修改变量为第一个tomcat,然后修改第二个tomcat启动的脚本 1.修改环境变量 # vi /etc/profile ####### 工程1 ...

  6. Git 撤销与修改

    增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言,这个例子中是HEAD,实际上可以指定其他有效的提交名称. 如果参数是小写的-c,就会打开预先设置好 ...

  7. Centos7下使用yum安装lnmp zabbix3.2

    1:配置epel-release mysql zabbix 源 配置epel源 wget http://mirrors.aliyun.com/epel/epel-release-latest-7.no ...

  8. Hibernate 分页 查询

    昨天的作业  分页: 主要的代码块:(明天实现分页的封装) package com.cy.beans; import java.util.List; /** * 定义一个分页对象 * @author ...

  9. es6学习笔记11--Proxy和Reflect

    Proxy概述 Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy可以理解成,在目标对象之前 ...

  10. @JsonProperty和@JsonAlias的区别

    @JsonProperty这个注解提供了序列化和反序列化过程中该java属性所对应的名称@JsonAlias这个注解只只在反序列化时起作用,指定该java属性可以接受的更多名称 public stat ...