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请求 以前一直搞不清楚什么时候应该用哪种 ...
随机推荐
- JS获取当前时间和日期
当前时间和日期 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1 ...
- list string 互转
List转字符串,用逗号隔开 List<string> list = new List<string>();list.Add("a");list.Add(& ...
- Hadoop2源码分析-RPC机制初识
1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...
- 主键映射和Hibernate映射
组件映射 类组合关系的映射,也叫做组件映射! 注意:组件类和被包含的组件类,共同映射到一张表! 需求: 如汽车与车轮 代码示例: 1.JavaBean Wheel.java package com.g ...
- SSM整合——spring4.*配置案例
导入spring4.* 相关的jar包和依赖包即可 1.web.xml <?xml version="1.0" encoding="UTF-8"?> ...
- java web 答辩总结
今天我们组答辩.在昨天前三个组答辩之后,整理了一些试题. 在这个项目的答辩准备:首先把这个java web这本书大概的看了一遍:对整理的那些试题也把答案整理出来了:针对老师提问频率较高的试题:针对自己 ...
- CAlayer一
// // ViewController.m // Layer // // Created by City--Online on 15/4/9. // Copyright (c) 2015年 City ...
- 使用并发工具实现 RPC 调用流量控制
前言 RPC 服务中,每个服务的容量都是有限的,即资源有限,只能承受住给定的网络请求,所以,在设计 RPC 框架的时候,一定要考虑流量控制这个问题.而 Java 中,实现流量控制有很多中方式,今天说 ...
- 表格列mouse经过时高亮显示
前几天Insus.NET有练习<表格行mouse经过时高亮显示>http://www.cnblogs.com/insus/p/3715733.html ,今天有奇想,是否可以实现mouse ...
- SqlDataAdapter 对datagridview进行增删改(A)
这种方法主要是双击datagridview单元格,直接进行添加,修改,删除,在实际开发中并不太常用,另一种方法下一次在具体陈述. using System; using System.Collecti ...