欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DataTable导出excel

程序员文章站 2022-06-02 21:35:08
...
网上有很多关于导出的例子,这里讲一个利用NPOI导出excel的方法,使用此插件后即使客户端或服务器不装office也能成功导出

配套的dll参考附件,此版本比较早,和网上的方法实现有些小差异。但也都是小修小改。

#region 导出报表文件到服务器
        /// <summary>
        /// 导出报表文件到服务器
        /// </summary>
        /// <param name="dt">数据源</param>
        /// <param name="fileName">文件名</param>
        /// <param name="sheetName">sheet的名字</param>
        /// <param name="path">要导出的文件路径</param>
        /// <param name="type">1=xls  2=xlxs</param>
        /// <returns>成功返回true</returns>
        public static bool ExportExcel(DataTable dt,string fileName,string sheetName,string path,string type = "1")
        {
            try
            {
                IWorkbook workbook;
                string name_suffix = string.Empty;
                //创建一个工作簿
                if (type == "1")   //保存为.xls
                {
                    workbook = new HSSFWorkbook();
                    name_suffix = ".xls";
                }
                else                  //保存为.xlsx
                { 
                    workbook = new XSSFWorkbook();
                    name_suffix = ".xlsx";
                }

                //创建一个 sheet 表
                ISheet sheet = workbook.CreateSheet(sheetName);

                //创建一行
                IRow rowH = sheet.CreateRow(0);

                //创建一个单元格
                ICell cell = null;

                //创建单元格样式
                ICellStyle cellStyle = workbook.CreateCellStyle();

                //创建格式
                IDataFormat dataFormat = workbook.CreateDataFormat();

                //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text");
                cellStyle.DataFormat = dataFormat.GetFormat("@");

                //设置列名
                foreach (DataColumn col in dt.Columns)
                {
                    //创建单元格并设置单元格内容
                    rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption);
                }

                //写入数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //跳过第一行,第一行为列名
                    IRow row = sheet.CreateRow(i + 1);

                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        cell = row.CreateCell(j);
                        cell.SetCellValue(dt.Rows[i][j].ToString());
                        cell.CellStyle = cellStyle;
                    }
                }

                //判断文件夹是否存在
                if (Directory.Exists(path) == false)//如果不存 //在就创建file文件夹
                {
                    Directory.CreateDirectory(path);
                }

                //string path = HttpContext.Current.Server.MapPath("Export/");  获取当前请求路径的地址,存在路径下,已改为参数传入
                
                //设置新建文件路径及名称
                string savePath = path + fileName + name_suffix;

                //创建文件
                FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write);

                //创建一个 IO 流
                MemoryStream ms = new MemoryStream();

                //写入到流
                workbook.Write(ms);

                //转换为字节数组
                byte[] bytes = ms.ToArray();

                file.Write(bytes, 0, bytes.Length);
                file.Flush();

                //还可以调用下面的方法,把流输出到浏览器下载
                //OutputClient(bytes);

                //释放资源
                bytes = null;

                ms.Close();
                ms.Dispose();

                file.Close();
                file.Dispose();

                workbook.Dispose();
                sheet = null;
                workbook = null;
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        #endregion

        #region 已文件流形式将表数据返回给浏览器下载
        /// <summary>
        /// 已文件流形式将表数据返回给浏览器下载
        /// </summary>
        /// <param name="dt">数据源</param>
        /// <param name="fileName">文件名</param>
        /// <param name="sheetName">sheet的名字</param>
        /// <param name="path">要导出的文件路径</param>
        /// <param name="type">1=xls  2=xlxs</param>
        /// <returns>成功返回true</returns>
        public static void ExportExcelToClientWeb(DataTable dt, string fileName, string sheetName, string path,string type = "1")
        {
            try
            {
                //定义工作表变量
                IWorkbook workbook;
                //定义后缀名
                string name_suffix = string.Empty;
                //创建一个工作簿
                if (type == "1")   //保存为.xls
                {
                    workbook = new HSSFWorkbook();
                    name_suffix = ".xls";
                }
                else                  //保存为.xlsx
                {
                    workbook = new XSSFWorkbook();
                    name_suffix = ".xlsx";
                }

                //创建一个 sheet 表
                ISheet sheet = workbook.CreateSheet(sheetName);

                //创建一行
                IRow rowH = sheet.CreateRow(0);

                //创建一个单元格
                ICell cell = null;

                //创建单元格样式
                ICellStyle cellStyle = workbook.CreateCellStyle();

                //创建格式
                IDataFormat dataFormat = workbook.CreateDataFormat();

                //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text");
                cellStyle.DataFormat = dataFormat.GetFormat("@");

                //设置列名
                foreach (DataColumn col in dt.Columns)
                {
                    //创建单元格并设置单元格内容
                    rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption);
                }

                //写入数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //跳过第一行,第一行为列名
                    IRow row = sheet.CreateRow(i + 1);

                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        cell = row.CreateCell(j);
                        cell.SetCellValue(dt.Rows[i][j].ToString());
                        cell.CellStyle = cellStyle;
                    }
                }

                //判断文件夹是否存在
                if (Directory.Exists(path) == false)//如果不存 //在就创建file文件夹
                {
                    Directory.CreateDirectory(path);
                }

                //string path = HttpContext.Current.Server.MapPath("Export/");  获取当前请求路径的地址,存在路径下,已改为参数传入

                //设置新建文件路径及名称
                string savePath = path + fileName + name_suffix;

                //创建文件
                FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write);

                //创建一个 IO 流
                MemoryStream ms = new MemoryStream();

                //写入到流
                workbook.Write(ms);

                //转换为字节数组
                byte[] bytes = ms.ToArray();

                file.Write(bytes, 0, bytes.Length);
                file.Flush();

                //还可以调用下面的方法,把流输出到浏览器下载
                OutputClient(bytes,fileName,name_suffix);

                //释放资源
                bytes = null;

                ms.Close();
                ms.Dispose();

                file.Close();
                file.Dispose();

                workbook.Dispose();
                sheet = null;
                workbook = null;
            }
            catch (Exception ex)
            {
                
            }
        }
        #endregion

        #region 将生成的文件流返回给浏览器
        /// <summary>
        /// 将生成的文件流返回给浏览器
        /// </summary>
        /// <param name="bytes">文件流</param>
        /// <param name="fileName">要保存的文件名</param>
        /// <param name="name_suffix">文件后缀名</param>
        public static void OutputClient(byte[] bytes,string fileName,string name_suffix)
        {
            HttpResponse response = HttpContext.Current.Response;

            response.Buffer = true;

            response.Clear();
            response.ClearHeaders();
            response.ClearContent();

            response.ContentType = "application/vnd.ms-excel";
            response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}{1}", fileName, name_suffix));

            response.Charset = "GB2312";
            response.ContentEncoding = Encoding.GetEncoding("GB2312");

            response.BinaryWrite(bytes);
            response.Flush();

            response.Close();
        }
        #endregion


其实两个方法总体一样,一个是在流文件生成后保存到本地,一个是流文件生成后返回给客户端
这里要说明一下如果是以流文件返回到客户端了,需要用

window.location.href = '../../report/ExcelToClient';   //后台生成流文件的url请求地址

如果要使用.ajax异步获取,那么会收到乱码。原因是.ajax只针对文本信息存放,而response后的是二进制流无法处理。所以直接用href就搞定了

参考:https://www.cnblogs.com/lunawzh/p/7966214.html

附件是NPOI最新的2.3.0.0版本