京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2445|回复: 0

ASP.NET 上传文件导入Excel的示例

[复制链接]

20

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2021-7-25 20:49:23 | 显示全部楼层 |阅读模式 来自 中国
目录
5 [) I. A" i  a- m8 I
1 C9 |* U! z  H; u7 i- Q

    : `+ l# {0 R! Q4 I
  • 前言( B9 `) [6 _' ^/ Z2 I: _
  • 代码实战. n; ?7 A" R! I1 A; p: o  r
  • 具体的xml文件, Y; R' w9 b* f) J. D8 O; l1 X
  • 具体的Excel模板
    2 i0 c% ^$ V9 }) b" N8 q$ u( v
1 p. m. [/ a1 {$ P  m
前言! g' i+ U" E! Z. b4 c3 a
1 p6 Q3 d6 k3 d* n; V4 {
4 Q9 N$ }" U% Y5 e$ k- R
  本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中。截图如下:2 j+ y7 ?+ p  C# U, e$ a4 g

( x; p; q. P4 d# b
! n% N$ {0 g" T( p9 e; {+ T: R/ q2 D代码实战- h% Z, T4 S4 U7 S
; B& ]: ^+ V+ b: k5 b$ H  I# O2 p
) ]/ f9 J7 d, I) w7 T. C7 l+ O5 I7 M" \
  工具类
5 U7 B+ R: Y9 ~: j  实体类:XMLReadModel.cs
  1. public class XMLReadModel    {        ///         /// 导入所需键值对        ///         public Hashtable ImportHashtable { set; get; } = new Hashtable();        ///         /// 导出所需键值对        ///         public Hashtable ExportHashtable { set; get; } = new Hashtable();    }
复制代码
  工具方法:读取xml文件内容到实体中。
  1. ///         /// 读取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方法
  1. ///         /// 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方法
  1. [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文件/ ?" K0 o6 k' B

: d5 I: l- ^' ]6 K1 u* M0 E1 N) P
3 Z6 W  z1 W' H% j8 ?. U    具体的节点可以自己命名。
  1.         ProductName    商品名称          SourceCode    原因          CreateTime    创建时间          UpdateTime    更新时间  
复制代码
具体的Excel模板
2 n6 X) X" ~- X: ]" T: q# Z. U6 ^7 R  O0 U+ e5 G6 O$ o8 n

; _% f( O0 I: Q% G以上就是ASP.NET 上传文件导入Excel的示例的详细内容,更多关于ASP.NET 上传文件导入Excel的资料请关注脚本之家其它相关文章!
5 Q5 b+ Y% }  F
% |4 q+ }$ S1 A4 Y5 B6 `# d来源:http://www.jb51.net/article/209471.htm
' ?8 H" L, B( W1 P5 B免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-8-28 15:22 , Processed in 0.046415 second(s), 24 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表