.NET中通过C#实现Excel与DataTable的数据互转

在.NET框架中,使用C#进行Excel数据与DataTable之间的转换是数据分析、报表生成、数据迁移等操作中的常见需求。这一过程涉及到将Excel文件中的数据读取并加载至DataTable中,以便于利用.NET提供的丰富数据处理功能进行操作,同时也包括将DataTable中的数据导出至Excel文件,以实现数据的可视化或共享。本文将介绍如何通过C#语言实现Excel数据与DataTable之间的高效转换

文章目录

本文使用的方法需要用到免费的Free Spire.XLS for .NET,NuGet:PM> Install-Package FreeSpire.XLS

将数据从DataTable导出到Excel文件

我们可以使用Worksheet.AllocatedRange属性获取Excel工作表中的已使用的单元格范围,然后根据行数和列数,读取数据并添加到DataTable对象中。以下是操作步骤:

  1. 导入所需模块。
  2. 创建Workbook对象,使用Workbook.LoadFromFile()方法载入Excel文件。
  3. 使用Workbook.Worksheets[]属性获取需要的工作表。
  4. 创建DataTable实例。
  5. 遍历工作表第一行数据,使用Worksheet.AllocatedRange[].Value属性获取其中单元格的值,最后使用DataTable.Columns.Add()方法将其导入为DataTable的列名。
  6. 遍历剩余各行,使用同样的方法获取单元格数据,并写入到DataTable各行中。
  7. 输出结果。

代码示例

csharp 复制代码
using Spire.Xls;
using System.Data;

namespace ExcelToDataTable
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建Workbook的实例
            Workbook wb = new Workbook();

            // 载入Excel文件
            wb.LoadFromFile("Sample.xlsx");

            // 获取一个工作表
            Worksheet sheet = wb.Worksheets[0];

            // 创建一个DataTable实例
            DataTable dataTable = new DataTable();

            // 将第一行作为列名添加到DataTable
            for (int col = 1; col <= sheet.AllocatedRange.ColumnCount; col++)
            {
                if (sheet.AllocatedRange[1, col].Value != null)
                {
                    dataTable.Columns.Add(sheet.AllocatedRange[1, col].Value);
                }
            }

            // 遍历其余行并将数据添加到DataTable
            for (int row = 2; row <= sheet.AllocatedRange.RowCount; row++)
            {
                DataRow dataRow = dataTable.NewRow();
                for (int col = 1; col <= sheet.AllocatedRange.ColumnCount; col++)
                {
                    if (sheet.AllocatedRange[row, col].Value != null)
                    {
                        dataRow[col - 1] = sheet.AllocatedRange[row, col].Value;
                    }
                }
                dataTable.Rows.Add(dataRow);
            }

            // 输出列名
            foreach (DataColumn column in dataTable.Columns)
            {
                Console.Write(column.ColumnName + "\t");
            }
            Console.WriteLine();

            // 输出数据行
            foreach (DataRow row in dataTable.Rows)
            {
                foreach (var item in row.ItemArray)
                {
                    Console.Write(item + "\t");
                }
                Console.WriteLine();
            }
        }
    }
}

结果

将数据从Excel表格导入DataTable

Worksheet.Range[].Value属性可以帮助我们直接向Excel工作表中的指定单元格写入数据。我们可以将从其他地方获取到的DataTable对象中的数据搭配此属性写入到Excel文件中。以下是操作步骤:

  1. 导入所需模块。
  2. 定义数据并使用数据构建DataTable对象。
  3. 创建Workbook实例。
  4. 使用Workbook.Worksheets.Clear()方法清除默认工作表,然后使用Workbook.Worksheets.Add()方法新建工作表。
  5. 遍历DataTable列,使用DataTable.Columns[].ColumnName属性获取列名,最后使用Worksheet.Range[].Value属性将列名写入工作表。
  6. 遍历DataTable数据行和列,使用DataTable.Rows[][].ToString()方法获取数据为字符串,最后使用Worksheet.Range[].Value属性将数据写入工作表。
  7. 使用Workbook.SaveToFile()方法保存Excel文件。
  8. 释放资源。

代码示例

csharp 复制代码
using Spire.Xls;
using System.Data;

namespace DataTableToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // 定义数据列表并创建一个DataTable实例
            string[,] data = new string[,]
            {
                { "Product", "Quantity", "SalesAmount" },
                { "Product A", "100", "5000.0" },
                { "Product B", "150", "7500.0" },
                { "Product C", "200", "10000.0" },
                { "Product D", "120", "6000.0" },
                { "Product E", "180", "9000.0" }
            };
            DataTable dataTable = new DataTable();
            // 获取列数
            int columnCount = data.GetLength(1);
            // 添加列
            for (int col = 0; col < columnCount; col++)
            {
                dataTable.Columns.Add(data[0, col]);
            }
            // 添加数据行
            for (int row = 1; row < data.GetLength(0); row++)
            {
                DataRow dataRow = dataTable.NewRow();
                for (int col = 0; col < columnCount; col++)
                {
                    dataRow[col] = data[row, col];
                }
                dataTable.Rows.Add(dataRow);
            }

            // 创建Workbook的实例
            Workbook workbook = new Workbook();

            // 清除默认工作表并添加一个工作表
            workbook.Worksheets.Clear();
            Worksheet sheet = workbook.Worksheets.Add("SalesReport");

            // 写入列名
            for (int col = 0; col < columnCount; col++)
            {
                sheet.Range[1, col + 1].Value = dataTable.Columns[col].ColumnName;
            }

            // 写入数据行
            for (int row = 0; row < dataTable.Rows.Count; row++)
            {
                for (int col = 0; col < columnCount; col++)
                {
                    sheet.Range[row + 2, col + 1].Value = dataTable.Rows[row][col].ToString();
                }
            }

            // 保存到文件
            workbook.SaveToFile("output/DataTableToExcel.xlsx", FileFormat.Version2016);
            workbook.Dispose();
        }
    }
}

结果

本文演示如何使用C#代码在.NET程序中导入Excel文件数据到DataTable以及到处DataTable数据到Excel文件。

相关推荐
li167090270几秒前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
游乐码3 分钟前
C#List
开发语言·c#·list
xyq20249 分钟前
jQuery Tooltip:深入解析与最佳实践
开发语言
夜猫子ing9 分钟前
如何编写一个CMakelists文件
开发语言·c++
开开心心_Every19 分钟前
内存清理软件灵活设置,自动阈值快捷键清
运维·服务器·pdf·web3·电脑·excel·共识算法
Ivanqhz20 分钟前
LLVM IR 转 SMT公式
java·开发语言
小红的布丁24 分钟前
Reactor 模型详解:单 Reactor、主从 Reactor 与 Netty 思想
android·java·开发语言
被摘下的星星32 分钟前
Java的类加载
java·开发语言
skilllite作者36 分钟前
SkillLite 多入口架构实战:CLI / Python SDK / MCP / Desktop / Swarm 一页理清
开发语言·人工智能·python·安全·架构·rust·agentskills
秋月的私语41 分钟前
遥感影像拼接线优化工具:基于Qt+GDAL+OpenCV的从零到一实践
开发语言·qt·opencv