`

DataTable导出excel

 
阅读更多
网上有很多关于导出的例子,这里讲一个利用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版本
分享到:
评论

相关推荐

    UiPath Datatable 导出Excel.docx

    UiPath Datatable 导出 Excel UiPath Datatable 是一个功能强大且灵活的数据表处理工具,能够高效地处理和操作大量数据。将 Datatable 导出到 Excel 是 RPA 之家的常见需求,而本文将详细讲解如何将 Datatable 导出...

    DataTable导出Excel(可以避免乱行)

    DataTable导出Excel(可以避免乱行),好处是可以避免乱行,因为好多内容有特殊符号,所有一般的导出到excel会出现乱行现象

    【ASP.NET编程知识】asp.net DataTable导出Excel自定义列名的方法.docx

    在ASP.NET编程中,将DataTable数据导出到Excel文件是一项常见的需求。在处理这个任务时,我们可能需要自定义Excel文件中的列名以满足特定的需求。以下是一个使用NPOI库来实现此功能的方法。 首先,为了使用NPOI库...

    GridView导出Excel DataTable导出Excel 实例源码

    二、DataTable导出Excel 1. DataTable概述:DataTable是.NET Framework中的一个类,它代表内存中的数据表,可以用于存储和操作数据,不依赖任何数据库。 2. 导出步骤: - 创建DataTable:根据需要,创建一个...

    winform中将Datatable数据导出到Excel表格中

    winform中将Datatable数据导出到Excel表格中,该项目包含了例子,能使个人能更加了解winform将datatable数据导出到excel的整个流程,本资源也可拿来即用,只需要稍加修改即可。

    C#-Winform将Datatable导出Excel

    这个主题“C#-Winform将Datatable导出Excel”就涵盖了如何在WinForm应用中实现这个功能。 首先,我们需要了解DataTable。DataTable是ADO.NET的一部分,它是一个内存中的数据集,可以存储和操作数据。它类似于数据库...

    winform datatable 导出Excel demo

    在这个"winform datatable 导出Excel demo"的实例中,我们将探讨如何在WinForm应用中使用DataTable对象来存储数据库查询结果,并将其导出为Microsoft Excel文件。这个过程涉及到几个关键的技术点,包括数据操作、...

    实用的DataTable导出Excel

    在.NET开发环境中,DataTable是一种常用的数据结构,它用于存储和操作数据,类似于数据库中的表格。...总的来说,将DataTable导出为Excel是一项常见的需求,掌握这个技能对提升开发效率有很大帮助。

    gridview datatable导出EXCEL

    标题"gridview datatable导出EXCEL"表明我们将探讨如何在C#的WinForm和Web应用程序中实现这个功能。 在描述中提到的公共类,是指一个可复用的代码模块,它可以独立于具体的UI层,负责将GridView与DataTable关联的...

    datatable数据导出excel

    在IT行业中,`DataTable`是一种常见的数据操作对象,尤其在...以上就是关于“datatable数据导出excel”的知识点。了解这些内容后,你可以根据实际项目需求,选择合适的库和方法来实现从`DataTable`到Excel的导出功能。

    导出Excel更新--加入接收DataTable导出Excel

    在原先可以导出控件中的内容及网页内容的基础上增加接收DataTable数据导出Excel

    DataTable导出到Excel

    ### DataTable导出到Excel知识点详解 #### 一、概述 在.NET开发中,经常需要将数据从数据库或其他数据源导出到Excel文件中,以便于用户进行数据分析或存档。本篇文章将详细介绍如何使用C#语言实现从`DataTable`...

    DataTable导出EXCEL

    压缩包中的"关于DataTable导出excel"可能包含了一个简单的示例项目或代码片段,你可以查看并根据实际需求进行调整。如果遇到任何问题,可以参考这些资源或查阅`ClosedXML`的官方文档以获取更多帮助。 通过以上介绍...

    C#使用Datatable导出Excel

    本文实例为大家分享了C#使用Datatable导出Excel的具体代码,供大家参考,具体内容如下 using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Data;...

    Datatable导出excel

    Datatable导出excel

    DataTable导出Excel

    ### DataTable导出至Excel:深度解析与实现细节 在日常工作中,将数据从数据库或内存中的`DataTable`对象导出到Excel文件是一种常见的需求。这种操作不仅能够方便地分享数据,还能利用Excel强大的数据处理能力进行...

    C#导出Excel(DataTable生成Excel)

    本篇将详细介绍如何使用C#结合Aspose.Cells.dll来高效地导出数据表(DataTable)到Excel。 首先,确保已将Aspose.Cells库添加到项目中。这可以通过NuGet包管理器完成,搜索"Aspose.Cells"并安装对应的版本。安装...

    C# Datatable数据Excel导出和行列转换

    ### C# 中 DataTable 数据到 Excel 的导出及行列转换 #### 一、概述 在实际开发过程中,我们经常需要将数据库中的数据导出为 Excel 文件,以便于数据分析或分享给其他人。同时,在某些场景下还需要对数据进行行列...

    WPF DataTable导出Excel

    总结,WPF中将DataTable导出为Excel文件主要是通过Open XML SDK来实现的。这个过程包括创建Excel工作簿、添加工作表、写入表头和数据,最后保存并关闭文件。通过这个功能,用户可以方便地将程序中的数据导出到熟悉的...

    DataTable导出Excel 实例(VB+EXCEL)源码

    将DataTable导出到Excel,能够方便用户进行数据查看、编辑和分析。下面我们将详细讨论如何在VB.NET和C#中实现这个功能。 首先,我们要明白,为了操作Excel文件,我们通常会使用Microsoft.Office.Interop.Excel库,...

Global site tag (gtag.js) - Google Analytics