在很多系统中都用到导出,使用过多种导出方式,觉得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. CCF_ 201509-2_日期计算

    水. #include<iostream> #include<cstdio> using namespace std; ] = {{,,,,,,,,,,,,},{,,,,,,, ...

  2. 未来图书-需求分析——脑机接口、VR、AI推荐系统

    个人比较喜欢科幻作品,也常常畅想未来.. "书"作为几千年来人类文明信息载体,必然会不断演变.. 文荟宿舍墙上贴着Elon Musk的海报,向往像他一样能够在有限的生命中用极致的想 ...

  3. 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...

  4. 【译文连载】 理解Istio服务网格(第二章 安装)

    全书目录 第一章 概述 本文目录 1.命令行工具安装 2. Kubernetes/OpenShift安装 3. Istio安装 4.示例Java微服务安装 4.1 源码概览 4.2 编译和部署cust ...

  5. Go语言实现:【剑指offer】数字在排序数组中出现的次数

    该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...

  6. js引入,js变量和运算符等

    页面级的js不管写在页面的哪里都可以 企业项目开发要求:结构(html),样式(css),行为(js)相分离 不要既写外部js,又写内部js:如果两个都写,则外部js生效 声明多个变量时,每个变量之间 ...

  7. 跨域的两种解决方法jsonp和CORS

    1.跨域 什么是跨域? 当你请求的url是不同源的数据的时候,浏览器一般会抛出请求跨域的错误,如下图: 造成跨域的原因? 即你违反了浏览器的同源策略的限制=>阻止一个域的js脚本和另外一个域的内 ...

  8. python yml 文件处理

    安装 pip install pyyaml import yaml import io s = {'host': {'ip00': '10.0.0.1', 'ip01': {'one': '10.0. ...

  9. php 安装扩展插件实例-gd库

    今天给php 安装一个扩展插件 gd库   一.gd库是什么 gd库是一个开源的图像处理库,它通过提供一系列用来处理图片的API,使其可以用来创建图表.图形.缩略图以及其他图像的处理操作. gd库支持 ...

  10. [CentOS7 mini]Linux命令补全 yum install bash-completion

    CentOS7 mini默认不带命令补全需要自行安装 使用国内yum清华源 安装完后退出当前窗口再登录生效 # yum install -y bash-completion 已加载插件:fastest ...