C#中的DateTable类与数据导出

文本介绍了DataTable类的基本应用,以及如何将DataTable对象中的数据导出为CSV、HTML表格、HTML列表和JSON格式。

DataTable类

DateTable类定义在System.Data命名空间,表示为二维数据表形式的对象,下面介绍读取对象数据的一些常用的操作。

Columns属性,定义为列的集合(DataColumnCollection类型),可以使用Count属性获取列的数量;使用数值或列名索引获取某一列的对象(DataColumn类型);使用Contains(name)方法检查列是否存在,参数name为列名。获取列对象后,可以使用ColumnName属性获取列名,使用SetOrdinal(index)方法移动列到参数index指定的索引位置。

Rows属性,定义为行的集合(DataRowCollection类型),可以使用Count属性获取数据行的数量;可以使用数值索引获取某一行的对象(DataRow类型)。获取行对象后,可以使用数值或列名索引获取当前行中对应列的数据。

下面介绍如何将DataTable中的数据转换为CSV、HTML表格、HTML列表和JSON格式,这些格式有一个共同的特点,它们都是基于文本的格式化数据。

DataTable数据转换为CSV格式

CSV(Comma-Separated Value,逗号分隔值)是一种比较简单的格式化文本数据格式,一般来说,第一行为列名,如果不需要也可以没有;然后,每一行就是一条数据记录;行中的列名和数据项可以使用逗号(,)、水平制表符(\t)等字符分隔;列名和数据项可以使用直接量,也可以使用符号进行闭合定义,如使用一对双引号定义。

下面的代码(cfx/data/tDataHelper.cs)会在tDataHelper类中定义ToCsv()方法,其功能是将DataTable对象的数据转换为CSV格式的字符串。

C#
using System;
using System.Text;
using System.Data;

namespace cfx.data
{
    public static class tDataHelper
    {
        // 将DataTable数据转换为CSV格式数据
        // 参数:数据,是否显示列名,数据分隔符,数据项定义符
        public static string ToCsv(DataTable data, bool showColName = true,
            string delimiter = ",", string enclosure = "")
        {
            if (data == null || data.Columns.Count == 0 ||
                data.Rows.Count == 0) return "";
            //
            StringBuilder sb =
                new StringBuilder(data.Columns.Count * data.Rows.Count * 16);
            // 标题行
            if (showColName)
            {
                sb.AppendFormat("{0}{1}{0}",
                    enclosure, data.Columns[0].ColumnName);
                for (int col = 1; col < data.Columns.Count; col++)
                {
                    sb.AppendFormat("{0}{1}{2}{1}",
                        delimiter, enclosure, data.Columns[col].ColumnName);
                }
                sb.Append(Environment.NewLine);
            }
            // 数据行
            for (int row = 0; row < data.Rows.Count; row++)
            {
                sb.AppendFormat("{0}{1}{0}",
                    enclosure, data.Rows[row][0]);
                for (int col = 1; col < data.Columns.Count; col++)
                {
                    sb.AppendFormat("{0}{1}{2}{1}",
                        delimiter, enclosure, data.Rows[row][col]);
                }
                sb.Append(Environment.NewLine);
            }
            //
            return sb.ToString();
        }
    }
}

代码中,ToCsv()方法的参数包括:

  • data,DataTable类型,定义需要转换的数据对象。
  • showColName,bool类型,定义是否显示列名,默认为true。
  • delimiter,string类型,定义列名和数据项的分隔符,默认为逗号(,),谁让它叫逗号分隔值呢^^。
  • enclosure,string类型,定义列名和数据项的闭合符号,默认为空,即直接使用列名和数据字面量。

ToCsv()方法中,首先对data参数是否包含数据进行了检查,然后通过数据量定义了sb对象的初始尺寸。接下来,根据showColName参数确定是否显示列名,最后显示每行数据并返回组合完成的字符串,其中,需要注意分隔符与闭合符号的应用。

下面的代码,在Program.cs文件中测试tDataHelper.ToCsv()方法的应用。

C#
using System;
using System.Data;
using cfx;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = @"select recid,f1,f2,f3,f4 from t1";
            DataTable data = tApp.DbJet.GetTable(sql);
            string s = tDataHelper.ToCsv(data);
            Console.WriteLine(CFile.WriteAllText(@"d:\t1.csv", s));
        }
    }
}

代码中使用的tApp.DbJet字段定义为tDbJet接口组件,其实现可以参考前一篇文章。执行代码会将t1表中的数据转换为CSV格式,并保存到s变量中;然后,将s变量的内容保存到d:\t1.csv文件;正确执行后会显示True。可以通过记事本打开导出的文件,数据格式类似下图所示。

导出CSV格式数据

下面的代码会使用双引号定义列名和数据项。

C#
using System;
using System.Data;
using cfx;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = @"select recid,f1,f2,f3,f4 from t1";
            DataTable data = tApp.DbJet.GetTable(sql);
            string s = tDataHelper.ToCsv(data,true,",","\"");
            Console.WriteLine(CFile.WriteAllText(@"d:\t1.csv", s));
        }
    }
}

导出的CSV数据格式如下图所示。

导出双引号定义的列名和数据项

以上格式的CSV数据转换为Excel数据时需要使用Excel的数据导入功能,具体的操作可以参考《导入CSV数据、提取和转置》,网址如下:

http://caohuayu.com/article/Article.aspx?id=a251012

此外,使用水平制表符(\t)分隔列名和数据项的CSV数据可以直接粘贴到Excel工作表中,如下面的代码。

C#
using System;
using System.Data;
using cfx;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = @"select recid,f1,f2,f3,f4 from t1";
            DataTable data = tApp.DbJet.GetTable(sql);
            string s = tDataHelper.ToCsv(data,true,"\t");
            Console.WriteLine(CFile.WriteAllText(@"d:\t1.csv", s));
        }
    }
}

下图显示了导出的CSV数据和粘贴到Excel工作表的效果。

水平制表符分隔格式

DataTable数据转换为HTML表格

Web项目中(如ASP.NET项目),经常需要将数据转换HTML格式,下面的代码(cfx/data/tDataHelper.cs),会在tDataHelper类中创建ToHtmlTable()方法,其功能是将DataTable对象中的数据转换为HTML中的表格(table)元素代码。

C#
using System;
using System.Text;
using System.Data;

namespace cfx.data
{
    public static class tDataHelper
    {
        // 其它代码
        public static string ToHtmlTable(DataTable data,
            string pkName = null, bool showFirstCol = true,
            bool showColName = true, string tableId = "table1",
            string className = "table_data")
        {
            if (data == null || data.Columns.Count == 0)
                return "";
            if (pkName != null && data.Columns.Contains(pkName) == false)
                return "";
            // 如果不指定主键数据列,则使用第一列数据
            if (pkName == null) pkName = data.Columns[0].ColumnName;
            //
            StringBuilder sb =
                new StringBuilder(data.Columns.Count * data.Rows.Count * 32);
            sb.AppendFormat("<table id='{0}' class='{1}'>", tableId, className);
            // 是否显示第一列
            int beginCol = showFirstCol ? 0 : 1;
            // 显示列名
            if (showColName)
            {
                sb.Append("<tr>");
                for (int col = beginCol; col < data.Columns.Count; col++)
                {
                    sb.AppendFormat("<th>{0}</th>",
                        data.Columns[col].ColumnName);
                }
                sb.Append("</tr>");
            }
            // 数据行
            for (int row = 0; row < data.Rows.Count; row++)
            {
                sb.AppendFormat("<tr rowdata='{0}'>",
                    data.Rows[row][pkName]);
                for (int col = beginCol; col < data.Columns.Count; col++)
                {
                    sb.AppendFormat("<td>{0}</td>",
                        data.Rows[row][col]);
                }
                sb.Append("</tr>");
            }
            //
            sb.Append("</table>");
            return sb.ToString();
        }
    }
}

ToHtmlTable()方法的参数定义如下:

  • data,DataTable类型,定义需要转换的数据。
  • pkName,string类型,定义HTML表中行(tr元素)数据的列名,默认为null,此时会使用第一列的数据作为行数据,行数据会在<tr>标签中使用自定义属性rowdata指定。
  • showFirstCol,bool类型,默认值为true,定义是否显示第一列数据。应用中,有时会需要隐藏第一列数据,比如,第一列数据作为行数据,但在表格中不需要显示此列数据,此时可以将参数设置为false。
  • showColName,bool类型,默认值为true,定义是否显示列名。HTML表格中,列名行一般会在数据行的上方,列名单元格使用th元素定义,区别于普通数据单元格的td元素。
  • tableId,string类型,定义HTML表格元素的id属性值,默认值为"table1"。HTML元素中的id值可以在JavaScript代码中快速找到元素,并进一步操作。
  • className,string类型,定义HTML表格元素的class属性值,默认值为"table_data";class属性值多用于设置HTML元素的CSS样式。

下面的代码,在Program.cs文件中测试tDataHelper.ToHtmlTable()方法的应用。

C#
using System;
using System.Data;
using cfx;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = @"select recid,f1,f2,f3,f4 from t1";
            DataTable data = tApp.DbJet.GetTable(sql);
            string s = tDataHelper.ToHtmlTable(data, "recid", true);
            Console.WriteLine(CFile.WriteAllText(@"d:\t1.html", s));
        }
    }
}

执行代码会将t1表的数据转换为HTML表格代码,并保存到d:\t1.html文件中,使用Chrome浏览器打开的效果如下图所示。

导出HTML表格格式

图中显示了HTML表格在Chrome浏览器中的默认样式,可以通过页面中右键菜单项“查看网页源代码”查看生成的代码。更多HTML和CSS学习内容可以参考《HTML与CSS》合集,网址如下:

http://caohuayu.com/article/Group.aspx?id=4

JavaScript相关内容可以参考《JavaScript编程》合集,网址如下:

http://caohuayu.com/article/Group.aspx?id=5

《JavaScript实现表格分页并添加行操作链接》文章中介绍了使用JavaScript代码在浏览器中对表格数据进行分页显示及扩展行数据操作链接的方法,网址如下:

http://caohuayu.com/article/Article.aspx?id=a263021

DataTable数据转换为HTML列表

下面的代码(cfx/data/tDataHelper.cs),会将DataTable对象中的数据按照指定的模板生成HTML列表代码。

C#
using System;
using System.Text;
using System.Data;

namespace cfx.data
{
    public static class tDataHelper
    {
        // 其它代码
        // 列表项模板中,{0}为field0字段数据,{1}为field1字段数据
        public static string ToHtmlList(DataTable data,
            string listItemTemplate, string field0, string field1,
            string listId = "list1", string className = "list_res")
        {
            if (data == null || data.Columns.Contains(field0) == false ||
                data.Columns.Contains(field1) == false) return "";
            //
            StringBuilder sb =
                new StringBuilder(data.Rows.Count * 64);
            sb.AppendFormat("<ul id='{0}' class='{1}'>", listId, className);
            for (int row = 0; row < data.Rows.Count; row++)
            {
                sb.AppendFormat(listItemTemplate,
                    data.Rows[row][field0], data.Rows[row][field1]);
            }
            sb.Append("</ul>");
            return sb.ToString();
        }
    }
}

ToHtmlList()方法会生成HTML中的ul元素代码,定义的参数如下:

  • data,DataTable类型,定义需要导出的数据。
  • listItemTemplate、field0和field1参数需要配合使用,它们都定义为string类型,listItemTemplate模板应定义为包含li元素的代码,方法中会将listItemTemplate内容中的{0}替换为field0字段数据,将{1}替换为field1字段数据。
  • listId,string类型,定义ul元素的id属性值,默认值为"list1"
  • className,string类型,定义ul元素的class属性值,默认值为"list_res"。

下面的代码,在Program.cs文件中测试tDataHelper.ToHtmlList()方法的应用。

C#
using System;
using System.Data;
using cfx;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = @"select recid,f1 from t1";
            DataTable data = tApp.DbJet.GetTable(sql);
            string s = tDataHelper.ToHtmlList(data,
                "<li><a href='Edit.aspx?id={0}'>{1}</a></li>",
                "recid", "f1");
            Console.WriteLine(CFile.WriteAllText(@"d:\t1.html", s));
        }
    }
}

生成的ul列表在Chrome浏览器中的默认样式如下图所示。

导出HTML列表格式

Chrome浏览器中,可以通过页面的右键菜单“查看网页源代码”查看生成的代码;更多HTML列表和样式应用可以参考《列表》,网址如下:

http://caohuayu.com/article/Article.aspx?id=a262005

使用JavaScript代码在浏览器中对列表进行分页浏览的操作可以参考《JavaScript实现列表分页浏览》,网址如下:

http://caohuayu.com/article/Article.aspx?id=a263020

DataTable数据转换为JSON

JSON(Java Script Object Notation)是一种轻量级的、基于文本格式的数据格式,下面的代码(cfx/data/tDataHelper.cs),在tDataHelper类中定义了ToJson()方法,可以将DataTable对象数据转换为JSON格式字符串。

C#
using System;
using System.Text;
using System.Data;

namespace cfx.data
{
    public static class tDataHelper
    {
        // 其它代码
        public static string ToJson(DataTable data)
        {
            if (data == null || data.Columns.Count == 0 ||
                data.Rows.Count == 0) return "";
            //
            StringBuilder sb =
                new StringBuilder(data.Columns.Count * data.Rows.Count * 32);
            sb.Append("[");
            // 第一行数据
            sb.AppendFormat(@"{{""{0}"":""{1}""",
                data.Columns[0].ColumnName, data.Rows[0][0]);
            for (int col = 1; col < data.Columns.Count; col++)
            {
                sb.AppendFormat(@",""{0}"":""{1}""",
                    data.Columns[col].ColumnName, data.Rows[0][col]);
            }
            sb.Append("}");
            // 其它行数据
            for (int row = 1; row < data.Rows.Count; row++)
            {
                sb.AppendFormat(@",{{""{0}"":""{1}""",
                    data.Columns[0].ColumnName, data.Rows[row][0]);
                for (int col = 1; col < data.Columns.Count; col++)
                {
                    sb.AppendFormat(@",""{0}"":""{1}""",
                        data.Columns[col].ColumnName, data.Rows[row][col]);
                }
                sb.Append("}");
            }
            //
            sb.Append("]");
            return sb.ToString();
        }
    }
}

tDataHelper.ToJson()方法只需要一个参数,即需要转换格式的DataTable对象。方法中,会将数据转换为一个JSON数组(JSONArray),使用一对方括号定义;数组的每一个元素包含了一行数据,定义为一个JSONObject对象,使用一对花括号定义;其中,每一个数据项使用"字段名":"数据"的格式定义,数据项之间使用逗号(,)分隔。

下面的代码,在Program.cs文件中测试tDataHelper.ToJson()方法的应用。

C#
using System;
using System.Data;
using cfx;
using cfx.data;
namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = @"select recid,f1,f2,f3,f4 from t1";
            DataTable data = tApp.DbJet.GetTable(sql);
            string s = tDataHelper.ToJson(data);
            Console.WriteLine(CFile.WriteAllText(@"d:\t1.json", s));
        }
    }
}

生成的JSON数据文本如下,可以使用Visual Studio等应用打开查看,其中的换行为自动排版效果。

JSON
[
  {
    "recid": "1",
    "f1": "user01",
    "f2": "0",
    "f3": "2025/10/11 11:00:00",
    "f4": "111"
  },
  {
    "recid": "2",
    "f1": "user02",
    "f2": "1",
    "f3": "2025/11/5 10:30:00",
    "f4": "111"
  },
  {
    "recid": "3",
    "f1": "user03",
    "f2": "1",
    "f3": "2025/11/6 10:15:00",
    "f4": "111.001"
  },
  {
    "recid": "4",
    "f1": "user04",
    "f2": "2",
    "f3": "2026/1/16 11:30:00",
    "f4": "111.001"
  },
  {
    "recid": "5",
    "f1": "user05",
    "f2": "2",
    "f3": "2026/1/19 9:30:00",
    "f4": "111.001"
  },
  {
    "recid": "6",
    "f1": "user06",
    "f2": "1",
    "f3": "2026/2/28 10:30:00",
    "f4": "111.002"
  },
  {
    "recid": "7",
    "f1": "user07",
    "f2": "2",
    "f3": "2026/3/11 11:30:00",
    "f4": "111.002"
  },
  {
    "recid": "8",
    "f1": "user08",
    "f2": "1",
    "f3": "2026/3/13 10:25:00",
    "f4": "112"
  },
  {
    "recid": "9",
    "f1": "user09",
    "f2": "2",
    "f3": "2026/3/19 15:35:00",
    "f4": "112.001"
  },
  {
    "recid": "10",
    "f1": "user10",
    "f2": "1",
    "f3": "2026/3/21 10:15:00",
    "f4": "112.002"
  }
]

JSON格式和JavaScript操作JSON数据的更多内容可以参考《JSON》,网址如下:

http://caohuayu.com/article/Article.aspx?id=a263011