第一步:下载两个需要的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. 为ssh服务器添加2fa认证,一个python脚本全搞定

    服务器ssh如果被别人登陆就是一场灾难,所以我研究了ssh认证,我发现Google Authenticator PAM可以实现ssh的2fa认证,但是安装和配置比较麻烦.因此我用python实现了ss ...

  3. 抓取豆瓣电影TOP250标题-年份-评分-评分人数

    import csv import re import requests headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; ...

  4. 『vulnhub系列』Deathnote-1

    『vulnhub系列』Deathnote-1 下载地址: https://www.vulnhub.com/entry/deathnote-1,739/ 信息搜集: 使用nmap扫描存活主机,发现主机开 ...

  5. ARM+DSP!全志T113-i+玄铁HiFi4开发板硬件说明书(1)

    前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板.由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感 ...

  6. ARC108C

    考虑一颗树怎么染色. 每个子节点染成边的颜色,如果与父亲节点相同,就随便染色(这条边的限制已经被父亲节点满足). 那么一定可以染色. 所以把原图跑最小生成树再按上述方法染色即可. 倘若原图不连通,那么 ...

  7. springboot实现异步调用demo

    springboot实现异步调用 异步调用特点 异步调用在开发程序中被广泛应用,在异步任务中,主线程不需要阻塞等待异步任务的完成,而是可以继续处理其他请求. 异步调用的特点如下: 非阻塞:主线程在调用 ...

  8. 四 黑马程序员-java面向对象(上)

    一.:面向对象 (1)面向对象:是基于面向过程的一种思想. 面向过程:以函数为基础,关注实现过程. 面向对象:以对象为基础,关注实现结果. (2)面向对象的思想特点: A:是一种更符合人们思考习惯的思 ...

  9. CentOS之yum安装JDK

    1.查看云端目前支持安装的jdk版本 [root@localhost ~]# yum search java|grep jdk ldapjdk-javadoc.noarch : Javadoc for ...

  10. docker 6.1测试

    https://www.cnblogs.com/xiugeng/p/10193333.html#_label1 1.设置重启策略 [root@docker ~]# cat /etc/docker/da ...