Asp.Net 常用工具类之Office—Excel导出(4)

  

    开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等。。。

  

    网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Office.Interop.Excel,EPPlus等等,其实说起来,微软自带的家伙还是不错的,但是必须要安装office组件,这个不能忍,服务器上安装一个office,呵呵哒!

    

    今天给大家介绍的Excel导入导出用的是NPOI,这个组件还是蛮好用的,而且不依赖office组件。可以根据Excel格式进行自定义。根据平常用到的一些用法进行了封装,旨在更方便的进行文档操作。

    

    我们在Ado.Net里面,DataTable用到的非常多;但是在EF里面,我们更多的是针对List进行操作,毕竟Linq的好处大家都是非常明白,下面通过几个示例分别介绍Excel的导出:

 

    DataTable导出Excel

 

 /// <summary>
        /// DataTable导出到Excel
        /// </summary>
        /// <param name="dt"></param>
        ///  <param name="filename">文件名</param>
        /// <param name="sheetname">表名</param>
        /// <param name="maxrow">超过行数新建表</param>
        /// <param name="isweb">是否web导出,默认是</param>
        /// <returns></returns>
        public static void DataTableToExcel(string filename, DataTable dt, string sheetname = "", int maxrow = 100, bool isweb = true)
        {
            if (dt == null || dt.Rows.Count < 1)
                return;
            if (filename.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) < 0 && filename.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) < 0)
                filename += ".xls";
            IWorkbook workbook = new HSSFWorkbook();
            if (sheetname.IsNullOrEmpty())
                sheetname = filename;
            if (dt.Rows.Count < maxrow)
                WriteExcel(dt, 0, dt.Rows.Count - 1, workbook, sheetname);
            else
            {
                int page = dt.Rows.Count / maxrow;
                for (int i = 0; i < page; i++)
                {
                    int start = i * maxrow;
                    int end = (i * maxrow) + maxrow - 1;
                    WriteExcel(dt, start, end, workbook, sheetname + i);
                }
                int lastPageItemCount = dt.Rows.Count % maxrow;
                WriteExcel(dt, dt.Rows.Count - lastPageItemCount, lastPageItemCount, workbook, sheetname + page);
            }

            using (MemoryStream ms = new MemoryStream())
            {
                workbook.Write(ms);
                if (!isweb)
                {
                    if (!filename.Contains("\\"))
                        filename = Config.Config.GenerateFilePath("Office") + filename;

                    if (!File.Exists(filename))
                    {
                        using (FileStream fs = new FileStream(filename, FileMode.CreateNew))
                        {
                            fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
                            fs.Close();
                        }
                    }
                }
                else
                {
                    //Web导出
                    HttpContext curContext = HttpContext.Current;
                    curContext.Response.ContentType = "application/vnd.ms-excel";
                    curContext.Response.ContentEncoding = Encoding.UTF8;
                    curContext.Response.Charset = "";
                    curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8));
                    curContext.Response.BinaryWrite(ms.GetBuffer());
                    curContext.Response.End();
                }
            }
        }

     private static void WriteExcel(DataTable dt, int start, int end, IWorkbook book, string sheetName)
        {
            ISheet sheet = book.CreateSheet(sheetName);
            IRow header = sheet.CreateRow(0);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ICell cell = header.CreateCell(i);
                string val = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName;
                cell.SetCellValue(val);
            }
            int rowIndex = 1;
            for (int i = start; i <= end; i++)
            {
                DataRow dtRow = dt.Rows[i];
                IRow excelRow = sheet.CreateRow(rowIndex++);
                for (int j = 0; j < dtRow.ItemArray.Length; j++)
                    excelRow.CreateCell(j).SetCellValue(dtRow[j].ToString().Trim());
            }
        }

  调用方式:

public void Test()
{
  Excel.DataTableToExcel("dt7.xls",dt,"人员名录");
}

 



 

 

  List导出Excel:

 

/// <summary>
        /// List导出Excel
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filename">文件名称和路径</param>
        /// <param name="sheetname">表名称</param>
        /// <param name="data">数据</param>
        /// <param name="title">表头</param>
        /// <param name="isweb">是否web导出,默认是</param>
        public static void ListToExcel<T>(string filename, string sheetname, List<T> data, List<string> title = null, bool isweb = true) where T : new()
        {
            if (data.Count < 1)
                return;
            if (filename.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) < 0 && filename.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) < 0)
                filename += ".xls";
            var wookbook = new HSSFWorkbook();
            var sheet = wookbook.CreateSheet(sheetname);
            var entity = new T();
            var propertys = entity.GetType().GetProperties();

            if (title == null || title.Count < 1)
            {
                title = new List<string>();
                foreach (PropertyInfo item in propertys)
                {
                    if (!Ignore.IgnoreField(item.Name))
                        continue;

                    title.Add(item.Name);
                }
            }

            var rowtitle = sheet.CreateRow(0);

            for (var i = 0; i < title.Count; i++)
                rowtitle.CreateCell(i).SetCellValue(title[i]);

            for (var i = 0; i < data.Count; i++)
            {
                var row = sheet.CreateRow(i + 1);                     //因为表头名称占了一行,所以加1
                for (var j = 0; j < propertys.Length; j++)
                {
                    if (!Ignore.IgnoreField(propertys[j].Name))
                        continue;

                    var obj = propertys[j].GetValue(data[i], null);
                    row.CreateCell(j).SetCellValue(obj.ToString().Trim());
                }
            }
            if (!isweb)
            {
                if (!filename.Contains("\\"))
                    filename = Config.Config.GenerateFilePath("Office") + filename;

                if (!File.Exists(filename))
                {
                    using (var fs = new FileStream(filename, FileMode.CreateNew))
                    {
                        wookbook.Write(fs);
                    }
                }
            }
            else
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    wookbook.Write(ms);
                    //Web导出
                    HttpContext curContext = HttpContext.Current;
                    curContext.Response.ContentType = "application/vnd.ms-excel";
                    curContext.Response.ContentEncoding = Encoding.UTF8;
                    curContext.Response.Charset = "";
                    curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8));
                    curContext.Response.BinaryWrite(ms.GetBuffer());
                    curContext.Response.End();
                }
            }
        }

  
  调用方法:

  
  public void Test()
  {
    Excel.ListToExcel(path,"123",list,newList<string>(){"编号","名字","时间"});
  }

 


 

OK,各位看官,这一期的文章Excel导出写到这里喏,感谢大家的支持,您的支持是我的动力!

下一期给大家带来的是常用的Excel导入,敬请期待!!!

 

 

posted on 2017-03-08 08:01  黑马狼  阅读(1454)  评论(0编辑  收藏  举报

导航