asp.net mvc 上传excel文件并读取excle内容转成DataTable

news/2024/7/21 5:41:37 标签: 上传, excel

本文配套源码下载:https://download.csdn.net/download/djk8888/10502601

一个需求:将一个Excel文件中的数据导入到数据库中去。

思路:上传一个excel文件,读取该excel文件中数据,转成DataTable(或List),循环insert到数据库中去

截图如下:
这里写图片描述

前端用到:jQuery-File-Upload-8.8.5 后台用到:Spire.Office.3.6.0

html代码:

@{
    ViewBag.Title = "djk8888";
}
<script src="~/jQuery-File-Upload-8.8.5/js/jquery.min.js"></script>
<script src="~/jQuery-File-Upload-8.8.5/js/vendor/jquery.ui.widget.js"></script>
<script src="~/jQuery-File-Upload-8.8.5/js/jquery.iframe-transport.js"></script>
<script src="~/jQuery-File-Upload-8.8.5/js/jquery.fileupload.js"></script>
<script src="~/jQuery-File-Upload-8.8.5/js/jquery.fileupload-process.js"></script>
<script src="~/jQuery-File-Upload-8.8.5/js/jquery.fileupload-validate.js"></script>
<link href="~/jQuery-File-Upload-8.8.5/css/jquery.fileupload-ui.css" rel="stylesheet" />
<style type="text/css">
    .bar {
        height: 18px;
        background: green;
    }
</style>
<script>
    $(function () {
        $('#fileupload').fileupload({
            url: "/Home/UploadFiles",
            dataType: 'json',
            replaceFileInput: false,//显示已选择文件文件名(必须)
            progressall: function (e, data) {
                var progress = parseInt(data.loaded / data.total * 100, 10);
                $('#progress .bar').css('width', progress + '%');
            },
            add: function (e, data) {
                //判断文件类型,此例限制为:Excel文件
                var fileType = data.files[0].name.split('.').pop();
                var acceptFileTypes = /xls|xlsx$/i;
                if (!acceptFileTypes.test(fileType)) {
                    $("#startBtn").hide();//隐藏上传按钮
                    alert("不支持的文件类型,仅支持EXCEL文件");
                    return;
                }
                //判断文件大小,此例限制为:1mb:
                var size = data.files[0].size;
                size = (size / 1024).toFixed(2);//文件大小单位kb
                var maxFileSize = 1024;//1mb=1024kb
                if (size > maxFileSize) {
                    $("#startBtn").hide();//隐藏上传按钮
                    alert("文件大小:" + size + "KB,超过最大限制:" + maxFileSize + "KB");
                    return;
                }
                $("#startBtn").show();//显示上传按钮
                //点击上传按钮开始上传
                data.context = $('#startBtn').click(function () {
                    data.context = $('<p/>').text('Uploading...').replaceAll($(this));
                    data.submit();
                });
            },
            done: function (e, data) {
                data.context = $('<p/>').text("文件上传成功!").replaceAll($(this));

                $("#tab1").empty();
                $('#tab1').append("<tr><th>进度</th><th>课程</th><th>说明</th></tr>");
                $.ajax({
                    type: "GET",
                    url: "/Home/ReadFile",
                    data: {},
                    dataType: "json",
                    success: function (result) {                     
                        var html = '';
                        for (var i = 0; i < result.length; i++) {
                            html += '<tr>';
                            html += '<td>' + result[i].no + '</td>';
                            html += '<td>' + result[i].title  + '</td>';
                            html += '<td>' + result[i].note  + '</td>';
                            html += '</tr>';
                        }              
                        $('#tab1').append(html);
                    }
                });

            },
            change: function (e, data) {
                if (data.files.length > 1) {
                    $("#startBtn").hide();//隐藏上传按钮
                    alert("只能选择1个文件");
                    return false;
                }
            },
            drop: function (e, data) {
                if (data.files.length > 1) {
                    $("#startBtn").hide();//隐藏上传按钮
                    alert("只能选择1个文件");
                    return false;
                }
            },
        });
    });

</script>
<h2>用jQuery-File-Upload上传Excel文件(ASP.NET MVC)</h2>
<input id="fileupload" type="file" name="multiFiles" multiple />
<button id="startBtn" style="display:none;">上传</button>
<div id="progress">
    <div class="bar" style="width: 0%;"></div>
</div>
<br />
<table border="1" id="tab1"></table>

mvc代码:

using Spire.Xls;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Web;
using System.Web.Mvc;

namespace workbook.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        /// <summary>
        /// 上传excel文件
        /// </summary>
        [HttpPost]
        public ActionResult UploadFiles()
        {
            bool b = false;
            var statuses = new List<ViewDataUploadFilesResult>();
            var headers = Request.Headers;
            if (string.IsNullOrEmpty(headers["X-File-Name"]))
            {
                b = UploadWholeFile(Request, statuses);//上传文件
            }
            if (b)//上传成功
            {
                JsonResult result = Json(statuses);
                result.ContentType = "text/plain";
                return result;
            }
            var r = new List<ViewDataUploadFilesResult>();
            return Json(r);//上传失败
        }
        private string StorageRoot
        {
            get { return Path.Combine(Server.MapPath("~/Files")); }//文件上传的路径:根目录下的/Files 文件夹
        }
        private bool UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses)
        {
            try
            {
                var file = request.Files[0];//文件源
                var fullPath = Path.Combine(StorageRoot, Path.GetFileName(file.FileName));//服务器文件完整路径
                file.SaveAs(fullPath);//复制文件

                Workbook workbook = new Workbook();
                workbook.LoadFromFile(fullPath);
                //读取第一个sheet
                Worksheet worksheet = workbook.Worksheets[0];
                var dt = worksheet.ExportDataTable();

                //至此:已经获取上传的Excel文件中的内容并转成DataTable,即可进行写入(导入)数据库的操作(略)     
                Session["Upload"] = dt;//存到Session,用于展示上传excel文件中的内容

                statuses.Add(new ViewDataUploadFilesResult()
                {
                    name = file.FileName,
                    size = file.ContentLength,
                    type = file.ContentType,
                });

                return true;
            }
            catch
            {
                return false;
            }
        }
        public class ViewDataUploadFilesResult
        {
            public string name { get; set; }
            public int size { get; set; }
            public string type { get; set; }
            public string url { get; set; }
            public string delete_url { get; set; }
            public string thumbnail_url { get; set; }
            public string delete_type { get; set; }
        }
        /// <summary>
        /// 展示上传excel文件中的内容
        /// </summary>
        public ActionResult ReadFile()
        {
            DataTable dt = Session["Upload"] as DataTable;
            string json = "";
            json += "[";
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                json += "{";
                json += "\"no\":" + "\"" + dt.Rows[i]["no"].ToString() + "\"" + ",";
                json += "\"title\":" + "\"" + dt.Rows[i]["title"].ToString() + "\"" + ",";
                json += "\"note\":" + "\"" + dt.Rows[i]["note"].ToString() + "\"";
                json += "}";
                json += ",";
            }
            json = json.Substring(0, json.Length - 1);
            json += "]";
            return Content(json);
        }
    }
}

本文配套源码下载:https://download.csdn.net/download/djk8888/10502601
上传文件相关资料:https://blog.csdn.net/djk8888/article/details/78835131


http://www.niftyadmin.cn/n/836912.html

相关文章

洛谷 P1880 [NOI1995]石子合并

这道题是之前石子合并的加强板 https://blog.csdn.net/qq_34416123/article/details/81913341 不同在于是一个环 处理方法就是把数组 乘以2&#xff0c;枚举起点转化成链。 以后这种环的问题应该都可以这样来转化。 数组空间不要忘了乘以2 然后要注意区间从长度为2开始&#x…

BZOJ 3224 Tyvj 1728 普通平衡树模板

题目链接&#xff1a; https://www.lydsy.com/JudgeOnline/problem.php?id3224 题目大意&#xff1a; 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a;1. 插入x数2. 删除x数(若有多个相同的…

vs2013_update5下载链接(请使用迅雷下载)

Visual Studio Premium 2013 with Update 5 (x86) – DVD (Chinese-Simplified) 文件名&#xff1a;cn_visual_studio_premium_2013_with_update_5_x86_dvd_6815741.iso SHA1&#xff1a;9A2B64D73AAC916EA606B42B164A9C6E88D062D6 文件大小 &#xff1a;5.17GB 发布时间&a…

android屏幕适配之精准适配

&#xff08;1554068430qq.com&#xff09;&#xff08;android精准适配工具&#xff09;近期这段时间项目要做适配&#xff0c;在网上方便的方法。后来依据http://blog.csdn.net/jdsjlzx/article/details/45891551文章最后提出的适配思路&#xff0c;进行了总结优化做出了一套…

Git实用技巧和命令

2019独角兽企业重金招聘Python工程师标准>>> Git 是一个非常强大的工具&#xff0c;它包含丰富的工具用以维护项目。本文我们将会看见一些 Git 日常使用过程中的实用技巧和命令。希望其中的一些内容能够对读者有所帮助。 Git diff 通常情况下&#xff0c;我们会在自…

*.vsim插件的安装目录 可以手动删除安装的插件

vs2017 C:/用户/PC20150310/AppData/Local/Microsoft/VisualStudio/15.0/Extensions vs2013 C:/用户/PC20150310/AppData/Local/Microsoft/VisualStudio/12.0/Extensions 有时候手贱安装了一些插件安装包之后&#xff0c;会有这样和那样的问题&#xff0c;工具→扩展和更新…

SQLServer之创建唯一非聚集索引

创建唯一非聚集索引典型实现 唯一索引可通过以下方式实现&#xff1a; PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时&#xff0c;如果不存在该表的聚集索引且未指定唯一非聚集索引&#xff0c;则将自动对一列或多列创建唯一聚集索引。 主键列不允许空值。 在创建 UNI…

7月个人考核

打开Xshell。弹出的会话框中&#xff0c;点击新建。在主机那里填写你要远程的centos系统ip然后点击确定选中刚刚新建的会话点击连接输入用户名输入密码就成功远程了转载于:https://blog.51cto.com/13678719/2171869