DataTable转List完全指南

一、DataTable转List Json

DataTable是.NET中一个非常常用的数据类型。然而,当我们需要将DataTable转化成其他数据类型的时候,就需要考虑DataTable转化成List Json。下面我们就从以下几个方面来详细讲解如何完成转化过程。

1. 使用Json.net进行DataTable转换


using Newtonsoft.Json;
using System.Data;
using System.Web.Mvc;

public JsonResult GetJsonData()
{
    DataTable dt = GetDataTable(); //获取DataTable数据
    string json = JsonConvert.SerializeObject(dt); //DataTable转换成Json字符串
    return Json(json, JsonRequestBehavior.AllowGet); // "AllowGet" 这个参数允许 Get 方式的HTTP请求.
}

从上面的代码中可以看出,我们通过Json.net这个类库中的SerializeObject()函数,很容易地将DataTable转化成了Json格式的字符串。需要注意的是,一定要在Controller层的函数中将返回类型设置成JsonResult类型,否则会引发异常。

2. 使用JavaScriptSerializer进行DataTable转换


using System.Web.Script.Serialization;
using System.Data;
using System.Web.Mvc;

public JsonResult GetJsonData()
{
    DataTable dt = GetDataTable(); //获取DataTable数据
    JavaScriptSerializer js = new JavaScriptSerializer();
    string json = js.Serialize(dt); //DataTable转换成Json字符串
    return Json(json, JsonRequestBehavior.AllowGet); // "AllowGet" 这个参数允许 Get 方式的HTTP请求.
}

我们也可以使用.NET自带的JavaScriptSerializer进行DataTable转换,它与Json.net类库差不多,只是Transform DataTable to List Json过程多了一步,需要先实例化一个JavaScriptSerializer类。

3. 优化DataTable转Json的性能

为了提高DataTable转换成List Json的性能,我们可以使用异步的方式进行数据转换。下面是代码的实现:


public async Task<JsonResult> GetJsonData()
{
    DataTable dt = GetDataTable(); //获取DataTable数据
    string json = string.Empty;
    await Task.Factory.StartNew(() =>
    {
        json = JsonConvert.SerializeObject(dt); // DataTable转换成Json字符串
    });
    return Json(json, JsonRequestBehavior.AllowGet); // "AllowGet" 这个参数允许 Get 方式的HTTP请求.
}

通过在Controller层的函数中使用Task.Factory.StartNew()方法,我们就可以将数据转换和返回的Http响应分别挂起,从而达到提高程序性能的目的。

二、List转DataTable

除了将DataTable转成Json格式的字符串,还有一种常用的操作就是将List转成DataTable。那么,如何实现List转DataTable呢?下面我们就从以下几个方面详细介绍。

1. 将List元素插入到DataTable的行中


public static DataTable ToDataTable<T>(List<T> iList)
{
    DataTable dataTable = new DataTable();
    PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(typeof(T));
 
    for (int i = 0; i < propertyDescriptorCollection.Count; i++)
    {
        PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i];
        Type type = propertyDescriptor.PropertyType;
 
        if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable)))
        {
            type = Nullable.GetUnderlyingType(type);
        }
 
        dataTable.Columns.Add(propertyDescriptor.Name, type);
    }
 
    object[] values = new object[propertyDescriptorCollection.Count];
 
    foreach (T iListItem in iList)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = propertyDescriptorCollection[i].GetValue(iListItem);
        }
 
        dataTable.Rows.Add(values);
    }
    return dataTable;
}

通过定义ToDataTable()函数,我们可以将List转成DataTable,并且在其中逐一遍历List中的元素,将其插入到DataTable的每一行中,从而得到我们需要的结果。

2. 将List元素的属性作为DataTable的列


public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for (int i = 0; i < props.Count; i++)
    {
        PropertyDescriptor prop = props[i];
        if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable)))
        {
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType));
        }
        else
        {
            table.Columns.Add(prop.Name, prop.PropertyType);
        }
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = props[i].GetValue(item);
        }
        table.Rows.Add(values);
    }
    return table;
}

通过重载ToDataTable()函数,我们就可以将List中元素的属性名作为DataTable的列名。这种方法在将List转成DataTable时非常有用。

三、DataTable转成List

DataTable直接转为List是我们常用到的方式之一。下面我们就从以下几个方面详细介绍如何实现DataTable转List操作。

1. 遍历每一行数据转成List元素


public static List<T> ToList<T>(this DataTable table) where T : class, new()
{
    List<T> list = new List<T>();
    foreach (DataRow row in table.Rows)
    {
        T item = new T();
        foreach (DataColumn column in table.Columns)
        {
            PropertyInfo property = item.GetType().GetProperty(column.ColumnName);
            if (property != null && row[column] != DBNull.Value)
            {
                property.SetValue(item, row[column], null);
            }
        }
        list.Add(item);
    }
    return list;
}

将DataTable逐行遍历,将每一行数据转化成List元素,这是最为直接的方法。同时,在List中需要指定泛型参数类型T。

2. 使用Linq进行数据的筛选和过滤


public static List<T> ToList<T>(this DataTable table) where T : new()
{
    List<T> result = new List<T>();
    foreach (var row in table.AsEnumerable())
    {
        T item = new T();
        foreach (var prop in item.GetType().GetProperties())
        {
            try
            {
                PropertyInfo propertyInfo = item.GetType().GetProperty(prop.Name);
                object propertyValue = row[prop.Name];
                if (propertyValue == null)
                {
                    propertyValue = DBNull.Value;
                }
                propertyInfo.SetValue(item, propertyValue, null);
            }
            catch (Exception ex)
            {
                continue;
            }
        }
        result.Add(item);
    }
    return result;
}

我们还可以使用Linq进行筛选和过滤操作,将DataTable转换成指定泛型T的List。这种方式操作更为灵活,并可以直接通过Lambda表达式对数据进行操作。

四、DataTable转Sheet

DataTable转Sheet通常用于Excel表格的导出操作。下面我们就从以下几个方面详细介绍如何将DataTable转成Sheet。

1. 使用NPOI库转换成Sheet


using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;

public ActionResult ExportExcel()
{
    DataTable dt = GetDataTable(); //获取DataTable数据
    HSSFWorkbook workbook = new HSSFWorkbook();
    ISheet sheet = workbook.CreateSheet("sheet1");
    IRow headerRow = sheet.CreateRow(0);
    for (int i = 0; i < dt.Columns.Count; i++)
        headerRow.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        IRow row = sheet.CreateRow(i + 1);
        for (int j = 0; j < dt.Columns.Count; j++)
            row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
    }
    MemoryStream ms = new MemoryStream();
    workbook.Write(ms);
    Response.BinaryWrite(ms.ToArray());
    Response.End();
    return View();
}

这里使用NPOI库来将DataTable转成Sheet,主要用到了HSSFWorkbook和ISheet两个类。NPOI库是.NET中操作Excel的最好选择之一。

2. 使用EPPlus库转换成Sheet


using OfficeOpenXml;
using System.Web.Mvc;
using System.IO;

public void ExportExcel()
{
    List<MyObj> myList = new List<MyObj>();
    DataTable dt = myList.ToDataTable();
    byte[] fileContents;
    using (var package = new ExcelPackage())
    {
        // Add a new worksheet to the empty workbook
        ExcelWorksheet worksheet = null;
        worksheet = package.Workbook.Worksheets.Add("sheet1");
        worksheet.Cells[1, 1].LoadFromDataTable(dt, true);
        fileContents = package.GetAsByteArray();
    }
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "MyExcel.xlsx"));
    Response.OutputStream.Write(fileContents, 0, fileContents.Length);
    Response.OutputStream.Flush();
    Response.OutputStream.Close();
    Response.End();
}

使用EPPlus库将DataTable转成Sheet非常方便。EPPlus基于Open XML标准,支持新的Excel格式,并且速度快,使用方便。

五、Dataframe转List

Dataframe是pandas库中的常用数据类型,通常需要将其转成List,以方便后续操作。以下是如何将Dataframe转成List的几种方法。

1. 使用values属性转换成List


import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['a', 'b', 'c'])

list1 = df.values.tolist()
print(list1)

使用pandas库中的values属性,可以将Dataframe转成List。Cpandas库的values属性是将值以数组形式返回,然后变成List。

2. 使用to_dict()方法将Dataframe转成List


import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['a', 'b', 'c'])

dict1 = df.to_dict('records')
print(dict1)

利用pandas库中的to_dict()方法,可以将Dataframe转成字典形式,然后再以字典形式返回List。

3. 合并列名和数据,并将Dataframe转为List


import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['a', 'b', 'c'])

result = []
for col in df.columns:
    values = df[col].values
    col_values = [{col: value} for value in values]
    for i in range(len(col_values)):
        if len(result) <= i:
            result.append({})
        result[i].update(col_values[i])

list1 = []
for item in result:
    row = []
    for col in df.columns:
        row.append(item[col])
    list1.append(row)

print(list1)

通过合并列名和数据两个属性,然后将Dataframe转化成List。这种方法较为麻烦,但是可以准确地实现Goal。

六、DataTable转String

将DataTable转成String,是我们在后端计算和前端展示时常用的操作。下面我们就从如下几个方面详细讲解如何将DataTable转成String。

1. 拼接字符串输出


private static string DataTable2String(DataTable dt)
{
string result = string.Empty;
for (int i = 0; i < dt.Rows.Count; i++)
{
result += dt.Rows[i]["ColumnName

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/249076.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:31
下一篇 2024-12-12 13:31

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • Python wordcloud入门指南

    如何在Python中使用wordcloud库生成文字云? 一、安装和导入wordcloud库 在使用wordcloud前,需要保证库已经安装并导入: !pip install wo…

    编程 2025-04-29
  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python小波分解入门指南

    本文将介绍Python小波分解的概念、基本原理和实现方法,帮助初学者掌握相关技能。 一、小波变换概述 小波分解是一种广泛应用于数字信号处理和图像处理的方法,可以将信号分解成多个具有…

    编程 2025-04-29
  • Python字符转列表指南

    Python是一个极为流行的脚本语言,在数据处理、数据分析、人工智能等领域广泛应用。在很多场景下需要将字符串转换为列表,以便于操作和处理,本篇文章将从多个方面对Python字符转列…

    编程 2025-04-29
  • Tensor to List的使用

    Tensor to List是TensorFlow框架提供的一个非常有用的函数,在很多的深度学习模型中都会用到。它的主要功能是将TensorFlow中的张量(Tensor)转换为P…

    编程 2025-04-29
  • Python初学者指南:第一个Python程序安装步骤

    在本篇指南中,我们将通过以下方式来详细讲解第一个Python程序安装步骤: Python的安装和环境配置 在命令行中编写和运行第一个Python程序 使用IDE编写和运行第一个Py…

    编程 2025-04-29
  • Python起笔落笔全能开发指南

    Python起笔落笔是指在编写Python代码时的编写习惯。一个好的起笔落笔习惯可以提高代码的可读性、可维护性和可扩展性,本文将从多个方面进行详细阐述。 一、变量命名 变量命名是起…

    编程 2025-04-29
  • FusionMaps应用指南

    FusionMaps是一款基于JavaScript和Flash的交互式地图可视化工具。它提供了一种简单易用的方式,将复杂的数据可视化为地图。本文将从基础的配置开始讲解,到如何定制和…

    编程 2025-04-29

发表回复

登录后才能评论