C#使用NPOI实现Excel和DataTable的互转

这里是使用NPOI实现Excel和DataTable互转的完整攻略,包括具体的步骤和两条示例说明。

1. 安装NPOI库

首先需要安装NPOI库,可以使用NuGet进行安装。在Visual Studio中打开NuGet控制台,输入以下命令来安装NPOI库:

Install-Package NPOI

2. 读取Excel文件

读取Excel文件可以使用HSSFWorkbook或XSSFWorkbook类,它们用于处理xls和xlsx格式的Excel文件。下面是读取Excel文件的代码示例:

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

// 读取Excel文件
public DataTable ReadExcel(string fileName)
{
    string fileExtension = Path.GetExtension(fileName);
    ISheet sheet = null;
    DataTable data = new DataTable();

    using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        if (fileExtension == ".xls")
        {
            HSSFWorkbook workbook = new HSSFWorkbook(fs);
            sheet = workbook.GetSheetAt(0);
        }
        else if (fileExtension == ".xlsx")
        {
            XSSFWorkbook workbook = new XSSFWorkbook(fs);
            sheet = workbook.GetSheetAt(0);
        }

        IRow headerRow = sheet.GetRow(0);
        int cellCount = headerRow.LastCellNum;

        for (int i = headerRow.FirstCellNum; i < cellCount; i++)
        {
            DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
            data.Columns.Add(column);
        }

        for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = data.NewRow();

            for (int j = row.FirstCellNum; j < cellCount; j++)
            {
                if (row.GetCell(j) != null)
                {
                    dataRow[j] = row.GetCell(j).ToString();
                }
            }

            data.Rows.Add(dataRow);
        }
    }

    return data;
}

3. 处理DataTable

DataTable是在内存中表示的数据表,可以对其进行增删改查等操作。在处理DataTable时最常用的方法是使用foreach循环,以下是一些常用的处理方法:

DataTable dt = ReadExcel("data.xlsx");

// 遍历DataTable
foreach (DataRow row in dt.Rows)
{
    foreach (DataColumn column in dt.Columns)
    {
        Console.WriteLine(row[column]);
    }
}

// 添加行
DataRow newRow = dt.NewRow();
newRow["Name"] = "Tom";
newRow["Age"] = 18;
dt.Rows.Add(newRow);

// 删除行
foreach (DataRow row in dt.Rows)
{
    if (row["Age"].ToString() == "20")
    {
        dt.Rows.Remove(row);
    }
}

// 修改行
foreach (DataRow row in dt.Rows)
{
    if (row["Name"].ToString() == "Tom")
    {
        row["Age"] = 20;
    }
}

// 查询行
DataRow[] rows = dt.Select("Name='Tom'");
foreach (DataRow row in rows)
{
    Console.WriteLine(row["Age"]);
}

// 排序
DataView view = dt.DefaultView;
view.Sort = "Age DESC";
dt = view.ToTable();

4. 写入Excel文件

使用NPOI可以方便地将数据写入Excel文件中。以下是将DataTable数据写入Excel文件的代码示例:

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

// 写入Excel文件
public void WriteExcel(string fileName, DataTable data)
{
    IWorkbook workbook = null;

    if (Path.GetExtension(fileName) == ".xls")
    {
        workbook = new HSSFWorkbook();
    }
    else
    {
        workbook = new XSSFWorkbook();
    }

    ISheet sheet = workbook.CreateSheet("Sheet1");
    IRow headerRow = sheet.CreateRow(0);

    // 写入表头
    for (int i = 0; i < data.Columns.Count; i++)
    {
        headerRow.CreateCell(i).SetCellValue(data.Columns[i].ColumnName);
    }

    // 写入数据
    for (int i = 0; i < data.Rows.Count; i++)
    {
        IRow row = sheet.CreateRow(i + 1);

        for (int j = 0; j < data.Columns.Count; j++)
        {
            row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
        }
    }

    // 保存Excel文件
    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
    {
        workbook.Write(fs);
    }
}

5. 示例说明

以下是两个示例说明,分别是读取Excel文件和写入Excel文件。

示例1:读取Excel文件

假设有一个名为data.xlsx的Excel文件,其中包含以下内容:

Name Age Gender
Alice 23 F
Bob 25 M

要读取该文件并将其转换为DataTable,可以使用以下代码:

DataTable dt = ReadExcel("data.xlsx");

读取完成后,可以使用以下方法对DataTable进行处理:

foreach (DataRow row in dt.Rows)
{
    Console.WriteLine(row["Name"]);
}

示例2:写入Excel文件

假设有一个名为data的DataTable,其中包含以下内容:

Name Age
Alice 23
Bob 25
Charlie 18

要将该DataTable写入名为output.xlsx的Excel文件中,可以使用以下代码:

WriteExcel("output.xlsx", data);

写入完成后,可以打开output.xlsx文件查看其内容。

以上便是使用NPOI实现Excel和DataTable互转的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用NPOI实现Excel和DataTable的互转 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • CommunityToolkit.Mvvm系列文章导航

    包 CommunityToolkit.Mvvm (又名 MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm) 是一个现代、快速且模块化的 MVVM 库。 它是 .NET 社区工具包的一部分,围绕以下原则构建: 平台和运行时独立 – .NET Standard 2.0、 .NET Standard 2.1 和 .NET 6? (UI Fr…

    C# 2023年4月17日
    00
  • C# Path.GetTempPath()方法: 获取系统临时文件夹的路径

    Path.GetTempPath()是C#的一个方法,它的作用是获取当前操作系统的临时文件目录路径。这个方法返回一个字符串,表示当前操作系统的临时文件目录路径。这个路径可能因操作系统的不同而不同,例如在Windows系统中,临时文件路径一般是”C:\Users\username\AppData\Local\Temp”。 使用方法如下: string temp…

    C# 2023年4月19日
    00
  • C# .NET中Socket简单实用框架的使用教程

    C#.NET中Socket简单实用框架的使用教程 什么是Socket框架? Socket框架是一种网络编程模型,被广泛应用于各种网络通信应用程序的开发中,包括聊天工具、文件传输、视频会议等。Socket框架通过封装了底层的TCP/IP协议,提供了一种简单、灵活且高效的网络编程模型。通常情况下,使用Socket框架编写网络应用程序需要掌握C#语言和.NET框架…

    C# 2023年5月15日
    00
  • VS2008中使用JavaScript调用WebServices

    VS2008中使用JavaScript调用WebServices的完整攻略 在VS2008中,我们可以使用JavaScript调用WebServices。本文将提供详细的“VS2008中使用JavaScript调用WebServices”的完整攻略,包括如何创建WebServices、如何使用JavaScript调用WebServices以及两个示例。 创建…

    C# 2023年5月15日
    00
  • C# Path.GetRandomFileName – 获取一个随机文件名

    Path.GetRandomFileName 方法是C#中的一个静态方法,其返回一个随机生成的文件名(不包含路径),该方法的作用是用于生成一个随机的文件名,以避免文件名的冲突问题。 使用该方法非常简单,只需要在代码中调用该静态方法即可,该方法的语法格式如下: public static string GetRandomFileName(); 该方法返回一个字…

    C# 2023年4月19日
    00
  • 浅谈JavaScript Date日期和时间对象

    浅谈JavaScript Date日期和时间对象 什么是JavaScript Date日期和时间对象? JavaScript 是一种基于对象和事件驱动的脚本语言。Date 是 JavaScript 中处理日期和时间的对象。它提供了多种方法来格式化和操作日期和时间。 创建JavaScript Date日期和时间对象 可以使用 Date() 构造函数创建一个日期…

    C# 2023年5月15日
    00
  • C#生成PDF的方法

    下面是C#生成PDF的方法的完整攻略: Step 1:选取PDF生成库 目前市面上有很多PDF生成库可供选择,如iTextSharp、PDFSharp、NReco等,你可以根据自己的需求和实际情况进行选择。这里我们以iTextSharp为例进行讲解。 Step 2:安装iTextSharp 在Visual Studio中打开Nuget Package Man…

    C# 2023年6月1日
    00
  • 深入反射生成数组的详解

    深入反射生成数组的详解 本文将详细介绍如何使用反射生成数组。反射是 Java 中非常有用的一个特性,可以在运行时获取和操作类的信息。数组作为 Java 中最基本的数据结构之一,对于开发人员来说也是非常重要的。通过反射生成数组的方式可以提高代码的灵活性和可重用性。 获取 Class 对象 在使用反射生成数组之前,需要先获取 Class 对象。可以通过多种方式获…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部