以下方式是本人总结的一些经验,肯定有很多种方法,在此先记下,留待以后补充...

希望朋友们一起来探讨相关想法,请在下方留言.

A-1:EXCEL模板导出

非常简单,将EXCEL模板上传到项目中后,将其浏览URL保存下来(excelUrl),然后:

window.location.href="http://localhost:10086/yuanxin/Resources/BusRoute.xlsx"  //EXCEL浏览路径

或者使用<a href="excelUrl"></a>都行。

A-2:EXCEL数据导出--Web项目--C#代码导出:

/// <summary>
    /// EXCEL帮助类
    /// </summary>
    /// <typeparam name="T">泛型类</typeparam>
    /// <typeparam name="TCollection">泛型类集合</typeparam>
    public class ExcelHelp<T, TCollection> where T : new() where TCollection : List<T>, new()
    {
        //http请求Request对象
        public static HttpRequest baseRequest = HttpContext.Current.Request;
        //http请求Response对象
        public static HttpResponse baseResponse = HttpContext.Current.Response;/// <summary>
        /// 将数据导出EXCEL
        /// </summary>
        /// <param name="columnNameAndShowNameDic">列名+显示名</param>
        /// <param name="tColl">数据集(tColl里的类属性名必须和字典中的列名一致)</param>
        public static void ExportExcelData(Dictionary<string, string> columnNameAndShowNameDic, TCollection tColl)
        {
            WorkBook workbook = WorkBook.CreateNew();
            WorkSheet worksheet = workbook.Sheets["sheet1"];

            List<string> columnNameList = columnNameAndShowNameDic.Keys.ToList();
            List<string> showNameList = columnNameAndShowNameDic.Values.ToList();
            //暂定26行
            string[] zm = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
            //设置首列显示
            for (var i = 0; i < columnNameList.Count; i++)
            {
                worksheet.Cells[zm[i] + "1"].Value = showNameList[i];
                //加粗
                worksheet.Cells[zm[i] + "1"].Style.Font.Bold = true;
            }
            for (int i = 0; i < tColl.Count; i++)
            {
                for (int j = 0; j < columnNameList.Count; j++)
                {
                    worksheet.Cells[zm[j] + (i + 2)].Value = getPropertyValue(tColl[i], columnNameList[j]);
                }
            }
            byte[] buffer = workbook.SaveAsBytes();
            baseResponse.Clear();
            baseResponse.Buffer = true;
            baseResponse.ContentEncoding = System.Text.Encoding.UTF8;
            //baseResponse.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            baseResponse.ContentType = "application/vnd.ms-excel";
            //设置导出文件名
            baseResponse.AddHeader("content-disposition", "attachment;  filename=" + "MaintainReport" + ".xlsx");
            baseResponse.AddHeader("Content-Length", buffer.Length.ToString());

            baseResponse.BinaryWrite(buffer);
            baseResponse.Flush();
            baseResponse.End();
        }
        /// <summary>
        /// 获取属性值
        /// </summary>
        /// <param name="t">T对象实例</param>
        /// <param name="propertyName">属性名</param>
        /// <returns></returns>
        public static string getPropertyValue(T t, string propertyName)
        {
            PropertyInfo info = t.GetType().GetProperty(propertyName);
            //获取属性值转换暂设置如下字段,可根据实际情况添加
            if (info.PropertyType == typeof(DateTime))
            {
                return Convert.ToDateTime(info.GetValue(t)).ToString("yyyy-MM-dd HH:mm");
            }
            return info.GetValue(t).ToString();
        }
    }

A-2--EXCEL数据导出--WebAPI项目--NPOI--接口导出:

说明:以下方法借助第三方插件:NPOI专门处理EXCEL等办公文档的类库,因此项目中需引用该插件,NuGet--所有NPOI即可安装。

NPOI百度百科

/// <summary>
        /// 班车数据导出成EXCEL
        /// </summary>
        /// <param name="conferenceID"></param>
        /// <returns></returns>
        [HttpGet]
        public HttpResponseMessage ExportExcelDataForBusRoute(string conferenceID)
        {
            HttpResponseMessage result = new HttpResponseMessage();
            ControllerHelp.RunAction(() =>
            {
                BusRouteModelCollection busColl = BusRouteModelAdapter.Instance.Load(m => m.AppendItem("ConferenceID", conferenceID));

                Dictionary<string, string> dicColl = new Dictionary<string, string>() {
                    {"路线标题","Title" },
                    {"发车时间","DepartDate" },
                    {"出发地","BeginPlace" },
                    {"对接人","ContactsName" },
                    {"对接人电话","ContactsPhone" }
                };
                result = ExcelHelp<BusRouteModel, BusRouteModelCollection>.ExportExcelData(dicColl, busColl, "BusRoute");
            });
            return result;
        }
     /// <summary>
        /// 得到excel文件流
        /// </summary>
        /// <returns></returns>
        private MemoryStream ExcelStream(Dictionary<string, string> displayAndColumnName, TCollection tlist)
        {
            //var list = dc.v_bs_dj_bbcdd1.Where(eps).ToList();
            HSSFWorkbook workbook = new HSSFWorkbook();

            ISheet sheet1 = workbook.CreateSheet("Sheet1");

            //1-创建首行
            IRow headRow = sheet1.CreateRow(0);
            //1.1-设置首行样式
            IFont font = workbook.CreateFont();
            font.Boldweight = (short)FontBoldWeight.Bold;   //字体加粗
            ICellStyle headCellStyle = workbook.CreateCellStyle();
            headCellStyle.SetFont(font);
            headCellStyle.Alignment = HorizontalAlignment.Center;  //字体居中

            List<string> displayNameList = displayAndColumnName.Keys.ToList();
            //1.2-设置首行标题
            for (var i = 0; i < displayAndColumnName.Keys.Count; i++)
            {
                ICell cell = headRow.CreateCell(i);
                cell.SetCellValue(displayNameList[i].ToString());
                cell.CellStyle = headCellStyle;
            }
            //2-设置内容列
            List<string> columnNameList = displayAndColumnName.Values.ToList();
            //2.1-内容行样式
            ICellStyle contentCellStyle = workbook.CreateCellStyle();
            contentCellStyle.Alignment = HorizontalAlignment.Center;  //字体居中

            for (var i = 0; i < tlist.Count; i++)
            {
                IRow row = sheet1.CreateRow(i + 1);
                //设置内容
                for (var j = 0; j < columnNameList.Count; j++)
                {
                    ICell cell = row.CreateCell(j);
                    cell.SetCellValue(getPropertyValue(tlist[i], columnNameList[j]));
                    cell.CellStyle = contentCellStyle;
                }
            }
        //3-自动列宽-根据内容长度自动展开
            for (int i = 0; i < displayNameList.Count; i++)
            {
                sheet1.AutoSizeColumn(i);
            }

            MemoryStream file = new MemoryStream();
            workbook.Write(file);
            //这句代码非常重要,如果不加,会报:打开的EXCEL格式与扩展名指定的格式不一致
            file.Seek(0, SeekOrigin.Begin);

            return file;
        }
        /// <summary>
        /// 导出excel功能控制器
        /// </summary>
        /// <returns></returns>
        public HttpResponseMessage ExportExcelDataForWebAPI(Dictionary<string, string> displayAndColumnName, TCollection tlist,string exportFileName)
        {
            var file = ExcelStream(displayAndColumnName, tlist);
            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            result.Content = new StreamContent(file);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = exportFileName+".xls";
            return result;
        }

B-1:EXCEL数据导入--C#获取数据:

public class ExcelHelp
    {
        //获取http请求Request对象
        public static HttpRequest baseRequest = HttpContext.Current.Request;
        //获取http请求Response对象
        public static HttpResponse baseResponse = HttpContext.Current.Response;
        /// <summary>
        /// 获取Post请求EXCEL文件数据
        /// </summary>
        /// <param name="fileFormName">EXCEL的表单名称</param>
        /// <returns></returns>
        public static DataTable GetExcelData(string fileFormName)
        {
            //获取Post请求--表单文件的文件名
            string uploadFileName = baseRequest.Files[fileFormName].FileName;
            //上传文件到指定目录(项目根目录/Resources/uploadFileName)--可根据项目文件目录进行调整
            string path = HttpContext.Current.Server.MapPath("~/Resources/" + uploadFileName);
            baseRequest.Files[fileFormName].SaveAs(path);

            DataTable dataTable = new DataTable();
            DataSet dataSet = new DataSet();
            //解析文件数据,并存入服务器
            //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
            //"IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
            string strConn = string.Format("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0}; Extended Properties = 'Excel 8.0;HDR=Yes;IMEX=1';", path);
            OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
            oada.Fill(dataSet);

            )
            {
                dataTable = dataSet.Tables[];
            }
            if (System.IO.File.Exists(path))
            {
                //如果存在则删除
                System.IO.File.Delete(path);
            }
            return dataTable;
        }
    }

B-2--EXCEL数据导入--NPOI--C#获取数据:

说明:以下方法借助第三方插件:NPOI专门处理EXCEL等办公文档的类库,因此项目中需引用该插件,NuGet--所有NPOI即可安装。

NPOI百度百科

public HSSFWorkbook GetExcelDataByNPOI(string fileFormName)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();

            //获取Post提交的EXCEL文件
            HttpPostedFile postFile = baseRequest.Files[fileFormName];
            string uploadFileName = postFile.FileName;
            //设置Excel临时保存路径(路径可修改,可作为参数传入)
            string path = HttpContext.Current.Server.MapPath("~/Resources/" + uploadFileName);
            postFile.SaveAs(path);
            System.IO.File.Delete(path);

            //文件流
            using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                workbook = new HSSFWorkbook(stream);

                ISheet sheet = workbook.GetSheetAt();
                //Execel第一行是标题,不是要导入数据库的数据
                //for (int i = 1; i <= sheet.LastRowNum; i++)
                //{
                //    IRow row = sheet.GetRow(i);

                //    //获取行的文本内容
                //    string UserName = row.GetCell(0).StringCellValue;
                //    //获取行的时间内容
                //    DateTime time = row.GetCell(4).DateCellValue;
                //    //获取行的数字内容
                //    double num = row.GetCell(3).NumericCellValue;
                //    //获取行的bool内容
                //    bool b = row.GetCell(3).BooleanCellValue;
                //}
            }
            return workbook;
        }
        #endregion

备注:   使用C#创建EXCEL,暂未研究,以后有空再做补充。

在编写本博客时,查阅了下面帮助博客:导入excel错误:外部表不是预期的格式 解决方案

C# 之 EXCEL导入导出的更多相关文章

  1. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  2. Excel导入导出的业务进化场景及组件化的设计方案(上)

    1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...

  3. 关于Excel导入导出的用例设计

    目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...

  4. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

  5. Excel导入导出帮助类

    /// <summary>    /// Excel导入导出帮助类    /// 记得引入 NPOI    /// 下载地址   http://npoi.codeplex.com/rele ...

  6. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  7. Octopus——excel导入导出工具

    Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...

  8. TP5.0 excel 导入导出

    引第三方的phpexcel类库放到 ThinkPHP\Library\Vendor\demo下,自己建的文件夹demo 再将Excel.class放到ThinkPHP\Library\Org\clas ...

  9. Mego(04) - NET简单实现EXCEL导入导出

    前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...

  10. JeeSite中Excel导入导出

    在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel.CSV格式居多.如果是学习的过程中,最好是自己实现数据导入与导出的功能,然而在项目中,还是调用现成的功能比较好.近期一直使用 ...

随机推荐

  1. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

  2. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. ...

  3. Take into Action!

    很久没有认真地写文字了. 刚毕业一两年断断续续在csdn上写过一些当时的工作记录,然后没有坚持下去.有时候是觉得自己不牛,记录的东西旁人看起来也许不值一提:有时候觉得结婚生娃了,然后时间不够用(确实是 ...

  4. 【代码笔记】iOS-获得当前的月的天数

    一,代码. #import "ViewController.h" @interface ViewController () @end @implementation ViewCon ...

  5. A*算法应用[转]

    转自:http://www.cnblogs.com/zhoug2020/p/3468167.html 这是一篇十分精彩/易懂的博客,感谢原博主!本文通过自己的理解在原博文基础上突出一些重点字眼,句子. ...

  6. C 盘的不速之客

      C 盘的报告内容既然上GB的空间 操作系统版本 原来是微软这个查找解决异常关闭解决方案生成的报告   参考 How To Disable Vista Error Reporting Feature ...

  7. 如何让我们的PHP在Jexus中跑起来

    最近一段时间,经常看到不少的朋友在问,应该怎么设置才能够让Jexus支持PHP.其实,Jexus在很早之前就已经是可以支持PHP,像Apache或Nginx一样充当PHP的Web服务器的.不过由于没有 ...

  8. Xamarin.Android之SQLiteOpenHelper

    一.前言 在手机中进行网络连接不仅是耗时也是耗电的,而耗电却是致命的.所以我们就需要数据库帮助我们存储离线数据,以便在用户未使用网络的情况下也可以能够使用应用的部分功能,而在需要网络连接的功能上采用提 ...

  9. .NET中使用Redis (二)

    很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据.本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象. 和 ...

  10. 疯狂的JSONP

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...