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 ...
随机推荐
- Windows/Linux 通过 ssh 打开 远程服务器 GUI程序
背景 在 Windows + ssh(Cygwin) + Linux(运行在虚拟机中的Ubuntu) 是一个很舒服的方案,但是偶尔需要用到 图形界面. 如果需要通过ssh打开远程服务器端的程序,需要X ...
- (Java)常用类库
Spring 常用工具类 Spring作为常用的开发框架,在Spring框架应用中,排在ApacheCommon.Guava.Huool等通用库后,第二优先级可以考虑使用Spring-core-xxx ...
- c语言生成随机数
记录示例,留作自用 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) ...
- mac idea 更换主题
使用 主题一 xcode-dark-theme:点我直达 主题二 one-dark-theme:点我直达 主题三 dark-purple-theme:点我直达 主题四(推荐) vuesion-them ...
- JVM是如何创建一个对象的?
哈喽,大家好,我是世杰. 本文我为大家介绍面试官经常考察的「Java对象创建流程」 照例在开头留一些面试考察内容~~ 面试连环call Java对象创建的流程是什么样? JVM执行new关键字时都有哪 ...
- C#事件总结
前言:C#的事件也是一项非常关键的技术,必须要深刻的理解,本质上是基于委托的: 事件模型的五个组成部分: 1.事件的拥有者-- event source,对象: 2.事件的成员--event,成员: ...
- IDEA之调试或运行的小助手日志插件Grep Console:不同颜色区分,查看日志看方便【工欲善其事必先利其器】
简介 Grep Console是一款方便开发者对idea控制台输出日志进行个性化管理的插件.这个插件还是很用的,在满屏的日志中,迅速找到自己关注的内容,调试程序的绝佳工具. 功能特性 Grep Con ...
- 基于树莓派的OpenWrt系统打开蓝牙功能
在树莓派设备上的OpenWrt系统打开蓝牙功能 1. 安装必要的软件包 首先,你需要确保OpenWrt系统上安装了必要的蓝牙软件包.你可以通过OpenWrt的包管理器来安装它们.在OpenWrt系统上 ...
- java中的Context
在java编程中,上下文(Context)是指程序运行时的环境和状态的集合.包括了类对象变量方法等运行时的相关数据 在类中,我们可以通过this获取当前类的变量.方法的上下文, 例如getset方法: ...
- mybatisplus轻松完成一次模糊+分页查询
之前一直用mybatis+pageinfo完成模糊+分页查询,还需要手写sql语句,之前一直没做尝试,今天试了试mybatisplus一个人完成模糊+分页,挺简单的 有一个小插曲是,我的前端接受的da ...