DataTable导出到Excel(.NET 4.0)
最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample。这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不过文件是有特殊格式的Excel,因此不能像一般的文本文件处理。另外,还有一种叫CSV的文件(用逗号分隔的文件,扩展名为.csv),因为默认用Excel打开的,网友也往往把这种文件误当做Excel文件。其实一个通过Excel COM对象作成Excel文件,一个通过一般的IO处理,他们的作成过程是完全不一样的。
先来看看Sample的结构: Form_Load的时候读取DB,绑定到DataGridView。按下"Data2Excel"按钮导出Excel文件(*.xls文件), 按下”Data2CSV”按钮导出CSV文件(*.csv文件)

其实CSV文件用文本文件可以直接打开,看下图,就是逗号分隔的文件,直接通过StringBuilder构造每一行字符串,最后通过System.IO.File.WriteAllText就可以了。

而关于Excel的操作,有两种方式,一种通过Cell一个一个单元格赋值,还有一种通过系统剪切板通过粘贴的方式赋值。因为跨托管域赋值,第一种赋值方式效率很低,原因嘛,可以看看这里:《.NET操作Excel COM对象》。所以Sample里选择了第二种方式。
另外,.NET 4.0里C#终于可以用上像VB.NET的可选参数了 T_T 真是省不少事啊,以前C#操作Excel都要写上很多System.Reflection.Missing.Value呢。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
namespace DataExportLib
{
/// <summary>
/// 数据导出工具类
/// 前提:Microsoft Office 11.0 Object Library
/// .NET Framework 4.0
/// </summary>
public class DataExportUtils
{
public static void Export2Xls(DataTable data, string filename, bool exportHeader = true)
{
if (System.IO.File.Exists(filename))
System.IO.File.Delete(filename);
Excel._Application xlsApp = null;
Excel._Workbook xlsBook = null;
Excel._Worksheet xstSheet = null;
try
{
xlsApp = new Excel.ApplicationClass();
xlsBook = xlsApp.Workbooks.Add();
xstSheet = (Excel._Worksheet)xlsBook.Worksheets[1];
var buffer = new StringBuilder();
if (exportHeader)
{
// Excel中列与列之间按照Tab隔开
foreach (DataColumn col in data.Columns)
buffer.Append(col.ColumnName + "/t");
buffer.AppendLine();
}
foreach (DataRow row in data.Rows)
{
foreach (DataColumn col in data.Columns)
buffer.Append(row[col].ToString() + "/t");
buffer.AppendLine();
}
System.Windows.Forms.Clipboard.SetDataObject("");
// 放入剪切板
System.Windows.Forms.Clipboard.SetDataObject(buffer.ToString());
var range = (Excel.Range)xstSheet.Cells[1, 1];
range.Select();
xstSheet.Paste();
// 清空剪切板
System.Windows.Forms.Clipboard.SetDataObject("");
xlsBook.SaveAs(filename);
}
finally
{
if (xlsBook != null)
xlsBook.Close();
if (xlsApp != null)
xlsApp.Quit();
// finally里清空Com对象
Marshal.ReleaseComObject(xlsApp);
Marshal.ReleaseComObject(xlsBook);
Marshal.ReleaseComObject(xstSheet);
xstSheet = null;
xlsBook = null;
xlsApp = null;
}
}
public static void Export2CSV(DataTable data, string filename, bool exportHeader = true)
{
if (File.Exists(filename))
File.Delete(filename);
var buffer = new StringBuilder();
if (exportHeader)
{
for (var i = 0; i < data.Columns.Count; i++)
{
buffer.AppendFormat("/"{0}/"", data.Columns[i].ColumnName);
if (i < data.Columns.Count - 1)
buffer.Append(",");
}
buffer.AppendLine();
}
for (var i = 0; i < data.Rows.Count; i++)
{
for (var j = 0; j < data.Columns.Count; j++)
{
buffer.AppendFormat("/"{0}/"", data.Rows[i][j].ToString());
if (j < data.Columns.Count - 1)
buffer.Append(",");
}
buffer.AppendLine();
}
File.WriteAllText(filename, buffer.ToString(), Encoding.Default);
}
public static void Export2Xls<T>(List<T> data, string filename, bool exportHeader = true)
{
if (File.Exists(filename))
File.Delete(filename);
Excel._Application xlsApp = null;
Excel._Workbook xlsBook = null;
Excel._Worksheet xstSheet = null;
var type = typeof(T);
var properties = type.GetProperties();
var buffer = new StringBuilder();
if (exportHeader)
{
xlsApp = new Excel.ApplicationClass();
xlsBook = xlsApp.Workbooks.Add();
xstSheet = (Excel._Worksheet)xlsBook.Worksheets[1];
if (exportHeader)
{
foreach (var property in properties)
buffer.Append(property.Name + "/t");
buffer.AppendLine();
}
foreach (var row in data)
{
foreach (var property in properties)
buffer.Append(property.GetValue(row, null) + "/t");
buffer.AppendLine();
}
System.Windows.Forms.Clipboard.SetDataObject("");
// 放入剪切板
System.Windows.Forms.Clipboard.SetDataObject(buffer.ToString());
var range = (Excel.Range)xstSheet.Cells[1, 1];
range.Select();
xstSheet.Paste();
// 清空剪切板
System.Windows.Forms.Clipboard.SetDataObject("");
xlsBook.SaveAs(filename);
}
}
public static void Export2CSV<T>(List<T> data, string filename, bool exportHeader = true)
{
if (File.Exists(filename))
File.Delete(filename);
var type = typeof(T);
var properties = type.GetProperties();
var buffer = new StringBuilder();
if (exportHeader)
{
for (var i = 0; i < properties.Length; i++)
{
buffer.AppendFormat("/"{0}/"", properties[i].Name);
if (i < properties.Length - 1)
buffer.Append(",");
}
buffer.AppendLine();
}
for (var i = 0; i < data.Count; i++)
{
for (var j = 0; j < properties.Length; j++)
{
buffer.AppendFormat("/"{0}/"", properties[j].GetValue(data[i], null).ToString());
if (j < properties.Length - 1)
buffer.Append(",");
}
buffer.AppendLine();
}
File.WriteAllText(filename, buffer.ToString());
}
}
}
转自:http://blog.csdn.net/fangxing80/article/details/6099621
DataTable导出到Excel(.NET 4.0)的更多相关文章
- DataTable导出到Excel
简单的导出到Excel中: 代码如下: using System; using System.Collections.Generic; using System.Data; using System. ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- DataTable 导出到 Excel 类
底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...
- c# DataTable导出为excel
/// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...
- C# datatable 导出到Excel
datatable导出到Excel /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <pa ...
- NPOI使用Datatable导出到Excel
首先要引用dll 下载地址:http://pan.baidu.com/s/1dFr2m 引入命名空间: using NPOI.HSSF.UserModel;using NPOI.SS.UserMode ...
- C# 将datatable导出成Excel
public void Result( ){try{StringBuilder sql = new StringBuilder();List<SqlParameter> parameter ...
- csv/json/list/datatable导出为excel的通用模块设计
导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...
- 将DataTable导出为Excel C#
/// <summary> /// 导出Excel /// </summary> /// <param name="dt">DataTable& ...
随机推荐
- NFS网络文件共享服务
NFS-网络文件系统,它的主要功能是通过网络让不同的主机系统之间可以彼此共享文件或目录. NFS在企业中得应用场景 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频.图片.附件等静 ...
- C++中delete和delete[]的区别
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又 ...
- 拓展,Fibonacci螺旋
#该程序由023递归这课中的fibonacci数列递归写法修改而成 #在写的过程中发现,如果要正确引导用户的每一次输入,写的代码比主程序还要多 #当然,为了使程序在用户交互过程中显得更加友好,提供错误 ...
- WPF后台更换背景图-Background
Uri uri = new Uri("Images/BACK.gif", UriKind.Relative);BitmapImage bimg = new BitmapImage( ...
- 【BZOJ 2654】tree
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- 淘宝自己的前端框架KISSY(类似jquery) - 简易指南
KISSY 是由阿里集团前端工程师们发起创建的一个开源 JS 框架. 具备模块化.高扩展性.组件齐全,接口一致.自主开发.适合多种应用场景等特性. 在以下方面具有一定优势: A.拥有大量的中文文档: ...
- (转)为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val
网址:http://blog.csdn.net/glorin/article/details/6327083 memsetup:mov r1, #MEM_CTL_BASEadrl r2,mem_cfg ...
- Linux学习笔记(4)-文本编辑器vi的使用
vi的三种编辑模式 命令模式(Command mode) 在此模式下可以控制光标的移动,可以删除字符,删除行,还可以对某个段落进行复制和移动 输入模式(Insert mode) 只有在此模式下,可以输 ...
- 5.2:缓存中获取单例bean
5.2 缓存中获取单例bean 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了.前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例 ...
- 【转链接】Handlebars模板引擎以及浅谈模板引擎的实现原理
什么叫做“模板引擎“?我是这么理解的:就是对一些待填入数据的占位符的解析.如果你使用过Python的django框架,那你肯定是模板一点也不陌生.模板引擎就是解析模板的,把后端数据塞到前端页面模板. ...