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

目录
  • 前言
  • 代码实战
  • 具体的xml文件
  • 具体的Excel模板

前言

  本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中。截图如下:

代码实战

  工具类

  实体类:XMLReadModel.cs

public class XMLReadModel
    {
        /// <summary>
        /// 导入所需键值对
        /// </summary>
        public Hashtable ImportHashtable { set; get; } = new Hashtable();

        /// <summary>
        /// 导出所需键值对
        /// </summary>
        public Hashtable ExportHashtable { set; get; } = new Hashtable();
    }

  工具方法:读取xml文件内容到实体中。

/// <summary>
        /// 读取xml文件到hashtable
        /// </summary>
        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方法

/// <summary>
        /// excel文件流转化成datatable
        /// </summary>
        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<int>();
                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 <= sheet.LastRowNum; i++)
                {
                    var dr = dt.NewRow();
                    var hasValue = false;
                    if (sheet.GetRow(i) == null)
                    {
                        continue;
                    }
                    foreach (var j in columns)
                    {
                        var cell = sheet.GetRow(i).GetCell(j);
                        if (cell != null && cell.CellType == CellType.Numeric)
                        {
                            //NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型
                            if (DateUtil.IsCellDateFormatted(cell)) //日期类型
                            {
                                dr[j] = cell.DateCellValue;
                            }
                            else //其他数字类型
                            {
                                dr[j] = cell.NumericCellValue;
                            }
                        }
                        else
                        {
                            dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);
                        }
                        if (dr[j] != null && dr[j].ToString() != string.Empty)
                        {
                            hasValue = true;
                        }
                    }
                    if (hasValue)
                    {
                        dt.Rows.Add(dr);
                    }
                }
            }
            return dt;
        }

  获取Excel单元格值类型,转成C#对应的值类型。

/// <summary>
        /// 获取单元格类型(xlsx)
        /// </summary>
        /// <param name="cell"></param>
        /// <returns></returns>
        private static object GetValueTypeForXLSX(XSSFCell cell)
        {
            if (cell == null)
                return null;
            switch (cell.CellType)
            {

                case CellType.Blank: //BLANK:
                    return null;
                case CellType.Boolean: //BOOLEAN:
                    return cell.BooleanCellValue;
                case CellType.Numeric: //NUMERIC:
                    return cell.NumericCellValue;
                case CellType.String: //STRING:
                    return cell.StringCellValue;
                case CellType.Error: //ERROR:
                    return cell.ErrorCellValue;
                case CellType.Formula: //FORMULA:
                default:
                    return "=" + cell.CellFormula;
            }
        }

  datatable转成list实体方法

/// <summary>
        /// DataTable转成List
        /// </summary>
        public static List<T> ToDataList<T>(this DataTable dt)
        {
            var list = new List<T>();
            var plist = new List<PropertyInfo>(typeof(T).GetProperties());
            foreach (DataRow item in dt.Rows)
            {
                var s = Activator.CreateInstance<T>();
                for (var i = 0; i < dt.Columns.Count; i++)
                {
                    var info = plist.Find(p => 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<DModel>();
            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<DWorkstage>(); //datatable转成list
                    }
                }
                var succe = new List<DModel>();//需要插入的数据列表
                var exportList = new List<DModel>();//需要导出给用户的失败数据列表
                // 做一些数据逻辑处理,把处理好的数据加到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文件

    具体的节点可以自己命名。

<?xml version="1.0" encoding="utf-8" ?>
<TableConfig>
  <!--商品名称-->
  <ColumnName Enabled="true" >
    <DbProperty>ProductName</DbProperty>
    <ExcelProperty>商品名称</ExcelProperty>
  </ColumnName>
  <!--原因,导出失败列表时用到的字段,导入时用不到-->
  <ColumnName Enabled="true" >
    <DbProperty>SourceCode</DbProperty>
    <ExcelProperty>原因</ExcelProperty>
  </ColumnName>
  <!--创建时间-->
  <ColumnName Enabled="true" >
    <DbProperty>CreateTime</DbProperty>
    <ExcelProperty>创建时间</ExcelProperty>
  </ColumnName>
  <!--更新时间-->
  <ColumnName Enabled="true" >
    <DbProperty>UpdateTime</DbProperty>
    <ExcelProperty>更新时间</ExcelProperty>
  </ColumnName>
</TableConfig>

具体的Excel模板

以上就是ASP.NET 上传文件导入Excel的示例的详细内容,更多关于ASP.NET 上传文件导入Excel的资料请关注我们其它相关文章!

(0)

相关推荐

  • asp.net利用ashx文件实现文件的上传功能

    原来以为文件上传是一个比较简单的功能,结果搞了一个晚上才搞定~这里主要介绍两种方法实现. 方法一:Form表单提交 html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>上传文件</title> <script src="Scripts/jquery-1.11.3.min.js"></scri

  • asp.net上传Excel文件并读取数据的实现方法

    前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:FileUpload ID="ExcelFileUpload" runat="server" /> <as

  • 解决asp.net上传文件超过了最大请求长度的问题

    错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 解决方案 1. 修改web.config文件可以改变这个默认值 <configuration> <system.web> <httpRuntime maxRequestLength="1048576" executionTimeout="3600" /> </system.web> <configuratio

  • ASP.NET 上传文件到共享文件夹的示例

    目录 上传文件代码 web.config 工具方法 常量 具体上传文件代码 创建共享文件夹参考资料 上传文件代码 web.config <!--上传文件配置,UploadPath值一定是服务器ip,内网ip最好--> <add key="UploadPath" value="\\172.21.0.10\File" /> <add key="DownloadPath" value="http://x.x.x.

  • ASP.NET Core单文件和多文件上传并保存到服务端的方法

    前言: 在我们日常开发中,关于图片,视频,音频,文档等相关文件上传并保存到服务端中是非常常见的一个功能,今天主要是把自己在开发中常用的两种方式记录下来方便一下直接使用,并且希望能够帮助到有需要的同学! 一.配置ASP.NET Core中的静态文件: 简单概述: 在ASP.NET Core应用中静态资源文件需要进行相应的配置才能够提供给客户端直接使用. 详情描述请参考官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/st

  • ASP.NET Core文件上传与下载实例(多种上传方式)

    前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经很成熟了.下个项目争取使用吧. 正文 1.使用模型绑定上传文件(官方例子) 官方机器翻译的地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads 这里吐槽一下 - -,这TM的机器翻译..还不如自己看E文的..

  • asp.net大文件上传解决方案实例代码

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 可以带参数 [HttpPost("upload")] public JsonResult uploadProject(IFormFile file, string userId) { if (file != null) { var fileDir = "D:\\aaa"

  • ASP.NET MVC HttpPostedFileBase文件上传的实例代码

    本文介绍了ASP.NET MVC HttpPostedFileBase文件上传 ,分享给大家,希望对大家有帮助 HttpPostedFileBase文件上传,支持多文件一次上传,如有图片,则支持略缩图保存 文件传输信息封装 /// <summary> /// 文件生成方式 /// </summary> public class UpFileMessage { /// <summary> /// 文件名 /// </summary> public string

  • asp.net core webapi文件上传功能的实现

    最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库.最先来的问题就是上传文件的问题. POST文件的一些坑 使用默认模板创建webapi的controller后,post请求,默认有 // POST api/values [HttpPost] public void Post([FromBody]string value) { } 请求使用了[FromBody]标记,用来指示用请求体里获得数据. 对于文件上传请求,直接在这个Post

  • ASP.NET MVC实现批量文件上传

    根据项目需要,研究了一下如何在ASP.NETMVC下实现批量文件上传.首先,介绍单文件上传:然后,介绍多文件上传如何实现. 一.单文件上传 单文件上传的原理是将文件数据放入request中,由页面直接传递至后台controller中,类似于view和controller之间传参数,直接贴上代码加注释. Upload.aspx文件中的代码: <form enctype="multipart/form-data" method="post"> <inp

随机推荐