|
|
目录' D$ k. T! V: w( D, H# d$ w3 w
( W7 _+ x8 N& m- u4 m
) {9 h5 i B& i M
- 前言/ X# P$ ^* M/ V; g& E; @
- 代码实战
6 Y4 t8 v: A; E# X3 K% ?' r - 具体的xml文件; c. `9 _" z- T/ e/ S9 f
- 具体的Excel模板5 n9 r0 S0 ]- }9 ~+ a* d3 ]8 v+ R
) W3 I5 X! y: @0 s5 j6 |
前言
. k! {8 F! A( d" A2 G; Q0 u1 `% X+ {- B! C! J. ^
' a9 N5 |& s+ E! k" a1 D 本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中。截图如下:
3 {+ D$ E+ S+ J7 P/ m+ t' w& p' h5 g( Z; {9 m$ Y
+ c, I( R! \ x6 ~ E
代码实战
; \0 W3 f* X& l- D1 X" E0 z1 X, s& ?8 h- T+ H0 j# t
# k. W( }8 ^6 a( u) D$ V" g) q; f: O 工具类
( P& g8 P) e4 g: S 实体类:XMLReadModel.cs- public class XMLReadModel { /// /// 导入所需键值对 /// public Hashtable ImportHashtable { set; get; } = new Hashtable(); /// /// 导出所需键值对 /// public Hashtable ExportHashtable { set; get; } = new Hashtable(); }
复制代码 工具方法:读取xml文件内容到实体中。- /// /// 读取xml文件到hashtable /// public static XMLReadModel ReadToHashtable(string path) { var xr = new XMLReadModel(); var xmldoc = new XmlDocument(); xmldoc.Load(path); //获取节点列表 var topM = xmldoc.SelectNodes("//ColumnName"); foreach (XmlElement element in topM) { var enabled = element.Attributes[0].Value; if (enabled == "true") //字段启用 { var dbProperty = element.GetElementsByTagName("DbProperty")[0].InnerText; var excelProperty = element.GetElementsByTagName("ExcelProperty")[0].InnerText; if (!xr.ImportHashtable.ContainsKey(excelProperty)) { xr.ImportHashtable.Add(excelProperty, dbProperty); } if (!xr.ExportHashtable.ContainsKey(dbProperty)) { xr.ExportHashtable.Add(dbProperty, excelProperty); } } } return xr; }
复制代码 Excel文件内容转成datatable方法- /// /// excel文件流转化成datatable /// public static DataTable ExcelToTableForXLSX(Stream fileStream, Hashtable ht = null, bool haveNote = false) { var dt = new DataTable(); using (var fs = fileStream) { var xssfworkbook = new XSSFWorkbook(fs); var sheet = xssfworkbook.GetSheetAt(0); //表头 判断是否包含备注 var firstRowNum = sheet.FirstRowNum; if (haveNote) { firstRowNum += 1; } var header = sheet.GetRow(firstRowNum); var columns = new List(); for (var i = 0; i < header.LastCellNum; i++) { var obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell); if (obj == null || obj.ToString() == string.Empty) { dt.Columns.Add(new DataColumn("Columns" + i.ToString())); //continue; } else { if (ht != null) { var o = ht[obj.ToString()].ToString();//这里就是根据xml中读取的字段对应关系进行字段赋值的。 dt.Columns.Add(new DataColumn(o)); } else { dt.Columns.Add(new DataColumn(obj.ToString())); } } columns.Add(i); } //数据 for (var i = firstRowNum + 1; i p.Name == dt.Columns[i].ColumnName); if (info != null) { try { if (!Convert.IsDBNull(item[i])) { object v = null; if (info.PropertyType.ToString().Contains("System.Nullable")) { v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType)); } else { if (info.PropertyType.Equals(typeof(bool))) { var value = item[i].ToString(); if (value.Equals("true", StringComparison.CurrentCultureIgnoreCase) || value.Equals("false", StringComparison.CurrentCultureIgnoreCase)) v = Convert.ChangeType(item[i], info.PropertyType); else if (value.Equals("1", StringComparison.CurrentCultureIgnoreCase) || value.Equals("0", StringComparison.CurrentCultureIgnoreCase)) { if (value.Equals("1", StringComparison.CurrentCultureIgnoreCase)) v = true; else v = false; } } else { v = Convert.ChangeType(item[i], info.PropertyType); } } info.SetValue(s, v, null); } } catch (Exception ex) { throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message); } } } list.Add(s); } return list; }
复制代码 导入Excel方法- [HttpPost, Route("api/Workstage/ImportFile")] public object ImportFile() { var filelist = HttpContext.Current.Request.Files; var models = new List(); var path = HttpContext.Current.Server.MapPath("/ImportConfig/ModelConfig.xml"); var xr = XMLHelper.ReadToHashtable(path);//读取Excel的字段对应关系,代码的实体字段和Excel中的字段对应,在后面的Excel的值读取还有数据库实体赋值用得到。 try { if (filelist.Count > 0) { for (var i = 0; i < filelist.Count; i++) { var file = filelist[i]; var fileName = file.FileName; var fn = fileName.Split('\\'); if (fn.Length > 1) { fileName = fn[fn.Length - 1]; } DataTable dataTable = null; var fs = fileName.Split('.'); if (fs.Length > 1) { dataTable = ExcelHelp.ExcelToTableForXLSX(file.InputStream, xr.ImportHashtable); //excel转成datatable } models = dataTable.ToDataList(); //datatable转成list } } var succe = new List();//需要插入的数据列表 var exportList = new List();//需要导出给用户的失败数据列表 // 做一些数据逻辑处理,把处理好的数据加到succe列表中 if (succe.Any()) { SqlBulkCopyHelper.BulkInsertData(succe, "DModel"); } var url = string.Empty; if (exportList.Any()) { var extDt = exportList.ToDataTable(xr.ExportHashtable);//把数据库中的字段转成Excel中需要展示的字段,并保存到datatable中。 url = SaveFile(extDt, "失败信息.xlsx");//把datatable保存到本地服务器或者文件服务器中,然后把文件下载地址返回给前端。 } var list = new { failed = faile.Take(100).ToList(), failedCount = faile.Count }; //数据太多的话,浏览器会崩溃 var json = new { list, msg = "添加成功", url }; return json; } catch (Exception ex) { var json = new { msg = "添加失败", ex.Message, ex }; return json; } }
复制代码 具体的xml文件
# G- {$ w4 f% ~0 X9 l' z* M2 M; U2 ^3 T& x2 I% a& ?# S
* p# ]/ G# o S& r 具体的节点可以自己命名。- ProductName 商品名称 SourceCode 原因 CreateTime 创建时间 UpdateTime 更新时间
复制代码 具体的Excel模板
3 `2 n6 J$ L. r: D3 }# p1 J7 l( I0 o) r
2 l; I6 x5 |+ Z# [( U6 V
以上就是ASP.NET 上传文件导入Excel的示例的详细内容,更多关于ASP.NET 上传文件导入Excel的资料请关注脚本之家其它相关文章!! o6 R- e( s p. d. m V ]
( h2 ~8 J, Z9 U0 G8 L4 C2 E6 r( P来源:http://www.jb51.net/article/209471.htm6 l* d: q) |5 x2 E2 A4 L4 V' O
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|