当前位置: 首页 >>ASP.NET >>ASP.NET实战 >>DATATABLE导出到Excel文件

DATATABLE导出到Excel文件

时间:2020/9/1 2:13:00 【admin】

DATATABLE导出到Excel文件,DataTable转换成Excel文档流,并输出到客户端,如果设置表名请设置table.TableName="表名"…

下载并引入命名空间:

NPOI.rar

using NPOI.HSSF.UserModel;

using NPOI.SS.UserModel;

using NPOI.SS.Util;

using System;

using System.Collections.Generic;

using System.Data;

using System.IO;

using System.Linq;

using System.Web;


        #region DATATABLE导出到Excel文件

        /// <summary>

        /// DataTable转换成Excel文档流,并输出到客户端,如果设置表名请设置table.TableName="表名"

        /// </summary>

        /// <param name="table">DataTable</param>

        /// <param name="context">上下文对象</param>

        /// <param name="fileName">Excel文件名(为空以当前时间加随机数命名)</param>

        public static void RenderToExcel(DataTable table, string fileName = null)

        {

            var name = "";

            if (fileName == "" && fileName == null)

            {

                name = "数据导出(" + DateTime.Now.ToString("yyyyMMdd") + ")" + new Random(DateTime.Now.Second).Next(10000);

            }

            else

            {

                name = "数据导出(" + DateTime.Now.ToString("yyyyMMdd") + ")" + new Random(DateTime.Now.Second).Next(10000);

            }



            var path = HttpContext.Current.Server.MapPath("~/upfile/hdhcms/" + name + ".xls");

            if (!Directory.Exists(HttpContext.Current.Server.MapPath("~/upfile/hdhcms")))

            {

                Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/upfile/hdhcms"));

            }

            TableToExcelForXLS(table, path, fileName);

            System.IO.FileInfo file = new System.IO.FileInfo(path);

            HttpContext.Current.Response.ContentType = "application/ms-download";

            HttpContext.Current.Response.Clear();

            HttpContext.Current.Response.AddHeader("Content-Type", "application/octet-stream");

            HttpContext.Current.Response.Charset = "utf-8";

            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));

            HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());

            HttpContext.Current.Response.WriteFile(file.FullName);

            HttpContext.Current.Response.Flush();

            HttpContext.Current.Response.Clear();

            HttpContext.Current.Response.End();

            File.Delete(path);

        }

        /// <summary>

        /// 将DataTable数据导出到Excel文件中(xls)

        /// </summary>

        /// <param name="dt"></param>

        /// <param name="file">路径</param>

        /// <param name="tablename">表名</param>

        public static void TableToExcelForXLS(DataTable dt, string file, string tablename = null)

        {

            HSSFWorkbook hssfworkbook = new HSSFWorkbook();


            if (tablename == null)

                tablename = "table1";

            ISheet sheet = hssfworkbook.CreateSheet(tablename);

            int n = 0;  //控制表名,在第一行(列名前面一行)显示


            if (dt.TableName != null && dt.TableName != "")

            {

                //表名

                //设置一个合并单元格区域,使用上下左右定义CellRangeAddress区域

                //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列

                sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dt.Columns.Count));

                IRow rowtitle = sheet.CreateRow(0);


                ICell celltitle = rowtitle.CreateCell(0);

                celltitle.SetCellValue(dt.TableName);

                //设置单元格样式时需要注意,务必创建一个新的样式对象进行设置,否则会将工作表所有单元格的样式一同设置,它们应该共享的是一个样式对象

                ICellStyle style = hssfworkbook.CreateCellStyle();

                //设置单元格的样式:水平对齐居中

                style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;

                //新建一个字体样式对象

                IFont font = hssfworkbook.CreateFont();

                //设置字体加粗样式

                font.Boldweight = short.MaxValue;

                //使用SetFont方法将字体样式添加到单元格样式中 

                style.SetFont(font);

                //将新的样式赋给单元格

                celltitle.CellStyle = style;

                n = 1;  //添加表名之后置为1

            }


            int[] ColumnWidthArray = new int[dt.Columns.Count]; //列宽数组(自适应列宽)

            //表头

            IRow row = sheet.CreateRow(n);

            for (int i = 0; i < dt.Columns.Count; i++)

            {

                ICell cell = row.CreateCell(i);

                cell.SetCellValue(dt.Columns[i].ColumnName);

                //可以获取中文长度,中文占2个字符

                ColumnWidthArray[i] = System.Text.Encoding.Default.GetBytes(dt.Columns[i].ColumnName).Length;

            }


            //数据

            for (int i = 0; i < dt.Rows.Count; i++)

            {

                IRow row1 = sheet.CreateRow(i + n + 1);

                for (int j = 0; j < dt.Columns.Count; j++)

                {

                    ICell cell = row1.CreateCell(j);

                    String cellValue = dt.Rows[i][j].ToString();

                    cell.SetCellValue(cellValue);

                    if (System.Text.Encoding.Default.GetBytes(cellValue).Length > ColumnWidthArray[j])

                    {

                        ColumnWidthArray[j] = System.Text.Encoding.Default.GetBytes(cellValue).Length;

                    }

                }

            }

            for (int i = 0; i < dt.Columns.Count; i++)

            {

                //sheet.SetColumnWidth(i, (ColumnWidthArray[i] + 2) * 256);

                if (ColumnWidthArray[i] > 255)

                {

                    ColumnWidthArray[i] = 254;

                }

                else

                {

                    sheet.SetColumnWidth(i, (ColumnWidthArray[i] + 1) * 256);

                }

            }

            //转为字节数组

            MemoryStream stream = new MemoryStream();

            hssfworkbook.Write(stream);

            var buf = stream.ToArray();


            //保存为Excel文件

            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))

            {

                fs.Write(buf, 0, buf.Length);

                fs.Flush();

            }

        }

        #endregion


CopyRight:2007-2018 语言吧 备案ICP:湘ICP备09009000号-15 http://www.yuyanba.com

分享按钮