C# 导出datatable数据到excel
第一步:下载两个需要的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的更多相关文章
- .NET使用Office Open XML导出大量数据到 Excel
我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...
- PHP导出MySQL数据到Excel文件
PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...
- (原创)将Datatable数据按照Excel模板格式导出
最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...
- C#通过OLEDB导出大数据到Excel
C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...
- DataTable数据与Excel表格的相互转换
using Excel = Microsoft.Office.Interop.Excel; private static Excel.Application m_xlApp = null; /// & ...
- 导出数据库数据制成Excel和txt
引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using Syst ...
- java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...
- PHP导出MySQL数据到Excel
经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CS ...
- 导出表格数据到excel并下载(HSSFWorkbook版)
这里主要前面是通过一个全局变量,在layui的done回调里拿到数据,然后将该数据导出到excel,这里要注意一点,下载excel不能用ajax方式,如果采用ajax下载默认会读取response返回 ...
- Vue中使用js-xlsx导出Data数据到Excel
需要引入的第三方JS有:export.js.xlsx.extendscript.js.xlsx.full.min.js JS太大不贴出来,放一个可下载百度云连接:https://pan.baidu.c ...
随机推荐
- 【资料分享】全志科技T507工业核心板硬件说明书(下)
目 录 3 电气特性 3.1 工作环境 3.2 功耗测试 3.3 热成像图 4 机械尺寸 5 底板设计注意事项 5.1 最小系统设计 5.1.1 电源设计说明 5.1.2 系统启动配置 5.1. ...
- 嵌入式进阶之关于SPI通信的案例分享——基于全志科技T3与Xilinx Spartan-6处理器
本文主要介绍基于全志科技T3与Xilinx Spartan-6的通信案例. 适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境 ...
- 手把手带你使用JWT实现单点登录
JWT(英文全名:JSON Web Token)是目前最流行的跨域身份验证解决方案之一,今天我们一起来揭开它神秘的面纱! 一.故事起源 说起 JWT,我们先来谈一谈基于传统session认证的方案以及 ...
- RK3588开发笔记(四):基于定制的RK3588一体主板升级镜像
前言 方案商定制的主板,加入了360°环视算法功能,涉及到了一些库的添加,重新制作了依赖库的镜像,镜像更新的原来的板子上. 定制的板子 升级接口type-c 设计接口是type-c, ...
- 2 手机号登录时,调的不是login接口,而是注册的一个接口
手机号登录时,调的不是login接口,而是注册的一个接口
- vb.net 实现excel导入的时候滚动显示导入的数据
如果你想在 Excel 导入过程中滚动显示导入的数据,可以使用逐行读取 Excel 数据并在滚动窗口中显示. 在 VB.NET 中,你可以使用 Excel.Range 对象逐行读取 Excel 数据, ...
- 2023 NOIP 游记
\(\text{Day -INF}\) 提高 \(135\) 卡线进 \(\text{NOIP}\). 集训两天成绩:\(50 \to 135\). \(\text{Day 1}\) 开赛 \(13\ ...
- 【摘译+整理】System.IO.Ports.SerialPort使用注意
远古的一篇博客,内容散落于博文和评论 https://sparxeng.com/blog/software/must-use-net-system-io-ports-serialport C# 和 . ...
- 暑假java自学进度总结03
一.今日所学: 1.标识符命名规则: 必须: 1>由数字,字母,下划线,美元符组成: 2>不能以数字开头: 3>不能是关键字: 4>区分大小写: 建议: 1>命名方法,变 ...
- ssh 转发 和 切换图形化
适用环境 宿主机连接到一台服务器是,服务器系统里面的浏览器点击http网页卡顿,那么这时可以通过ssh将端口转发到宿主机 使用宿主机的浏览器点击,则不会很卡顿. [root@foundation1 ~ ...