在很多系统中都用到导出,使用过多种导出方式,觉得ClosedXML插件的导出简单又方便。

并且ClosedXML、DocumentFormat.OpenXml都是MIT开源。

首先通过 Nuget 安装 ClosedXML 插件,同时会自动安装 DocumentFormat.OpenXml 插件。

以下就是导出相关的代码:

1、MVC控制器中的导出

// MVC 控制器中
/// <summary>
/// 导出 (无论是否需要返回值,都有 Response)
/// </summary>
public void Export1() // 传入搜索条件
{
// 1、根据条件查询到想要的数据
DataTable data = new DataTable();
// 2、设置表名(对应sheet名)、列名(对应列名)
data.TableName = "XX统计";
// 3、列宽设置(需要慢慢设置)
int[] colsWidth = new int[] { , , , };
// 4、生成导出文件
byte[] filedata = ExportHelper.ExportExcel(data);
// 5、输出文件流
HttpContext.Output(filedata, "XX统计_导出" + DateTime.Today.ShowDate() + ".xlsx");
}

2、生成导出文件

using ClosedXML.Excel;
using System.Data;
using System.IO; /// <summary>
/// 导出Excel文件
/// </summary>
/// <param name="data">导出的数据</param>
/// <param name="colsWidth">列宽</param>
/// <returns></returns>
public static byte[] ExportExcel(DataTable data, int[] colsWidth = null)
{
using (XLWorkbook workbook = new XLWorkbook())
{
IXLWorksheet worksheet = workbook.AddWorksheet(data.TableName); // 处理列
for (int i = ; i < data.Columns.Count; i++)
{
worksheet.Cell(, i + ).Value = data.Columns[i].ColumnName;
worksheet.Cell(, i + ).Style.Font.Bold = true;
} // 处理列宽
if (colsWidth != null)
{
for (int j = ; j <= colsWidth.Length; j++)
{
worksheet.Columns(j, j).Width = colsWidth[j - ];
}
} // 处理数据
int r = ;// 第二行开始
foreach (DataRow dr in data.Rows)
{
// 第一列开始
for (int c = ; c <= data.Columns.Count; c++)
{
worksheet.Cell(r, c).Value = dr[c-1].ToString();
}
r++;
} // 缓存到内存流,然后返回
using (MemoryStream stream = new MemoryStream())
{
workbook.SaveAs(stream);
return stream.ToArray();
}
}
}

3、输出文件流

using System.Text;
using System.Text.RegularExpressions;
using System.Web; /// <summary>
/// 输出文件流
/// </summary>
/// <param name="httpContext">Http上下文</param>
/// <param name="filedata">文件数据</param>
/// <param name="fileName">文件名(要后缀名)</param>
public static void Output(this HttpContextBase httpContext, byte[] filedata, string fileName)
{
//文件名称效验 文件名不能包含\/:*?<>| 其中\需要两次转义
if (Regex.IsMatch(fileName, @"[\\/:*?<>|]"))
{
fileName = Regex.Replace(fileName, @"[\\/:*?<>|]", "_");
} //判断是否为火狐浏览器(下载时,有些浏览器中文名称乱码,有些浏览器中文名正常,但不能编码,不会自动解码,如火狐)
if (httpContext.Request.Browser.Browser != "Firefox")
{
fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
} // 没有定义类型,用二进制流类型的MIME
string MIME = "application/octet-stream";
httpContext.Response.Clear();
httpContext.Response.Buffer = true; //该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
httpContext.Response.ContentType = MIME;
httpContext.Response.ContentEncoding = Encoding.UTF8;
httpContext.Response.Charset = Encoding.UTF8.HeaderName;
httpContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
httpContext.Response.AddHeader("Accept-Language", "zh-cn");
httpContext.Response.AddHeader("Content-Length", filedata.LongLength.ToString());
httpContext.Response.BinaryWrite(filedata);
httpContext.Response.Flush();
httpContext.Response.End();
}

通过ClosedXML导出操作方便。

ClosedXML、DocumentFormat.OpenXml导出DataTable到Excel的更多相关文章

  1. 简洁的导出 datatable到excel,不用组件

    简洁的导出 datatable到excel var lines = new List<string>(); string[] columnNames = dataTable.Columns ...

  2. .Net Core使用OpenXML导出,导入Excel

    导出Excel是程序很常用到的功能,.Net Core可以借助Open-XML-SDK来导出Excel. Open-XML-SDK open-xml-sdk是是微软开源的项目.Open XML SDK ...

  3. 使用NPOI导出DataTable到Excel

    使用C#对DataTable导出到Excel是我们工作当中比较多用到的场景,微软提供了Microsoft.Office.Interop.Excel组件可以进行操作,但是该组件在数据量大的时候速度很慢, ...

  4. ashx导出dataTable为Excel

    一,datatable导出Excel,用户可以选择路径,方法如下: /// <summary> /// DataTable导出到Excel /// </summary> /// ...

  5. C# 基于DocumentFormat.OpenXml的数据导出到Excel

    using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.S ...

  6. csharp: Export DataTable to Excel using OpenXml 2.5 in asp.net

    //https://www.microsoft.com/en-us/download/details.aspx?id=5124 Open XML SDK 2.0 for Microsoft Offic ...

  7. NPOI通过DataTable导出和读取Excel

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...

  8. 从DataTable高效率导出数据到Excel

    首先从数据库读取数据到DataTable,这我就不提了,大家都明白.下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下: using Microsoft.Office.I ...

  9. DocumentFormat.OpenXml read excel file

    这里向大家介绍一种读取excel 数据的方法,用的是DoucmentFormat.OpenXml.dll 废话不多说,向大家展示一下在项目中处理过的方法,如果有任何疑问,随时联系我. using Do ...

随机推荐

  1. D语言-随机数游戏

    由于不会D语言的随机数,干脆core.stdc.stdlib调用stdlib.h 这里mark一下,类型转换是cast(D语言类型) NULL不能用,要用null import std.stdio; ...

  2. Jmeter——使用JSR223元件实现RSA登录加密

    一.RSA加密简介 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私 ...

  3. ASP.NET Core 借助 Helm 部署应用至K8S

    前言 玩K8S也有一段时间了,借助云服务提供商的K8S控制台,已经可以很方便的快速部署应用至K8S.通过简单的点击,可以一次性帮忙创建K8S 对象:Deployment.Service.Ingress ...

  4. nginx单个ip访问频率限制

    一.限制所有单个ip的访问频率 1.http中的配置 http { #$limit_conn_zone:限制并发连接数 limit_conn_zone $binary_remote_addr zone ...

  5. 使用Unicode(宽字节字符集);多字节字符集中定义宽字节变量

    2012-03-25 14:54 (分类:计算机程序) 2.2 宽字符和C 宽字符不一定是Unicode.Unicode是宽字符集的一种.然而,因为本书的焦点是Windows而不是C执行的理论,所以书 ...

  6. Android中实现自定义View组件并使其能跟随鼠标移动

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建An ...

  7. Linux中screen命令

    screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本.它提 ...

  8. ​Microchip SPI串行SRAM和NVSRAM器件

    Microchip的SRAM和NVSRAM系列(SPI串行SRAM和NVSRAM设备)提供了一种轻松添加外部RAM的方式,且具有以下特性功能 特性低功耗CMOS技术:4μA最大待机电流 标准4引脚SP ...

  9. Linux学习Day2:安装RedHat Linux和新手必须掌握的命令

    今天是Linux线上培训的第二天,主要是Linux环境的安装和几个常见命令的学习,具体如下: 一.RHEL7系统的安装 首先是VMware WorkStation 12.0软件的安装,然后是RHEL7 ...

  10. SDRAM的引脚封装标准

    SDRAM从发展到现在已经经历了五代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM,第五代DDR4 SDRAM.第一代SDRAM采 ...