第一步:下载两个需要的NUGET包

1.org.in2bits.MyXls;2.NPOI

第二步:关键类OutExcel。

using System;
using System.Linq;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using NPOI.HSSF.UserModel;
using org.in2bits.MyXls;
using System.IO;
using System.Reflection; namespace OutExcel
{
public enum ExportType
{
[Description("Microsoft Excel|*.xls")]
Excel,
[Description("(*.txt)|*.txt|" + "(*.*)|*.*")]
Txt
}
public class OutExcelXls
{
string sExportName = string.Empty;//导出文件名称
string sSaveFullPath = string.Empty;//导出全路径 string sFloderPath = string.Empty;//导出文件夹路径 const int nExcel2003RowMaxLimit = 65536;
const int nExcel2003ColMaxLimit = 256;
ExportType currentExportType;
public OutExcelXls(string _sExportName)
{
this.sExportName = _sExportName;
}
public OutExcelXls()
{
}
/// <summary>
/// 初始化SaveFileDialog
/// </summary>
/// <param name="_dialogType">SaveFileDialogType【枚举】</param>
/// <returns>{确认导出:True;否则:false}</returns>
public bool InitShowDialog(ExportType _dialogType)
{
SaveFileDialog dlgSave = new SaveFileDialog();
dlgSave.FileName = sExportName;
dlgSave.Filter = EnumOperate.GetDescriptionFromEnumValue(_dialogType);
if (dlgSave.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
currentExportType = _dialogType;
sSaveFullPath = dlgSave.FileName;//C:\Users\Administrator\Desktop\发现LTULFI设备_20130520142107.xls
sFloderPath = sSaveFullPath.Substring(0, sSaveFullPath.LastIndexOf(@"\") + 1);
return true;
}
return false;
}
/// <summary>
/// 导出
/// </summary>
/// <param name="_dtExport">需要导出的Datatable</param>
/// <returns>{导出成功:True;否则:false}</returns>
public bool DoExportWork(DataTable _dtExport)
{
bool _dExportStatus = false;
switch (currentExportType)
{
case ExportType.Excel:
_dExportStatus = true;
ExportToExecel(_dtExport, sExportName);
break;
}
return _dExportStatus;
} /// <summary>
/// 导出
/// </summary>
/// <param name="_dtExport">需要导出的Datatable</param>
/// <returns>{导出成功:True;否则:false}</returns>
public bool DoExportWork(DataTable _dtExport, string titleName, string mx)
{ bool _dExportStatus = false;
switch (currentExportType)
{
case ExportType.Excel:
_dExportStatus = true;
if (string.IsNullOrEmpty(sExportName))
{
sExportName = titleName + DateTime.Now.ToShortDateString() + DateTime.Now.ToFileTime() + ".xls";
}
ExportToExecel(_dtExport, sExportName, titleName, mx);
break;
}
return _dExportStatus;
} /// <summary>
/// 导出为Excel,适合要求不高且数据量不大的数据导出
/// </summary>
/// <param name="_dtExport">需要导出的Datatable</param>
/// <param name="_sSheetName">Excel中SheetName名称</param>
private void ExportToExecel(DataTable _dtExport, string _sSheetName)
{
try
{
int _nTotalRowCnt = _dtExport.Columns.Count;
if (_nTotalRowCnt > nExcel2003RowMaxLimit)
throw new Exception(string.Format("导出异常,不能导出!原因:数据行已经超过:{0}.", nExcel2003RowMaxLimit));
if (_dtExport.Columns.Count > nExcel2003ColMaxLimit)
throw new Exception(string.Format("导出异常,不能导出!原因:数据列已经超过:{0}.", nExcel2003ColMaxLimit)); XlsDocument _xls = new XlsDocument();
_xls.FileName = sExportName; int _nCelIndex = 0;
int _nRowIndex = 0; int page = Convert.ToInt32(Math.Ceiling(_dtExport.Rows.Count / 60000.0)); for (int i = 0; i < page; i++)
{
//Worksheet _sheet = _xls.Workbook.Worksheets.AddNamed(_sSheetName + (i + 1));
Worksheet _sheet = _xls.Workbook.Worksheets.AddNamed("Sheet" + (i + 1));
ColumnInfo _colinfo = new ColumnInfo(_xls, _sheet);
_colinfo.ColumnIndexStart = 0;
_colinfo.ColumnIndexEnd = (ushort)_nTotalRowCnt;
_sheet.AddColumnInfo(_colinfo);
XF _cellXF = _xls.NewXF(); /*
#region 创建单元格样式
//第一种单元格样式
XF xf = xls.NewXF();
xf.HorizontalAlignment = HorizontalAlignments.Centered;
xf.VerticalAlignment = VerticalAlignments.Centered;
xf.Pattern = 1;////设定单元格填充风格。如果设定为0,则是纯色填充
xf.PatternColor = Colors.White;//设定填充线条的颜色
xf.UseBorder = true;
//设置列的上下左右的样式
xf.TopLineStyle = 1;
xf.TopLineColor = Colors.Black;
xf.BottomLineStyle = 1;
xf.BottomLineColor = Colors.Black;
xf.LeftLineStyle = 1;
xf.LeftLineColor = Colors.Black;
xf.RightLineStyle = 1;
xf.RightLineColor = Colors.Black;
xf.Font.Bold = true;
xf.Font.FontName = "仿宋";
xf.Font.Height = 12 * 20;
//自动换行
xf.TextWrapRight = true;
#endregion
*/ _cellXF.VerticalAlignment = VerticalAlignments.Centered;
_cellXF.HorizontalAlignment = HorizontalAlignments.Centered; _nCelIndex = 0;
_nRowIndex = 1;
Cells _cells = _sheet.Cells; foreach (DataColumn col in _dtExport.Columns)
{
_nCelIndex++;
_cells.AddValueCellXF(_nRowIndex, _nCelIndex, col.ColumnName, _cellXF);
}
for (int j = i * 60000; j < _dtExport.Rows.Count; j++)
{
DataRow row = _dtExport.Rows[j];
_nRowIndex++;
_nCelIndex = 0;
if (_nRowIndex > 60000)
{
break;
}
foreach (DataColumn col in _dtExport.Columns)
{
_nCelIndex++;
Cell cell = _cells.AddValueCellXF(_nRowIndex, _nCelIndex, row[col.ColumnName].ToString(), _cellXF);
}
}
} _xls.Save(sFloderPath);
}
catch (Exception ex)
{
throw new Exception(string.Format("导出到Excel失败,原因:{0}", ex.Message.Trim()));
}
} /// <summary>
/// 导出为Excel,适合要求不高且数据量不大的数据导出
/// </summary>
/// <param name="_dtExport">需要导出的Datatable</param>
/// <param name="_sSheetName">Excel中SheetName名称</param>
private void ExportToExecel(DataTable _dtExport, string _sSheetName, string titleName, string mx)
{
try
{
int _nTotalRowCnt = _dtExport.Columns.Count;
if (_nTotalRowCnt > nExcel2003RowMaxLimit)
throw new Exception(string.Format("导出异常,不能导出!原因:数据行已经超过:{0}.", nExcel2003RowMaxLimit));
if (_dtExport.Columns.Count > nExcel2003ColMaxLimit)
throw new Exception(string.Format("导出异常,不能导出!原因:数据列已经超过:{0}.", nExcel2003ColMaxLimit)); XlsDocument _xls = new XlsDocument();
_xls.FileName = sExportName;
Worksheet _sheet = _xls.Workbook.Worksheets.AddNamed(_sSheetName);
ColumnInfo _colinfo = new ColumnInfo(_xls, _sheet);
_colinfo.ColumnIndexStart = 0;
_colinfo.ColumnIndexEnd = (ushort)_nTotalRowCnt;
_sheet.AddColumnInfo(_colinfo);
XF _cellXF = _xls.NewXF();
_cellXF.VerticalAlignment = VerticalAlignments.Centered;
_cellXF.HorizontalAlignment = HorizontalAlignments.Centered;
// _cellXF.Format = StandardFormats.Date_2;//转换为数字类型 int _nCelIndex = 0, _nRowIndex = 3;
Cells _cells = _sheet.Cells; _cells.AddValueCellXF(1, 1, titleName, _cellXF); MergeArea titleArea = new MergeArea(1, 1, 1, _dtExport.Columns.Count); // 一个合并单元格实例(合并第1行、第1列 到 第1行、第4列)
_sheet.AddMergeArea(titleArea); _cells.AddValueCellXF(2, 1, mx, _cellXF);
MergeArea titleArea2 = new MergeArea(2, 2, 1, _dtExport.Columns.Count);
_sheet.AddMergeArea(titleArea2); foreach (DataColumn col in _dtExport.Columns)
{
_nCelIndex++;
_cells.AddValueCellXF(3, _nCelIndex, col.ColumnName, _cellXF);
}
foreach (DataRow row in _dtExport.Rows)
{
_nRowIndex++;
_nCelIndex = 0;
foreach (DataColumn col in _dtExport.Columns)
{
_nCelIndex++;
Cell cell = _cells.AddValueCellXF(_nRowIndex, _nCelIndex, row[col.ColumnName].ToString(), _cellXF);
}
}
_xls.Save(sFloderPath);
}
catch (Exception ex)
{
throw new Exception(string.Format("导出到Excel失败,原因:{0}", ex.Message.Trim()));
}
} /// <summary>
/// 打开文件
/// </summary>
public void OpenFile()
{
Cursor _currentCursor = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
Cursor.Current = _currentCursor;
if (MessageBox.Show("是否打开该个文件吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
System.Diagnostics.Process _process = new System.Diagnostics.Process();
_process.StartInfo.FileName = sSaveFullPath;
_process.StartInfo.Verb = "Open";
_process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
_process.Start();
}
catch (Exception ex)
{
throw new Exception(string.Format("未能打开该文件,原因:{0}", ex.Message.Trim()));
}
}
}
public DataTable ExcelToDataSet(string FilePath, DataTable table)
{
//根据路径通过已存在的excel来创建HSSFWorkbook,即整个excel文档
HSSFWorkbook workbook = new HSSFWorkbook();// new HSSFWorkbook(File.Open(FilePath, FileMode.Open));
try
{
workbook = new HSSFWorkbook(File.Open(FilePath, FileMode.Open));
}
catch
{
workbook = new HSSFWorkbook(File.OpenRead(FilePath));
}
HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0);
//获取excel的第一个sheet //获取Excel的最大行数
int rowsCount = sheet.PhysicalNumberOfRows;
//为保证Table布局与Excel一样,这里应该取所有行中的最大列数(需要遍历整个Sheet)。
//为少一交全Excel遍历,提高性能,我们可以人为把第0行的列数调整至所有行中的最大列数。
int colsCount = sheet.GetRow(0).PhysicalNumberOfCells; for (int h = 0; h < colsCount; h++)
{
table.Columns.Add(sheet.GetRow(0).GetCell(h).ToString(), Type.GetType("System.String"));
} for (int x = 1; x < rowsCount; x++)
{
DataRow dr = table.NewRow();
for (int y = 0; y < colsCount; y++)
{
try
{
dr[y] = sheet.GetRow(x).GetCell(y).ToString();
}
catch
{
dr[y] = "";
}
}
if (!string.IsNullOrEmpty(dr[0].ToString().Trim()))
{
table.Rows.Add(dr);
}
} sheet = null;
workbook = null;
return table;
}
} public static class EnumOperate
{
public static string GetDescriptionFromEnumValue(Enum value)
{
DescriptionAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.SingleOrDefault() as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
} public static T GetEnumValueFromDescription<T>(string description)
{
var type = typeof(T);
if (!type.IsEnum)
throw new ArgumentException();
FieldInfo[] fields = type.GetFields();
var field = fields
.SelectMany(f => f.GetCustomAttributes(
typeof(DescriptionAttribute), false), (
f, a) => new { Field = f, Att = a })
.Where(a => ((DescriptionAttribute)a.Att)
.Description == description).SingleOrDefault();
return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
} }
}

第三步:调用outExcelNew方法传入datatable和导出文件名名称

  public static void outExcelNew(DataTable dt, string name)
{
try
{
string strFileName = name + DateTime.Now.ToString("yyyyMMddHHmmss");
OutExcelXls doExport = new OutExcelXls(strFileName);
ExportType _exportType = ExportType.Excel;
bool isPath = doExport.InitShowDialog(_exportType); if (isPath)
{
object[] datas = new object[3];
DataTable dts = dt;
if (dts != null && dts.Rows.Count > 0)
{
DataTable _dtExportData = dts;
for (int i = 0; i < _dtExportData.Columns.Count; i++)
{
//_dtExportData.Columns[i].ColumnName = dgvData.Columns[i].HeaderText;
} if (_dtExportData != null && _dtExportData.Rows.Count > 0)
{
doExport.DoExportWork(_dtExportData); } MessageBox.Show("【温馨提示】下载完毕!");
}
else
{
MessageBox.Show("【温馨提示】当前无数据!");
}
}
}
catch { }
}

C# 导出datatable数据到excel的更多相关文章

  1. .NET使用Office Open XML导出大量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  2. PHP导出MySQL数据到Excel文件

    PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...

  3. (原创)将Datatable数据按照Excel模板格式导出

    最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...

  4. C#通过OLEDB导出大数据到Excel

    C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...

  5. DataTable数据与Excel表格的相互转换

    using Excel = Microsoft.Office.Interop.Excel; private static Excel.Application m_xlApp = null; /// & ...

  6. 导出数据库数据制成Excel和txt

    引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using Syst ...

  7. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

  8. PHP导出MySQL数据到Excel

    经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CS ...

  9. 导出表格数据到excel并下载(HSSFWorkbook版)

    这里主要前面是通过一个全局变量,在layui的done回调里拿到数据,然后将该数据导出到excel,这里要注意一点,下载excel不能用ajax方式,如果采用ajax下载默认会读取response返回 ...

  10. Vue中使用js-xlsx导出Data数据到Excel

    需要引入的第三方JS有:export.js.xlsx.extendscript.js.xlsx.full.min.js JS太大不贴出来,放一个可下载百度云连接:https://pan.baidu.c ...

随机推荐

  1. STM32 CubeMX 学习:000-搭建开发环境

    背景 了解了 STM32 标准库以后,为了紧跟发展的潮流,我们以 CubeMx为基础 开始进行 Hal(Hardware Abstract Layer, 硬件抽象层)库的学习. CubeMx 是一个 ...

  2. 一文带你深入理解SpringMVC的执行原理

    今天大致来看一下Spring MVC的执行流程是什么样的 执行流程:也就是一个请求是怎么到我们Controller的,返回值是怎么给客户端的 本文分析的问题: 文件上传的请求是怎么处理的 跨域是怎么处 ...

  3. Nuxt3 的生命周期和钩子函数(六)

    title: Nuxt3 的生命周期和钩子函数(六) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:本文深入解析了Nu ...

  4. 全国产!瑞芯微RK3568J/RK3568B2工业核心板规格书

    核心板简介 创龙科技SOM-TL3568是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55全国产工业核心板,每核主频高达1.8GHz/2.0GHz.核心板CP ...

  5. NXP i.MX 8M Mini的视频开发案例分享 (下)

    本文主要介绍i.MX 8M Mini的视频开发案例,包含基于GStreamer的视频采集.编解码.算法处理.显示以及存储案例,GigE工业相机测试说明,H.265视频硬件解码功能演示说明等. 注:本案 ...

  6. 面试题:Linux 系统基础提问 (一)

    Linux系统中如何管理用户和组? Linux系统中用户和组的管理通常包括以下几个方面: 1.创建用户和组: 使用useradd和groupadd命令创建新用户和新组. 2.修改用户和组信息: 使用u ...

  7. yb课堂 视频详情页模块开发《三十八》

    CourseDetail基础模块开发 CourseDetail模块开发,拆分组件 CourseDetail.vue Header.vue Course.vue Tab.vue Summary.vue ...

  8. mac电脑好用的工具总结

    制作gif:https://gfycat.com/gifbrewery 制作gif(超级好用,制作速度快,压缩图片小):https://www.cockos.com/licecap/ 解压工具:htt ...

  9. apache ab.exe压力测试

    ab.exe是一个性能检测工具,是apache server中的一个小组件,使用简单,方便     下载地址:http://files.cnblogs.com/files/gossip/ab.zip ...

  10. [oeasy]python0100_wintel联盟_intel_微软_microsoft_msDOS_基尔代尔

    wintel联盟 回忆上次内容 上次 了解了IBM的 背水一战 IBM 已经不在乎 软硬一体全自主的设计 了 而采用了 开放的架构 任何 硬件厂商和软件厂商 都可以来合作 以丧失 自主控制力的方式 获 ...