C# Excel 互操作解决方案

查克尼特·宾
查克尼特·宾
2020年六月17日
更新 2024年十月20日
分享:
This article was translated from English: Does it need improvement?
Translated
View the article in English

许多项目使用 Excel 来清晰地交流,但如果您使用 Microsoft.Office.Interop.Excel,那么您可能已经面临过许多复杂的代码行。 在本教程中,我们将使用IronXL作为C# Excel Interop的替代方案,这样您就无需使用Interop即可完成您的项目。 您可以使用C#编程来使用Excel文件数据、创建Excel文件以及编辑和操作这些文件。


如何交替使用 Excel 互操作

  1. 安装一个Excel库来处理Excel文件。

  2. 打开Workbook并添加当前的Excel文件。

  3. 设置默认工作表。

  4. 从Excel工作簿中读取值。

  5. 处理并显示数值。

    步骤 1

1. 下载 IronXL 库

下载 IronXL 库通过 NuGet 安装来获取免费库,然后按照步骤逐步完成本教程,了解如何在没有 Interop 的情况下使用 Excel。如果您希望将项目上线,可以选择购买许可证。

Install-Package IronXL.Excel

教程

2. 访问 Excel 文件数据

为了开发商业应用程序,我们需要轻松且完美地从Excel文件中访问数据,并能够根据各种要求以编程方式操作它们。 使用 IronXL,使用WorkBook.Load()函数,可以访问读取特定的 Excel 文件。

在访问 WorkBook 之后,您可以使用 WorkBook.GetWorkSheet() 函数选择特定的 WorkSheet。 现在您已经可以访问所有Excel文件数据了。 请参考下面的示例,了解我们如何在C#项目中使用这些函数来获取Excel文件数据。

/**
Access File Data
anchor-access-excel-file-data
**/
using IronXL;
static void Main(string [] args)
{
    //Access Excel file
    WorkBook wb = WorkBook.Load("sample.xlsx");
    //Access WorkSheet of Excel file
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //get specific cell value
    string a = ws ["A5"].Value.ToString();
    Console.WriteLine(" Getting Single Value:\n\n   Value of Cell A5: {0} ",a);
    Console.WriteLine("\n Getting Many Cells Value using Loop:\n");
    //get many cell values using range function
    foreach (var cell in ws ["B2:B10"])
    {
        Console.WriteLine("   Value is: {0}", cell.Text);
    }
    Console.ReadKey();
}
/**
Access File Data
anchor-access-excel-file-data
**/
using IronXL;
static void Main(string [] args)
{
    //Access Excel file
    WorkBook wb = WorkBook.Load("sample.xlsx");
    //Access WorkSheet of Excel file
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //get specific cell value
    string a = ws ["A5"].Value.ToString();
    Console.WriteLine(" Getting Single Value:\n\n   Value of Cell A5: {0} ",a);
    Console.WriteLine("\n Getting Many Cells Value using Loop:\n");
    //get many cell values using range function
    foreach (var cell in ws ["B2:B10"])
    {
        Console.WriteLine("   Value is: {0}", cell.Text);
    }
    Console.ReadKey();
}
'''
'''Access File Data
'''anchor-access-excel-file-data
'''*
Imports Microsoft.VisualBasic
Imports IronXL
Shared Sub Main(ByVal args() As String)
	'Access Excel file
	Dim wb As WorkBook = WorkBook.Load("sample.xlsx")
	'Access WorkSheet of Excel file
	Dim ws As WorkSheet = wb.GetWorkSheet("Sheet1")
	'get specific cell value
	Dim a As String = ws ("A5").Value.ToString()
	Console.WriteLine(" Getting Single Value:" & vbLf & vbLf & "   Value of Cell A5: {0} ",a)
	Console.WriteLine(vbLf & " Getting Many Cells Value using Loop:" & vbLf)
	'get many cell values using range function
	For Each cell In ws ("B2:B10")
		Console.WriteLine("   Value is: {0}", cell.Text)
	Next cell
	Console.ReadKey()
End Sub
$vbLabelText   $csharpLabel

这段代码将产生以下结果:

1output related to 2. 访问 Excel 文件数据

Excel 文件看起来是这样的

1excel related to 2. 访问 Excel 文件数据

我们可以看到我们的 Excel 文件sample.xlsxA5单元格中有small businessB2B10 的其他值相同,并在输出中显示。

数据集和数据表

我们还可以使用这些指南处理Excel文件作为数据集和数据表。

/**
DataSet and DataTables
anchor-dataset-and-datatables
**/
//Access WorkBook.          
WorkBook wb = WorkBook.Load("sample.xlsx");
//Access WorkSheet.
 WorkSheet ws = wb.GetWorkSheet("Sheet1");
//Behave with a workbook as Dataset.
DataSet ds = wb.ToDataSet(); 
//Behave with workbook as DataTable
DataTable dt = ws.ToDataTable(true);
/**
DataSet and DataTables
anchor-dataset-and-datatables
**/
//Access WorkBook.          
WorkBook wb = WorkBook.Load("sample.xlsx");
//Access WorkSheet.
 WorkSheet ws = wb.GetWorkSheet("Sheet1");
//Behave with a workbook as Dataset.
DataSet ds = wb.ToDataSet(); 
//Behave with workbook as DataTable
DataTable dt = ws.ToDataTable(true);
'''
'''DataSet and DataTables
'''anchor-dataset-and-datatables
'''*
'Access WorkBook.          
Dim wb As WorkBook = WorkBook.Load("sample.xlsx")
'Access WorkSheet.
 Dim ws As WorkSheet = wb.GetWorkSheet("Sheet1")
'Behave with a workbook as Dataset.
Dim ds As DataSet = wb.ToDataSet()
'Behave with workbook as DataTable
Dim dt As DataTable = ws.ToDataTable(True)
$vbLabelText   $csharpLabel

您可以在Excel DataSet 和 DataTables 上阅读更多内容,其中提供了更多的代码示例和过程说明。

现在,我们将看到另一个方面,即在我们的C#项目中创建新的Excel文件。


3. 创建新的 Excel 文件

我们可以在CSharp项目中轻松地以编程方式创建一个新的Excel电子表格并在其中插入数据。 为此,IronXL 提供了WorkBook.Create()函数,用于创建新的 Excel 文件。

然后,我们可以使用 WorkBook.CreateWorkSheet() 函数根据需要创建任意数量的工作表。

之后,我们还可以如下示例所示插入数据:

/**
Create New Excel 
anchor-create-new-excel-file
**/
using IronXL;
static void Main(string [] args)
{
    //create new WorkBook
    WorkBook wb = WorkBook.Create();
    //Create new WorkSheet in wb
    WorkSheet ws = wb.CreateWorkSheet("sheet1");
    //Insert Data 
    ws ["A1"].Value = "New Value A1";
    ws ["B2"].Value = "New Value B2";
    //Save newly created Excel file
    wb.SaveAs("NewExcelFile.xlsx");
}
/**
Create New Excel 
anchor-create-new-excel-file
**/
using IronXL;
static void Main(string [] args)
{
    //create new WorkBook
    WorkBook wb = WorkBook.Create();
    //Create new WorkSheet in wb
    WorkSheet ws = wb.CreateWorkSheet("sheet1");
    //Insert Data 
    ws ["A1"].Value = "New Value A1";
    ws ["B2"].Value = "New Value B2";
    //Save newly created Excel file
    wb.SaveAs("NewExcelFile.xlsx");
}
'''
'''Create New Excel 
'''anchor-create-new-excel-file
'''*
Imports IronXL
Shared Sub Main(ByVal args() As String)
	'create new WorkBook
	Dim wb As WorkBook = WorkBook.Create()
	'Create new WorkSheet in wb
	Dim ws As WorkSheet = wb.CreateWorkSheet("sheet1")
	'Insert Data 
	ws ("A1").Value = "New Value A1"
	ws ("B2").Value = "New Value B2"
	'Save newly created Excel file
	wb.SaveAs("NewExcelFile.xlsx")
End Sub
$vbLabelText   $csharpLabel

上面的代码将创建一个名为NewExcelFile.xlsx的新Excel文件,并将新数据插入到单元格地址A1B1中,分别具有值New Value A1New Value B2。 通过这种设置,您可以根据需要插入同样的数据。 注意:如果您要创建一个新的 Excel 文件或修改现有文件,请不要忘记保存文件,如上例所示。 深入了解如何使用 C# 创建新的 Excel 电子表格,并在您的项目中尝试代码。


4. 修改现有的Excel文件

我们可以以编程方式修改现有的Excel文件,并在其中插入更新的数据。 在修改 Excel 文件时,我们将看到以下几个方面:

  • 更新单元格的值
  • 用新值替换旧值
  • 删除行或列

    让我们看看如何在我们的CSharp项目中实现上述主题。

更新单元格值

更新现有Excel电子表格的单元格值非常简单。 只需在项目中访问 Excel 文件并指定其工作表,然后按照下面的示例更新数据:

/**
Update Cell Value
anchor-update-cell-value
**/
using IronXL;
static void Main(string [] args)
{
    WorkBook wb = WorkBook.Load("sample.xlsx");
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //update A3 value
    ws ["A3"].Value = "New Value of A3";
    wb.SaveAs("sample.xlsx");
}
/**
Update Cell Value
anchor-update-cell-value
**/
using IronXL;
static void Main(string [] args)
{
    WorkBook wb = WorkBook.Load("sample.xlsx");
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //update A3 value
    ws ["A3"].Value = "New Value of A3";
    wb.SaveAs("sample.xlsx");
}
'''
'''Update Cell Value
'''anchor-update-cell-value
'''*
Imports IronXL
Shared Sub Main(ByVal args() As String)
	Dim wb As WorkBook = WorkBook.Load("sample.xlsx")
	Dim ws As WorkSheet = wb.GetWorkSheet("Sheet1")
	'update A3 value
	ws ("A3").Value = "New Value of A3"
	wb.SaveAs("sample.xlsx")
End Sub
$vbLabelText   $csharpLabel

上述代码将用New Value of A3更新单元格A3的值。

我们还可以使用 range 函数将多个单元格更新为静态值:

 ws ["A3:C3"].Value = "New Value";
 ws ["A3:C3"].Value = "New Value";
ws ("A3:C3").Value = "New Value"
$vbLabelText   $csharpLabel

这将更新 Excel 文件中第 3 行的单元格,从 A3C3,替换为 New Value

通过这些示例了解有关在 C# 中使用 Range 函数 的更多信息。

替换单元格值

IronXL 的美妙之处在于,我们可以轻松地将现有 Excel 文件中的旧值替换为新值,并涵盖以下所有方面:

  • 替换整个工作表的值:
 WorkSheet.Replace("old value", "new value");
 WorkSheet.Replace("old value", "new value");
WorkSheet.Replace("old value", "new value")
$vbLabelText   $csharpLabel
  • 替换特定行的值:
WorkSheet.Rows [RowIndex].Replace("old value", "new value");
WorkSheet.Rows [RowIndex].Replace("old value", "new value");
WorkSheet.Rows (RowIndex).Replace("old value", "new value")
$vbLabelText   $csharpLabel
  • 替换特定列的值:
WorkSheet.Columns [ColumnIndex].Replace("old value", "new Value")
WorkSheet.Columns [ColumnIndex].Replace("old value", "new Value")
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'WorkSheet.Columns [ColumnIndex].Replace("old value", "new Value")
$vbLabelText   $csharpLabel
  • 替换特定范围内的值:
WorkSheet ["From:To"].Replace("old value", "new value");
WorkSheet ["From:To"].Replace("old value", "new value");
WorkSheet ("From:To").Replace("old value", "new value")
$vbLabelText   $csharpLabel

让我们看一个例子,清楚地了解如何在我们的CSharp项目中使用上述功能来替换值。 为此,我们将使用 replace 函数来替换特定范围内的值。

/**
Replace Cell Value Range
anchor-replace-cell-values
**/
using IronXL;
static void Main(string [] args)
{
    WorkBook wb = WorkBook.Load("sample.xlsx");
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //Specifying Range from B5 to G5
    ws ["B5:G5"].Replace("Normal", "Good");
    wb.SaveAs("sample.xlsx");
}
/**
Replace Cell Value Range
anchor-replace-cell-values
**/
using IronXL;
static void Main(string [] args)
{
    WorkBook wb = WorkBook.Load("sample.xlsx");
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //Specifying Range from B5 to G5
    ws ["B5:G5"].Replace("Normal", "Good");
    wb.SaveAs("sample.xlsx");
}
'''
'''Replace Cell Value Range
'''anchor-replace-cell-values
'''*
Imports IronXL
Shared Sub Main(ByVal args() As String)
	Dim wb As WorkBook = WorkBook.Load("sample.xlsx")
	Dim ws As WorkSheet = wb.GetWorkSheet("Sheet1")
	'Specifying Range from B5 to G5
	ws ("B5:G5").Replace("Normal", "Good")
	wb.SaveAs("sample.xlsx")
End Sub
$vbLabelText   $csharpLabel

上述代码将把Normal值替换为Good,范围是从B5G5,工作表的其他部分将保持不变。 了解更多关于如何编辑范围内的Excel单元格值以及使用IronXL的此功能。

删除 Excel 文件的行

在应用程序开发中,我们有时需要以编程方式删除现有Excel文件的整行。 对于此任务,我们使用IronXL的RemoveRow()函数。 这里有一个例子:

/**
Remove Row
anchor-remove-rows-of-excel-file
**/
using IronXL;
static void Main(string [] args)
{ 
    WorkBook wb = WorkBook.Load("sample.xlsx");
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //Remove the row number 2
    ws.Rows [2].RemoveRow();
    wb.SaveAs("sample.xlsx");
}
/**
Remove Row
anchor-remove-rows-of-excel-file
**/
using IronXL;
static void Main(string [] args)
{ 
    WorkBook wb = WorkBook.Load("sample.xlsx");
    WorkSheet ws = wb.GetWorkSheet("Sheet1");
    //Remove the row number 2
    ws.Rows [2].RemoveRow();
    wb.SaveAs("sample.xlsx");
}
'''
'''Remove Row
'''anchor-remove-rows-of-excel-file
'''*
Imports IronXL
Shared Sub Main(ByVal args() As String)
	Dim wb As WorkBook = WorkBook.Load("sample.xlsx")
	Dim ws As WorkSheet = wb.GetWorkSheet("Sheet1")
	'Remove the row number 2
	ws.Rows (2).RemoveRow()
	wb.SaveAs("sample.xlsx")
End Sub
$vbLabelText   $csharpLabel

上述代码将删除sample.xlsx的第2行。


教程快速访问

IronXL 参考资料

阅读《IronXL 应用程序接口参考》,进一步了解所有功能、特性、类和命名空间。

IronXL 参考资料
Documentation related to 教程快速访问
查克尼特·宾
软件工程师
Chaknith 负责 IronXL 和 IronBarcode 的工作。他在 C# 和 .NET 方面拥有深厚的专业知识,帮助改进软件并支持客户。他从用户互动中获得的洞察力,有助于提升产品、文档和整体体验。