ClosedXML、DocumentFormat.OpenXml导出DataTable到Excel
在很多系统中都用到导出,使用过多种导出方式,觉得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的更多相关文章
- 简洁的导出 datatable到excel,不用组件
简洁的导出 datatable到excel var lines = new List<string>(); string[] columnNames = dataTable.Columns ...
- .Net Core使用OpenXML导出,导入Excel
导出Excel是程序很常用到的功能,.Net Core可以借助Open-XML-SDK来导出Excel. Open-XML-SDK open-xml-sdk是是微软开源的项目.Open XML SDK ...
- 使用NPOI导出DataTable到Excel
使用C#对DataTable导出到Excel是我们工作当中比较多用到的场景,微软提供了Microsoft.Office.Interop.Excel组件可以进行操作,但是该组件在数据量大的时候速度很慢, ...
- ashx导出dataTable为Excel
一,datatable导出Excel,用户可以选择路径,方法如下: /// <summary> /// DataTable导出到Excel /// </summary> /// ...
- C# 基于DocumentFormat.OpenXml的数据导出到Excel
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.S ...
- 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 ...
- NPOI通过DataTable导出和读取Excel
Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...
- 从DataTable高效率导出数据到Excel
首先从数据库读取数据到DataTable,这我就不提了,大家都明白.下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下: using Microsoft.Office.I ...
- DocumentFormat.OpenXml read excel file
这里向大家介绍一种读取excel 数据的方法,用的是DoucmentFormat.OpenXml.dll 废话不多说,向大家展示一下在项目中处理过的方法,如果有任何疑问,随时联系我. using Do ...
随机推荐
- Ansible:roles初始化系统
简介 本文介绍ansible的roles,通过roles来实现系统的初始化,其相当于将ansible的playbook拆分.本文通过Jenkins,传参,调用playbook来初始化系统. Githu ...
- python练习——第0题
原GitHub地址:https://github.com/Yixiaohan/show-me-the-code 题目:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种 ...
- Python3(九) 闭包
一. 一切皆对象 函数式编程并没有标准定义,如果代码非常繁琐则考虑使用. 学习闭包的概念,不是python独有的. 其他大多数语言中的函数只是一段可执行的代码,并不是对象. python中的函数是对象 ...
- 04-Spring01-IOC
今日知识 1. Spring IOC控制反转(Inverse of control) 2. Spring DI依赖注入(Dependency Injection ) Spring 1. 概念:简单来说 ...
- 在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据
百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路 ...
- SELinux 和 iptables 开启关闭
SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统.对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MA ...
- 【问题】多重继承时,super函数只初始化继承的第一个类,不初始化第二个类。
class A(object): def __init__(self): print("init class A") class B(object): def __init__(s ...
- vue垂死挣扎系列(一)——vue-cli快速搭建
项目安装(windows10安装环境+vue-cli 2.x) 安装node 在官网上下载稳定版本的node node.js官网 一路傻瓜安装 测试是否安装成功 cmd中node --version ...
- JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案
JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案
- Leetcode字典树-720:词典中最长的单词
第一次做leetcode的题目,虽然做的是水题,但是菜鸟太菜,刚刚入门,这里记录一些基本的知识点.大佬看见请直接路过. https://leetcode-cn.com/problems/longest ...