最近在论坛里又看到很多关于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)的更多相关文章

  1. DataTable导出到Excel

    简单的导出到Excel中: 代码如下: using System; using System.Collections.Generic; using System.Data; using System. ...

  2. [转].net 使用NPOI或MyXls把DataTable导出到Excel

    本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...

  3. DataTable 导出到 Excel 类

    底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...

  4. c# DataTable导出为excel

    /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...

  5. C# datatable 导出到Excel

    datatable导出到Excel /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <pa ...

  6. NPOI使用Datatable导出到Excel

    首先要引用dll 下载地址:http://pan.baidu.com/s/1dFr2m 引入命名空间: using NPOI.HSSF.UserModel;using NPOI.SS.UserMode ...

  7. C# 将datatable导出成Excel

    public void Result( ){try{StringBuilder sql = new StringBuilder();List<SqlParameter> parameter ...

  8. 将DataTable导出为Excel C#

    /// <summary> /// 导出Excel /// </summary> /// <param name="dt">DataTable& ...

  9. 将datatable导出为excel的三种方式(转)

    一.使用Microsoft.Office.Interop.Excel.DLL 需要安装Office 代码如下:  2         public static bool ExportExcel(Sy ...

随机推荐

  1. Java接口中的方法

    接口中可以含有变量和方法.但是,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法 ...

  2. Phonegap之ios对iPhone6和Plus的闪屏适配 -- xmTan

    故事的发生起于,由于老板强烈要求app在iPhone6和5有一样的工具栏,然后前端妹子用@media为iPhone6和Plus做了样式适配.然后问题来了,竟然奇葩的发现@media样式只对iPhone ...

  3. bzoj 1208: [HNOI2004]宠物收养所 set

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Sta ...

  4. 搭建Artifactory集群

    搭建Artifactory集群 制品仓库系统有很多,例如Artifactory.Archiva.Sonatype Nexus.Eclipse Package Drone,其中Artifactory拥有 ...

  5. 数学(欧拉函数):UVAOJ 11426 GCD - Extreme (II)

  6. PHP 基于pdo的数据库操作类

    http://www.php.cn/php-weizijiaocheng-404645.html <?php class Pdodb{   protected $pdo;   protected ...

  7. Python_shutil模块

    import shutil 高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝 shutil.copyfileobj(fsrc,fdst[,length]): 将文件的内容拷贝到另一个文件(可 ...

  8. Docker部署Vue 工程包

    docker部署 Vue 工程包 目录结构 [root@host ~]# tree front/ front/ ├── dist.conf ├── dist.zip ├── Dockerfile └─ ...

  9. [视频]youku与56客户端DLL却持

    [视频]youku与56客户端DLL却持 https://pan.baidu.com/s/1c1ArnOk

  10. Full GC

    1,新生代:(1)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中.(2)保证一 ...