广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NET 上传文件导入Excel的示例
  • 307
分享到

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

2024-04-02 19:04:59 307人浏览 独家记忆
摘要

目录前言代码实战具体的xml文件具体的excel模板前言   本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中。截图如下: 代码实战   工具类  

前言

  本文对应的场景是导入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的资料请关注编程网其它相关文章!

--结束END--

本文标题: ASP.NET 上传文件导入Excel的示例

本文链接: https://www.lsjlt.com/news/123433.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET 上传文件导入Excel的示例
    目录前言代码实战具体的xml文件具体的Excel模板前言   本文对应的场景是导入Excel数据,Excel对应的字段都配置在xml文件中。截图如下: 代码实战   工具类  ...
    99+
    2022-11-12
  • ASP.NET 上传文件到共享文件夹的示例
    目录上传文件代码  web.config   工具方法    常量  具体上传文件代码创建共享文件夹参考资料 上传文件代码   web.config  <!--上...
    99+
    2022-11-12
  • ASP.Net MVC利用NPOI导入导出Excel的示例代码
    什么是NPOI 该项目是位于http://poi.apache.org/的POI Java项目的.NET版本。POI是一个开源项目,可以帮助您读取/写入xls,doc,ppt文件。它...
    99+
    2022-11-13
  • Java实现上传Excel文件并导入数据库
    目录Java实现上传Excel文件并导出到数据库 1、导入依赖2、domain3、utils4、Controller5、xmlJava实现上传Excel文件并导出到数据库 1、导入...
    99+
    2022-11-12
  • Hive导入csv文件示例
    目录正文首先创建表导入数据及查询其他注意事项总结正文 现有文件为csv格式,需要导入hive中,设csv内容如下 1001,zs,23 1002,lis,24 首先创建表 create table if not exis...
    99+
    2022-06-23
    Hive导入csv文件 Hive导入文件
  • JavaScript实现导入导出excel的示例代码
    目录Excel导入实现方式1实现方式2Excel导出Excel导入 先下包(xlsx) npm i xlsx 把数组里面中文的键修改成英文的键: 原因:因为中文的键后台不认识,只能修...
    99+
    2022-11-13
  • Node.js实现文件上传的示例
    文件上传指的是将用户本地的文件上传到服务器中。 上传文件需要处理两个位置: 客户端 客户端如何上传文件? 上传文件的表单项需要指定为input,type是file 要上传文件必须将表单enc...
    99+
    2022-06-04
    示例 文件上传 Node
  • jQuery.Form上传文件的示例分析
    小编给大家分享一下jQuery.Form上传文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!建立test文件夹PHP...
    99+
    2022-10-19
  • MySQLWorkbench导入excel数据的实现示例
    MySQL Workbench为使用MySQL的用户提供了丰富的功能,其中就包括数据导入。 选中你想要导入的db或者表,右键 --> Table Data Import Wiz...
    99+
    2023-01-05
    MySQL Workbench导入excel MySQL Workbench导入
  • vue实现excel表格的导入导出的示例
    目录一、下载xlsx插件二、通过element-ui组件的upload组件上传文件三、把选择的Excel文件把文件内容转化为二进制四、通过插件中的xlsx.read()读取二进制数据...
    99+
    2023-05-15
    vue excel导入导出 vue excel导入 vue excel导出
  • react显示文件上传进度的示例
    目录react上传文件显示进度 demo 前端 快速安装react应用src-> App.js后台 使用express搭载web服务器app.jsAxios 是一个基于 pro...
    99+
    2022-11-12
  • node.js文件上传处理示例
    直入主题,在Node.js web 开发基本框架的前提下,我们来做一个文件上传功能 上传的handler比较简单,网上都能找到 var url=require('url'); var exec=re...
    99+
    2022-06-04
    示例 文件上传 node
  • Asp.Net上传文件并配置可上传大文件的方法
    ASP.NET 包含两个控件可以使用户向网页服务器上传文件。一旦服务器接受了上传的文件数据,那么应用程序就可以进行保存,进行检查或者忽略它。 HtmlInputFile -...
    99+
    2022-11-13
  • android文件上传示例分享(android图片上传)
    主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。 主Activity 代码如下:package com.guoto...
    99+
    2022-06-06
    示例 Android
  • SpringMVC上传文件FileUpload的示例分析
    这篇文章将为大家详细讲解有关SpringMVC上传文件FileUpload的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下我是在已经搭建好的springMVC环境下,maven工程中的...
    99+
    2023-05-30
    springmvc fileupload
  • 前端上传文件的示例分析
    这篇文章将为大家详细讲解有关前端上传文件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。零, 基础(知识点主要来源于w3school)(已经熟悉的人直接跳过这一章...
    99+
    2022-10-19
  • React+Koa实现文件上传的示例
    目录背景 服务端依赖 后端配置跨域后端配置静态资源访问 使用 koa-static-cache后端配置requst body parse 使用 koa-bodyparser前端依赖 ...
    99+
    2022-11-12
  • PHP中文件上传的示例分析
    小编给大家分享一下PHP中文件上传的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PH...
    99+
    2023-06-14
  • MySQL Workbench导入excel数据的实现示例
    MySQL Workbench为使用mysql的用户提供了丰富的功能,其中就包括数据导入。 选中你想要导入的db或者表,右键 --> Table Data Import Wizard就可以开始导入了 选择你想要导入...
    99+
    2023-01-05
    MySQLWorkbench导入excel MySQLWorkbench导入
  • 怎么通过FileZilla Client导入上传文件
    这篇文章给大家介绍怎么通过FileZilla Client导入上传文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色、直觉的接口...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作