在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在本文中,我们将研究 IronXL 和 EPPlus 软件之间的异同。
对于大多数组织而言,Microsoft Excel 已被证明是一个非常有用的工具。 Excel 文件(如数据库)在单元格中包含数据,因此可以轻松管理需要存储的数据。
Excel 也使用 .xls 和 .xlsx 文件格式。 C# 语言会让 Excel 文件的管理变得困难。 然而,IronXL 和 EPPlus 软件使这些流程的处理变得更加容易。
使用该软件时不需要 Microsoft Office。
请注意,您可以使用 C# 阅读和创建 Excel 文件,而无需安装 Microsoft Office。今天,我们将介绍一些易于实现的不同选项。
ExcelPackage
读取 Excel 文件的 Epplus C# 类从数据表载入
方法EPPlus 是一个基于 NuGet 的 .NET Framework/.NET Core 库,用于处理 Office Open XML 电子表格。 第 5 版支持 .NET Framework 3.5 和 .NET Core 2.0。EPPlus 不依赖任何其他库,如 Microsoft Excel。
EPPlus 有一个 API,可以让您使用 Office Excel 文档。 EPPlus 是一个 .NET 库,用于读写 Office OpenXML 格式的 Excel 文件。 该库以软件包的形式从 NuGet 提供。
该库是以程序员为中心创建的。 我们的目标一直是让熟悉 Excel 或其他电子表格库的开发人员能够快速掌握 API。 或者,就像有人说的那样,"IntelliSense 你的胜利之路!"
要从 Visual Studio 安装 EPPlus,请转到 "视图">"其他 Windows">"软件包管理器控制台",然后键入以下命令:
`PM> 安装-打包 EPPlus``
如果您希望使用 .NET CLI,请从高架命令提示符或 PowerShell 提示符运行以下命令:
PM> dotnet add package EPPlus
.
EPPlus 是一个 dotnet 软件包,您可以将其添加到您的项目中。
IronXL for .NET 是一个简单的 C# 和 VB Excel API,可让您以迅雷不及掩耳之势在 .NET 中读取、编辑和创建 Excel 电子表格文件。 无需安装 Microsoft Office 或 Excel Interop。该库也可用于处理 Excel 文件。
IronXL 支持 .NET Core、.NET Framework、Xamarin、Mobile、Linux、macOS 和 Azure。
电子表格有多种不同的数据读写方式。
我们可以通过三种方式之一将 IronXL 软件包添加到您的账户,您可以选择最适合您的方式。
使用软件包管理器控制台安装 IronXL
使用以下命令打开项目中的软件包管理器控制台:
要访问软件包管理器控制台,请访问工具 => NuGet 软件包管理器 => 软件包管理器控制台。
这将带您进入软件包管理器控制台。 然后,在软件包管理器终端上键入以下命令:
PM > 安装-软件包 IronXL.Excel
.
使用 NuGet 软件包管理器安装 IronXL
这是一种让 NuGet 包管理器安装的不同方法。 如果您之前已经使用前一种方法完成了安装,则无需使用这种方法。
要访问 NuGet 包管理器,请转到工具 > NuGet 包管理器 => 从下拉菜单中选择管理解决方案的 NuGet 包。
这将启动 NuGet 解决方案; 选择 "浏览 "并查找 IronXL。
在搜索栏中输入 Excel:
点击 "安装 "按钮后,IronXL 将为您安装。 安装 IronXL 后,您就可以进入表单开始开发了。
使用 IronXL.Excel 制作新 Excel 工作簿再简单不过了! 只是一行代码! 是的,这是真的:
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
IronXL 可以创建 XLS 格式的文件(较早的 Excel 文件版本)和 XLSX(当前和更新的 Excel 文件版本)格式。
设置默认工作表
设置默认工作表更简单:
var sheet = workbook.CreateWorkSheet("2020年预算");
在上述代码片段中,工作表以 "Sheet "表示,您可以用它来设置单元格值,并做 Excel 能做的几乎所有事情。 您还可以将 Excel 文档编码为只读文件并执行删除操作。 您还可以像 Excel 一样链接工作表。
如果您不清楚工作簿和工作表的区别,请允许我向您解释一下。
工作表包含在工作簿中。 这意味着您可以在一个工作簿中放置任意多的工作表。 我将在后面的文章中介绍如何做到这一点。 行和列组成工作表。 行和列的交叉点称为单元格,您将在 Excel 中与单元格进行交互。
EPPlus 可用于创建 Excel 文件并执行各种操作,如创建数据透视表、数据透视区域,甚至是条件格式化和更改字体。 废话不多说,下面是将普通 DataTable 转换为 XLSX Excel 文件并发送给用户下载的全部源代码:
public ActionResult ConvertToXLSX()
{
byte [] fileData = null;
// replace the GetDataTable() method with your DBMS-fetching code.
using (DataTable dt = GetDataTable())
{
// create an empty spreadsheet
using (var p = new ExcelPackage())
{
// add a worksheet to the spreadsheet
ExcelWorksheet ws = p.Workbook.Worksheets.Add(dt.TableName);
// Initialize rows and cols counter: note that they are 1-based!
var row = 1;
var col = 1;
// Create the column names on the first line.
// In this sample we'll just use the DataTable colum names
row = 1;
col = 0;
foreach (DataColumn dc in dt.Columns)
{
col++;
ws.SetValue(row, col, dc.ColumnName);
}
// Insert the DataTable rows to the XLS file
foreach (DataRow r in dt.Rows)
{
row++;
col = 0;
foreach (DataColumn dc in dt.Columns)
{
col++;
ws.SetValue(row, col, r [dc].ToString());
}
// alternate light-gray color for uneven rows (3, 5, 7, 9)...
if (row % 2 != 0)
{
ws.Row(row).Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
ws.Row(row).Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
}
}
// output the XLSX file
using (var ms = new MemoryStream())
{
p.SaveAs(ms);
ms.Seek(0, SeekOrigin.Begin);
fileData = ms.ToArray();
}
}
}
string fileName = "ConvertedFile.xlsx";
string contentType = System.Web.MimeMapping.GetMimeMapping(fileName);
Response.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", fileName));
return File(fileData, contentType);
}
public ActionResult ConvertToXLSX()
{
byte [] fileData = null;
// replace the GetDataTable() method with your DBMS-fetching code.
using (DataTable dt = GetDataTable())
{
// create an empty spreadsheet
using (var p = new ExcelPackage())
{
// add a worksheet to the spreadsheet
ExcelWorksheet ws = p.Workbook.Worksheets.Add(dt.TableName);
// Initialize rows and cols counter: note that they are 1-based!
var row = 1;
var col = 1;
// Create the column names on the first line.
// In this sample we'll just use the DataTable colum names
row = 1;
col = 0;
foreach (DataColumn dc in dt.Columns)
{
col++;
ws.SetValue(row, col, dc.ColumnName);
}
// Insert the DataTable rows to the XLS file
foreach (DataRow r in dt.Rows)
{
row++;
col = 0;
foreach (DataColumn dc in dt.Columns)
{
col++;
ws.SetValue(row, col, r [dc].ToString());
}
// alternate light-gray color for uneven rows (3, 5, 7, 9)...
if (row % 2 != 0)
{
ws.Row(row).Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
ws.Row(row).Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
}
}
// output the XLSX file
using (var ms = new MemoryStream())
{
p.SaveAs(ms);
ms.Seek(0, SeekOrigin.Begin);
fileData = ms.ToArray();
}
}
}
string fileName = "ConvertedFile.xlsx";
string contentType = System.Web.MimeMapping.GetMimeMapping(fileName);
Response.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", fileName));
return File(fileData, contentType);
}
Public Function ConvertToXLSX() As ActionResult
Dim fileData() As Byte = Nothing
' replace the GetDataTable() method with your DBMS-fetching code.
Using dt As DataTable = GetDataTable()
' create an empty spreadsheet
Using p = New ExcelPackage()
' add a worksheet to the spreadsheet
Dim ws As ExcelWorksheet = p.Workbook.Worksheets.Add(dt.TableName)
' Initialize rows and cols counter: note that they are 1-based!
Dim row = 1
Dim col = 1
' Create the column names on the first line.
' In this sample we'll just use the DataTable colum names
row = 1
col = 0
For Each dc As DataColumn In dt.Columns
col += 1
ws.SetValue(row, col, dc.ColumnName)
Next dc
' Insert the DataTable rows to the XLS file
For Each r As DataRow In dt.Rows
row += 1
col = 0
For Each dc As DataColumn In dt.Columns
col += 1
ws.SetValue(row, col, r (dc).ToString())
Next dc
' alternate light-gray color for uneven rows (3, 5, 7, 9)...
If row Mod 2 <> 0 Then
ws.Row(row).Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid
ws.Row(row).Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray)
End If
Next r
' output the XLSX file
Using ms = New MemoryStream()
p.SaveAs(ms)
ms.Seek(0, SeekOrigin.Begin)
fileData = ms.ToArray()
End Using
End Using
End Using
Dim fileName As String = "ConvertedFile.xlsx"
Dim contentType As String = System.Web.MimeMapping.GetMimeMapping(fileName)
Response.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", fileName))
Return File(fileData, contentType)
End Function
如您所见,这是一个 ActionResult 方法,可用于任何 ASP.NET MVC 控制器; 如果您没有使用 ASP.NET MVC,只需复制方法内容并粘贴到您需要的地方即可(经典 ASP.NET、控制台应用程序、Windows 窗体等).
代码是不言自明的,有足够的注释帮助您理解各种处理过程。 但首先,我们要快速回顾一下我们在这里的工作:
我们创建 HTML 答案,并将 XLSX 文件以附件内容处置方式发送给用户,使浏览器自动下载文件。
IronXL 在这种情况下胜出,因为创建过程非常简单--只需要一行代码就可以了; EPPlus 提供的代码行既枯燥又难以调试,而 EPPlus 提供的代码行则有助于节省时间和调试。
EPPlus 支持使用 Excel 文件。 这是一个读写 Excel 文件的 .net 库。
阅读 Excel 文件
为此,您需要先安装 EPPlus 软件包:进入 "工具"->"NuGet 软件包管理器"->"管理此解决方案的 NuGet"->"安装 EPPlus" ->"Install EPPlus" ->"Install EPPlus" ->"Install EPPlus" ->"Install EP 在 "浏览 "选项卡中搜索 "EPPlus",然后安装 NuGet 软件包。
安装软件包后,您可以在控制台应用程序 "Program.cs "中使用下面的代码。
using OfficeOpenXml;
using System;
using System.IO;
namespace ReadExcelInCsharp
{
class Program
{
static void Main(string [] args)
{
//provide file path
FileInfo existingFile = new FileInfo(@"D:\sample_XLSX.xlsx");
//use EPPlus
using (ExcelPackage package = new ExcelPackage(existingFile))
{
//get the first worksheet in the workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets [1];
int colCount = worksheet.Dimension.End.Column; //get Column Count
int rowCount = worksheet.Dimension.End.Row; //get row count
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
//Print data, based on row and columns position
Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells [row, col].Value?.ToString().Trim());
}
}
}
}
}
}
using OfficeOpenXml;
using System;
using System.IO;
namespace ReadExcelInCsharp
{
class Program
{
static void Main(string [] args)
{
//provide file path
FileInfo existingFile = new FileInfo(@"D:\sample_XLSX.xlsx");
//use EPPlus
using (ExcelPackage package = new ExcelPackage(existingFile))
{
//get the first worksheet in the workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets [1];
int colCount = worksheet.Dimension.End.Column; //get Column Count
int rowCount = worksheet.Dimension.End.Row; //get row count
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
//Print data, based on row and columns position
Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells [row, col].Value?.ToString().Trim());
}
}
}
}
}
}
Imports OfficeOpenXml
Imports System
Imports System.IO
Namespace ReadExcelInCsharp
Friend Class Program
Shared Sub Main(ByVal args() As String)
'provide file path
Dim existingFile As New FileInfo("D:\sample_XLSX.xlsx")
'use EPPlus
Using package As New ExcelPackage(existingFile)
'get the first worksheet in the workbook
Dim worksheet As ExcelWorksheet = package.Workbook.Worksheets (1)
Dim colCount As Integer = worksheet.Dimension.End.Column 'get Column Count
Dim rowCount As Integer = worksheet.Dimension.End.Row 'get row count
For row As Integer = 1 To rowCount
For col As Integer = 1 To colCount
'Print data, based on row and columns position
Console.WriteLine(" Row:" & row & " column:" & col & " Value:" & worksheet.Cells (row, col).Value?.ToString().Trim())
Next col
Next row
End Using
End Sub
End Class
End Namespace
下面是一个控制台应用程序输出的示例,其中包含一个 excel 文件样本(.xlsx)我们的合作对象 以下是使用 EPPlus 在 C# 中阅读的 xlsx 文件。
使用 "单元格 "属性可以访问以下从多个来源加载数据的方法(范围):
LoadFromArrays - 从对象的 IEnumerable 中加载数据[]将对象数组转换为一个范围,每个对象数组对应工作表中的一行。
使用这些方法时,您可以选择提供一个参数来生成 Excel 表格。 示例项目 Sample-.NET Framework 或 Sample-.NET Framework 中的示例 4 和示例 5 包含更广泛的示例。
编写 Excel 文件
接下来,让我们看看能否将数据导出到新的 Excel 文件。
以下是我们希望保存为 Excel 文档的一些示例数据/对象。
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="9999", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="8888", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="7777", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="6666", Name="LMNO", City ="City4", Country="UK"},
};
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="9999", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="8888", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="7777", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="6666", Name="LMNO", City ="City4", Country="UK"},
};
Dim persons As New List(Of UserDetails)() From {
New UserDetails() With {
.ID="9999",
.Name="ABCD",
.City ="City1",
.Country="USA"
},
New UserDetails() With {
.ID="8888",
.Name="PQRS",
.City ="City2",
.Country="INDIA"
},
New UserDetails() With {
.ID="7777",
.Name="XYZZ",
.City ="City3",
.Country="CHINA"
},
New UserDetails() With {
.ID="6666",
.Name="LMNO",
.City ="City4",
.Country="UK"
}
}
要创建一个包含基本信息的新 Excel 文件,我们必须使用 ExcelPackage 类。 将数据写入文件并生成新的 Excel 电子表格只需要几行代码。 请注意下面的一行,它可以将 DataTables 加载到 Excel 表单中。
为了简单起见,我在同一个项目文件夹中生成一个新的电子表格文件(Excel 文件将在项目的 "bin "文件夹中生成). 源代码如下:
private static void WriteToExcel(string path)
{
//Let use below test data for writing it to excel
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="9999", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="8888", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="7777", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="6666", Name="LMNO", City ="City4", Country="UK"},
};
// let's convert our object data to Datatable for a simplified logic.
// Datatable is the easiest way to deal with complex datatypes for easy reading and formatting.
DataTable table = (DataTable)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (typeof(DataTable)));
FileInfo filePath = new FileInfo(path);
using (var excelPack = new ExcelPackage(filePath))
{
var ws = excelPack.Workbook.Worksheets.Add("WriteTest");
ws.Cells.LoadFromDataTable(table, true, OfficeOpenXml.Table.TableStyles.Light8);
excelPack.Save();
}
}
private static void WriteToExcel(string path)
{
//Let use below test data for writing it to excel
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="9999", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="8888", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="7777", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="6666", Name="LMNO", City ="City4", Country="UK"},
};
// let's convert our object data to Datatable for a simplified logic.
// Datatable is the easiest way to deal with complex datatypes for easy reading and formatting.
DataTable table = (DataTable)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (typeof(DataTable)));
FileInfo filePath = new FileInfo(path);
using (var excelPack = new ExcelPackage(filePath))
{
var ws = excelPack.Workbook.Worksheets.Add("WriteTest");
ws.Cells.LoadFromDataTable(table, true, OfficeOpenXml.Table.TableStyles.Light8);
excelPack.Save();
}
}
Private Shared Sub WriteToExcel(ByVal path As String)
'Let use below test data for writing it to excel
Dim persons As New List(Of UserDetails)() From {
New UserDetails() With {
.ID="9999",
.Name="ABCD",
.City ="City1",
.Country="USA"
},
New UserDetails() With {
.ID="8888",
.Name="PQRS",
.City ="City2",
.Country="INDIA"
},
New UserDetails() With {
.ID="7777",
.Name="XYZZ",
.City ="City3",
.Country="CHINA"
},
New UserDetails() With {
.ID="6666",
.Name="LMNO",
.City ="City4",
.Country="UK"
}
}
' let's convert our object data to Datatable for a simplified logic.
' Datatable is the easiest way to deal with complex datatypes for easy reading and formatting.
Dim table As DataTable = CType(JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (GetType(DataTable))), DataTable)
Dim filePath As New FileInfo(path)
Using excelPack = New ExcelPackage(filePath)
Dim ws = excelPack.Workbook.Worksheets.Add("WriteTest")
ws.Cells.LoadFromDataTable(table, True, OfficeOpenXml.Table.TableStyles.Light8)
excelPack.Save()
End Using
End Sub
在调用上述 API 进行数据验证后,将创建一个新的 Excel 文件,并将上述自定义对象转换到相应的 Excel 列和行中,以显示以下值。
上述即用型 API 可用于.NET Core 控制台、测试项目或 ASP.NET Core 应用程序,其逻辑可根据您的需要进行更改。
可使用 "单元格 "属性访问这些技术(范围):
值 - 返回或设置范围的值。
GetValue 和 SetValue 方法也可直接用于工作表对象。 (这比在靶场上读取/写入的效果要好一些):
SetValue - 更改单个单元格的值。
Linq 可用来查询工作表中的数据,因为单元格属性实现了 IEnumerable 接口。
IronXL 是一个.NET 库,允许 C# 开发人员快速、轻松地处理 Excel、数据透视表和其他电子表格文件。
不要求 Office Interop。 没有特别的依赖性,也不需要在 Core 或 Azure 上安装 Microsoft Office。
IronXL 是适用于 .NET core 和 .NET Framework 的著名 C# 和 VB.NET xl 电子表格库。
待加载工作表
Excel 工作表由 WorkBook 类表示。 我们利用 WorkBook 用 C# 打开 Excel 文件,其中甚至包含数据透视表。 加载 Excel 文件并选择其位置(.xlsx).
/**
Load WorkBook
anchor-load-a-workbook
**/
var workbook = WorkBook.Load(@"Spreadsheets\\GDP.xlsx");
/**
Load WorkBook
anchor-load-a-workbook
**/
var workbook = WorkBook.Load(@"Spreadsheets\\GDP.xlsx");
'''
'''Load WorkBook
'''anchor-load-a-workbook
'''*
Dim workbook = WorkBook.Load("Spreadsheets\\GDP.xlsx")
在许多工作簿中都可以找到 WorkSheet 对象。 这些是 Excel 文档的工作表。 如果工作表包含工作表,请使用 WorkBook 名称查找。 GetWorkSheet。
var worksheet = workbook.GetWorkSheet("GDPByCountry");
var worksheet = workbook.GetWorkSheet("GDPByCountry");
Dim worksheet = workbook.GetWorkSheet("GDPByCountry")
**制作您自己的工作手册。
使用工作表类型构建新的工作簿,以便在内存中生成新的工作簿。
/**
Create WorkBook
anchor-create-a-workbook
**/
var workbook = new WorkBook(ExcelFileFormat.XLSX);
/**
Create WorkBook
anchor-create-a-workbook
**/
var workbook = new WorkBook(ExcelFileFormat.XLSX);
'''
'''Create WorkBook
'''anchor-create-a-workbook
'''*
Dim workbook As New WorkBook(ExcelFileFormat.XLSX)
对于老式 Microsoft Excel 电子表格,请使用 ExcelFileFormat.XLS(95 及更早).
**如果您还没有工作表,请制作一个。
每本 "工作手册 "中可以有许多 "工作表"。WorkSheet "是单个数据表,而 "WorkBook "是 WorkSheet 的集合。 在 Excel 中,有两个工作表的工作簿是这样的。
工作簿是您可以创建的新工作表的名称。
var worksheet = workbook.CreateWorkSheet("Countries");
var worksheet = workbook.CreateWorkSheet("Countries");
Dim worksheet = workbook.CreateWorkSheet("Countries")
将工作表名称传递给 CreateWorkSheet。
获取蜂窝范围
单元格 "对象的二维集合由 "Range "类表示。 它表示 Excel 单元格的特定范围。 使用 WorkSheet 对象上的字符串索引器,您可以获得范围。
var range = worksheet ["D2:D101"];
var range = worksheet ["D2:D101"];
Dim range = worksheet ("D2:D101")
参数文本可以是单元格的坐标(例如,"A1)或从左到右、从上到下的单元格范围(例如:"B2:E5"). GetRange 也可以从工作表中调用。
在范围内编辑单元格值
可以通过多种方式读取或编辑范围内单元格的值。 如果已知计数,请使用 For 循环。 您也可以在此处进行单元格样式设计。
/**
Edit Cell Values in Range
anchor-edit-cell-values-within-a-range
**/
//Iterate through the rows
for (var y = 2; y <= 101; y++)
{
var result = new PersonValidationResult { Row = y };
results.Add(result);
//Get all cells for the person
var cells = worksheet [$"A{y}:E{y}"].ToList();
//Validate the phone number (1 = B)
var phoneNumber = cells [1].Value;
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, (string)phoneNumber);
//Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress((string)cells [3].Value);
//Get the raw date in the format of Month Day [suffix], Year (4 = E)
var rawDate = (string)cells [4].Value;
result.DateErrorMessage = ValidateDate(rawDate);
}
/**
Edit Cell Values in Range
anchor-edit-cell-values-within-a-range
**/
//Iterate through the rows
for (var y = 2; y <= 101; y++)
{
var result = new PersonValidationResult { Row = y };
results.Add(result);
//Get all cells for the person
var cells = worksheet [$"A{y}:E{y}"].ToList();
//Validate the phone number (1 = B)
var phoneNumber = cells [1].Value;
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, (string)phoneNumber);
//Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress((string)cells [3].Value);
//Get the raw date in the format of Month Day [suffix], Year (4 = E)
var rawDate = (string)cells [4].Value;
result.DateErrorMessage = ValidateDate(rawDate);
}
'''
'''Edit Cell Values in Range
'''anchor-edit-cell-values-within-a-range
'''*
'Iterate through the rows
For y = 2 To 101
Dim result = New PersonValidationResult With {.Row = y}
results.Add(result)
'Get all cells for the person
Dim cells = worksheet ($"A{y}:E{y}").ToList()
'Validate the phone number (1 = B)
Dim phoneNumber = cells (1).Value
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, CStr(phoneNumber))
'Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress(CStr(cells (3).Value))
'Get the raw date in the format of Month Day [suffix], Year (4 = E)
Dim rawDate = CStr(cells (4).Value)
result.DateErrorMessage = ValidateDate(rawDate)
Next y
验证电子表格中的数据
要验证数据表,请使用 IronXL。 DataValidation 示例使用 libphonenumber-CSharp 验证电话号码,使用常规 C# API 验证电子邮件地址和日期。
/**
Validate Spreadsheet Data
anchor-validate-spreadsheet-data
**/
//Iterate through the rows
for (var i = 2; i <= 101; i++)
{
var result = new PersonValidationResult { Row = i };
results.Add(result);
//Get all cells for the person
var cells = worksheet [$"A{i}:E{i}"].ToList();
//Validate the phone number (1 = B)
var phoneNumber = cells [1].Value;
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, (string)phoneNumber);
//Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress((string)cells [3].Value);
//Get the raw date in the format of Month Day [suffix], Year (4 = E)
var rawDate = (string)cells [4].Value;
result.DateErrorMessage = ValidateDate(rawDate);
}
/**
Validate Spreadsheet Data
anchor-validate-spreadsheet-data
**/
//Iterate through the rows
for (var i = 2; i <= 101; i++)
{
var result = new PersonValidationResult { Row = i };
results.Add(result);
//Get all cells for the person
var cells = worksheet [$"A{i}:E{i}"].ToList();
//Validate the phone number (1 = B)
var phoneNumber = cells [1].Value;
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, (string)phoneNumber);
//Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress((string)cells [3].Value);
//Get the raw date in the format of Month Day [suffix], Year (4 = E)
var rawDate = (string)cells [4].Value;
result.DateErrorMessage = ValidateDate(rawDate);
}
'''
'''Validate Spreadsheet Data
'''anchor-validate-spreadsheet-data
'''*
'Iterate through the rows
For i = 2 To 101
Dim result = New PersonValidationResult With {.Row = i}
results.Add(result)
'Get all cells for the person
Dim cells = worksheet ($"A{i}:E{i}").ToList()
'Validate the phone number (1 = B)
Dim phoneNumber = cells (1).Value
result.PhoneNumberErrorMessage = ValidatePhoneNumber(phoneNumberUtil, CStr(phoneNumber))
'Validate the email address (3 = D)
result.EmailErrorMessage = ValidateEmailAddress(CStr(cells (3).Value))
'Get the raw date in the format of Month Day [suffix], Year (4 = E)
Dim rawDate = CStr(cells (4).Value)
result.DateErrorMessage = ValidateDate(rawDate)
Next i
上面的代码在电子表格的行中循环,以列表的形式抓取单元格。每个验证方法都会验证单元格的值,如果值不正确,则返回错误。
该代码将创建新工作表、指定页眉并生成错误信息结果,以便保存错误数据日志。
var resultsSheet = workbook.CreateWorkSheet("Results");
resultsSheet ["A1"].Value = "Row";
resultsSheet ["B1"].Value = "Valid";
resultsSheet ["C1"].Value = "Phone Error";
resultsSheet ["D1"].Value = "Email Error";
resultsSheet ["E1"].Value = "Date Error";
for (var i = 0; i < results.Count; i++)
{
var result = results [i];
resultsSheet [$"A{i + 2}"].Value = result.Row;
resultsSheet [$"B{i + 2}"].Value = result.IsValid ? "Yes" : "No";
resultsSheet [$"C{i + 2}"].Value = result.PhoneNumberErrorMessage;
resultsSheet [$"D{i + 2}"].Value = result.EmailErrorMessage;
resultsSheet [$"E{i + 2}"].Value = result.DateErrorMessage;
}
workbook.SaveAs(@"Spreadsheets\\PeopleValidated.xlsx");
var resultsSheet = workbook.CreateWorkSheet("Results");
resultsSheet ["A1"].Value = "Row";
resultsSheet ["B1"].Value = "Valid";
resultsSheet ["C1"].Value = "Phone Error";
resultsSheet ["D1"].Value = "Email Error";
resultsSheet ["E1"].Value = "Date Error";
for (var i = 0; i < results.Count; i++)
{
var result = results [i];
resultsSheet [$"A{i + 2}"].Value = result.Row;
resultsSheet [$"B{i + 2}"].Value = result.IsValid ? "Yes" : "No";
resultsSheet [$"C{i + 2}"].Value = result.PhoneNumberErrorMessage;
resultsSheet [$"D{i + 2}"].Value = result.EmailErrorMessage;
resultsSheet [$"E{i + 2}"].Value = result.DateErrorMessage;
}
workbook.SaveAs(@"Spreadsheets\\PeopleValidated.xlsx");
Dim resultsSheet = workbook.CreateWorkSheet("Results")
resultsSheet ("A1").Value = "Row"
resultsSheet ("B1").Value = "Valid"
resultsSheet ("C1").Value = "Phone Error"
resultsSheet ("D1").Value = "Email Error"
resultsSheet ("E1").Value = "Date Error"
For i = 0 To results.Count - 1
Dim result = results (i)
resultsSheet ($"A{i + 2}").Value = result.Row
resultsSheet ($"B{i + 2}").Value = If(result.IsValid, "Yes", "No")
resultsSheet ($"C{i + 2}").Value = result.PhoneNumberErrorMessage
resultsSheet ($"D{i + 2}").Value = result.EmailErrorMessage
resultsSheet ($"E{i + 2}").Value = result.DateErrorMessage
Next i
workbook.SaveAs("Spreadsheets\\PeopleValidated.xlsx")
使用实体框架导出数据
使用 IronXL 将 Excel 电子表格转换为数据库,或将数据导出到数据库。 ExcelToDB 示例读取包含各国国内生产总值的电子表格,并将其导出到 SQLite。
它使用 EntityFramework 创建数据库,然后逐行导出数据。
应安装 SQLite Entity Framework NuGet 软件包。
您可以使用 EntityFramework 构建一个可以向数据库导出数据的模型对象。
public class Country
{
[Key]
public Guid Key { get; set; }
public string Name { get; set; }
public decimal GDP { get; set; }
}
public class Country
{
[Key]
public Guid Key { get; set; }
public string Name { get; set; }
public decimal GDP { get; set; }
}
Public Class Country
<Key>
Public Property Key() As Guid
Public Property Name() As String
Public Property GDP() As Decimal
End Class
要使用不同的数据库,请安装相应的 NuGet 软件包,并查找 UseSqLite 的等效版本().
/**
Export Data using Entity Framework
anchor-export-data-using-entity-framework
**/
public class CountryContext : DbContext
{
public DbSet<Country> Countries { get; set; }
public CountryContext()
{
//TODO: Make async
Database.EnsureCreated();
}
/// <summary>
/// Configure context to use Sqlite
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connection = new SqliteConnection($"Data Source=Country.db");
connection.Open();
var command = connection.CreateCommand();
//Create the database if it doesn't already exist
command.CommandText = $"PRAGMA foreign_keys = ON;";
command.ExecuteNonQuery();
optionsBuilder.UseSqlite(connection);
base.OnConfiguring(optionsBuilder);
}
}
/**
Export Data using Entity Framework
anchor-export-data-using-entity-framework
**/
public class CountryContext : DbContext
{
public DbSet<Country> Countries { get; set; }
public CountryContext()
{
//TODO: Make async
Database.EnsureCreated();
}
/// <summary>
/// Configure context to use Sqlite
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connection = new SqliteConnection($"Data Source=Country.db");
connection.Open();
var command = connection.CreateCommand();
//Create the database if it doesn't already exist
command.CommandText = $"PRAGMA foreign_keys = ON;";
command.ExecuteNonQuery();
optionsBuilder.UseSqlite(connection);
base.OnConfiguring(optionsBuilder);
}
}
'''
'''Export Data using Entity Framework
'''anchor-export-data-using-entity-framework
'''*
Public Class CountryContext
Inherits DbContext
Public Property Countries() As DbSet(Of Country)
Public Sub New()
'TODO: Make async
Database.EnsureCreated()
End Sub
''' <summary>
''' Configure context to use Sqlite
''' </summary>
''' <param name="optionsBuilder"></param>
Protected Overrides Sub OnConfiguring(ByVal optionsBuilder As DbContextOptionsBuilder)
Dim connection = New SqliteConnection($"Data Source=Country.db")
connection.Open()
Dim command = connection.CreateCommand()
'Create the database if it doesn't already exist
command.CommandText = $"PRAGMA foreign_keys = ON;"
command.ExecuteNonQuery()
optionsBuilder.UseSqlite(connection)
MyBase.OnConfiguring(optionsBuilder)
End Sub
End Class
生成 CountryContext,然后遍历范围以创建每个条目,最后使用 SaveAsync 将数据保存到数据库。
public async Task ProcessAsync()
{
//Get the first worksheet
var workbook = WorkBook.Load(@"Spreadsheets\\GDP.xlsx");
var worksheet = workbook.GetWorkSheet("GDPByCountry");
//Create the database connection
using (var countryContext = new CountryContext())
{
//Iterate through all the cells
for (var i = 2; i <= 213; i++)
{
//Get the range from A-B
var range = worksheet [$"A{i}:B{i}"].ToList();
//Create a Country entity to be saved to the database
var country = new Country
{
Name = (string)range [0].Value,
GDP = (decimal)(double)range [1].Value
};
//Add the entity
await countryContext.Countries.AddAsync(country);
}
//Commit changes to the database
await countryContext.SaveChangesAsync();
}
}
public async Task ProcessAsync()
{
//Get the first worksheet
var workbook = WorkBook.Load(@"Spreadsheets\\GDP.xlsx");
var worksheet = workbook.GetWorkSheet("GDPByCountry");
//Create the database connection
using (var countryContext = new CountryContext())
{
//Iterate through all the cells
for (var i = 2; i <= 213; i++)
{
//Get the range from A-B
var range = worksheet [$"A{i}:B{i}"].ToList();
//Create a Country entity to be saved to the database
var country = new Country
{
Name = (string)range [0].Value,
GDP = (decimal)(double)range [1].Value
};
//Add the entity
await countryContext.Countries.AddAsync(country);
}
//Commit changes to the database
await countryContext.SaveChangesAsync();
}
}
Public Async Function ProcessAsync() As Task
'Get the first worksheet
Dim workbook = WorkBook.Load("Spreadsheets\\GDP.xlsx")
Dim worksheet = workbook.GetWorkSheet("GDPByCountry")
'Create the database connection
Using countryContext As New CountryContext()
'Iterate through all the cells
For i = 2 To 213
'Get the range from A-B
Dim range = worksheet ($"A{i}:B{i}").ToList()
'Create a Country entity to be saved to the database
Dim country As New Country With {
.Name = CStr(range (0).Value),
.GDP = CDec(CDbl(range (1).Value))
}
'Add the entity
Await countryContext.Countries.AddAsync(country)
Next i
'Commit changes to the database
Await countryContext.SaveChangesAsync()
End Using
End Function
将公式纳入电子表格
公式属性可用于设置单元格的公式。
//Iterate through all rows with a value
for (var y = 2; y < i; y++)
{
//Get the C cell
var cell = sheet [$"C{y}"].First();
//Set the formula for the Percentage of Total column
cell.Formula = $"=B{y}/B{i}";
}
//Iterate through all rows with a value
for (var y = 2; y < i; y++)
{
//Get the C cell
var cell = sheet [$"C{y}"].First();
//Set the formula for the Percentage of Total column
cell.Formula = $"=B{y}/B{i}";
}
'Iterate through all rows with a value
Dim y = 2
Do While y < i
'Get the C cell
Dim cell = sheet ($"C{y}").First()
'Set the formula for the Percentage of Total column
cell.Formula = $"=B{y}/B{i}"
y += 1
Loop
C 栏中的代码遍历每个状态并计算总百分比。
可将 API 中的数据下载到电子表格中
下面的调用中使用了 RestClient.Net,以进行 REST 调用。 它下载 JSON 并将其转换为 RestCountry 类型的 "列表"。然后,通过遍历每个国家,可以轻松地将 REST API 中的数据保存到 Excel 文件中。
/**
Data API to Spreadsheet
anchor-download-data-from-an-api-to-spreadsheet
**/
var client = new Client(new Uri("https://restcountries.eu/rest/v2/"));
List<RestCountry> countries = await client.GetAsync<List<RestCountry>>();
/**
Data API to Spreadsheet
anchor-download-data-from-an-api-to-spreadsheet
**/
var client = new Client(new Uri("https://restcountries.eu/rest/v2/"));
List<RestCountry> countries = await client.GetAsync<List<RestCountry>>();
'''
'''Data API to Spreadsheet
'''anchor-download-data-from-an-api-to-spreadsheet
'''*
Dim client As New Client(New Uri("https://restcountries.eu/rest/v2/"))
Dim countries As List(Of RestCountry) = Await client.GetAsync(Of List(Of RestCountry))()
来自应用程序接口的 JSON 数据如下所示:
下面的代码循环显示国家,并在电子表格中填入名称、人口、地区、数字代码和前 3 种语言。
for (var i = 2; i < countries.Count; i++)
{
var country = countries [i];
//Set the basic values
worksheet [$"A{i}"].Value = country.name;
worksheet [$"B{i}"].Value = country.population;
worksheet [$"G{i}"].Value = country.region;
worksheet [$"H{i}"].Value = country.numericCode;
//Iterate through languages
for (var x = 0; x < 3; x++)
{
if (x > (country.languages.Count - 1)) break;
var language = country.languages [x];
//Get the letter for the column
var columnLetter = GetColumnLetter(4 + x);
//Set the language name
worksheet [$"{columnLetter}{i}"].Value = language.name;
}
}
for (var i = 2; i < countries.Count; i++)
{
var country = countries [i];
//Set the basic values
worksheet [$"A{i}"].Value = country.name;
worksheet [$"B{i}"].Value = country.population;
worksheet [$"G{i}"].Value = country.region;
worksheet [$"H{i}"].Value = country.numericCode;
//Iterate through languages
for (var x = 0; x < 3; x++)
{
if (x > (country.languages.Count - 1)) break;
var language = country.languages [x];
//Get the letter for the column
var columnLetter = GetColumnLetter(4 + x);
//Set the language name
worksheet [$"{columnLetter}{i}"].Value = language.name;
}
}
For i = 2 To countries.Count - 1
Dim country = countries (i)
'Set the basic values
worksheet ($"A{i}").Value = country.name
worksheet ($"B{i}").Value = country.population
worksheet ($"G{i}").Value = country.region
worksheet ($"H{i}").Value = country.numericCode
'Iterate through languages
For x = 0 To 2
If x > (country.languages.Count - 1) Then
Exit For
End If
Dim language = country.languages (x)
'Get the letter for the column
Dim columnLetter = GetColumnLetter(4 + x)
'Set the language name
worksheet ($"{columnLetter}{i}").Value = language.name
Next x
Next i
使用 IronXL.Excel 打开 Excel 文件。
启动 Excel 文件后,添加读取第 1 个工作表中第 1 个单元格的前几行,然后打印。
static void Main(string [] args)
{
var workbook = IronXL.WorkBook.Load($@"{Directory.GetCurrentDirectory()}\Files\HelloWorld.xlsx");
var sheet = workbook.WorkSheets.First();
var cell = sheet ["A1"].StringValue;
Console.WriteLine(cell);
}
static void Main(string [] args)
{
var workbook = IronXL.WorkBook.Load($@"{Directory.GetCurrentDirectory()}\Files\HelloWorld.xlsx");
var sheet = workbook.WorkSheets.First();
var cell = sheet ["A1"].StringValue;
Console.WriteLine(cell);
}
Shared Sub Main(ByVal args() As String)
Dim workbook = IronXL.WorkBook.Load($"{Directory.GetCurrentDirectory()}\Files\HelloWorld.xlsx")
Dim sheet = workbook.WorkSheets.First()
Dim cell = sheet ("A1").StringValue
Console.WriteLine(cell)
End Sub
使用 IronXL 创建一个新的 Excel 文件。
/**
Create Excel File
anchor-create-a-new-excel-file
**/
static void Main(string [] args)
{
var newXLFile = WorkBook.Create(ExcelFileFormat.XLSX);
newXLFile.Metadata.Title = "IronXL New File";
var newWorkSheet = newXLFile.CreateWorkSheet("1stWorkSheet");
newWorkSheet ["A1"].Value = "Hello World";
newWorkSheet ["A2"].Style.BottomBorder.SetColor("#ff6600");
newWorkSheet ["A2"].Style.BottomBorder.Type = IronXL.Styles.BorderType.Dashed;
}
/**
Create Excel File
anchor-create-a-new-excel-file
**/
static void Main(string [] args)
{
var newXLFile = WorkBook.Create(ExcelFileFormat.XLSX);
newXLFile.Metadata.Title = "IronXL New File";
var newWorkSheet = newXLFile.CreateWorkSheet("1stWorkSheet");
newWorkSheet ["A1"].Value = "Hello World";
newWorkSheet ["A2"].Style.BottomBorder.SetColor("#ff6600");
newWorkSheet ["A2"].Style.BottomBorder.Type = IronXL.Styles.BorderType.Dashed;
}
'''
'''Create Excel File
'''anchor-create-a-new-excel-file
'''*
Shared Sub Main(ByVal args() As String)
Dim newXLFile = WorkBook.Create(ExcelFileFormat.XLSX)
newXLFile.Metadata.Title = "IronXL New File"
Dim newWorkSheet = newXLFile.CreateWorkSheet("1stWorkSheet")
newWorkSheet ("A1").Value = "Hello World"
newWorkSheet ("A2").Style.BottomBorder.SetColor("#ff6600")
newWorkSheet ("A2").Style.BottomBorder.Type = IronXL.Styles.BorderType.Dashed
End Sub
之后,您可以使用各自的代码将其保存为 CSV、JSON 或 XML 格式。
例如,保存为 XML".xml"
要保存为 XML,请使用 SaveAsXml,如下所示:
newXLFile.SaveAsXml($@"{Directory.GetCurrentDirectory()}\Files\HelloWorldXML.XML");
newXLFile.SaveAsXml($@"{Directory.GetCurrentDirectory()}\Files\HelloWorldXML.XML");
newXLFile.SaveAsXml($"{Directory.GetCurrentDirectory()}\Files\HelloWorldXML.XML")
结果是这样的
<?xml version="1.0" standalone="yes"?>
<_x0031_stWorkSheet>
<_x0031_stWorkSheet>
<Column1 xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Hello World</Column1>
</_x0031_stWorkSheet>
<_x0031_stWorkSheet>
<Column1 xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</_x0031_stWorkSheet>
</_x0031_stWorkSheet>
使用 IronXL.Excel 比使用 EPPlus 更容易阅读 Excel 文件。 IronXL 的代码更加简短,包含了访问工作簿中所有列、行和单元格所需的全部内容,而使用 EPPlus 则需要特定的代码行才能读取列和行。
IronXL.Excel 在操作 Excel 文档时更加智能。 IronXL 可让您在任何时间点创建更多工作表,并从多个工作表和工作簿中读取数据,而 EPPlus 一次只处理一个工作表。有了 IronXL.Excel,您还可以用 Excel 工作簿中的数据填充数据库。
EPPlus 可在两种许可模式下使用,一种是非商业许可模式,另一种是 Polyform 提供的商业许可模式。
商业许可证
这些工具有永久和订阅两种形式,期限从一个月到两年不等。
对于所有许可类别,在许可有效期内都包括通过支持中心提供的支持和通过 NuGet 进行的升级。
EPPlus 需要每个开发人员一个许可证。 许可证只发给一个人,不得共享。 作为一般准则,任何制作或需要调试直接使用 EPPlus 的代码的人都应获得商业许可。
如果您在内部将 EPPlus 作为一项服务提供(例如,通过应用程序接口公开其功能), 贵公司必须购买涵盖内部用户数量的套餐(开发者)谁将使用该服务。
订阅
您可以通过订阅随时使用最新版本,但只要您使用 EPPlus 进行开发,就必须拥有有效的许可证。 在许可期结束时,许可证会自动开具发票,并在付款后自动续期。 您可以在许可期结束时取消订阅,并随时开始新的订阅。订阅只能在互联网上购买。
EPPlus 可用于商业环境。 每个公司可为一名开发人员提供许可证,部署地点数量不限。 每年可购买的许可证数量可以增加或减少,许可证可以在每年结束时暂停或取消。
可选择 32 天的试用期。
定价: 每年 299 美元起。
您可以按需付费
单个组织内每位开发人员的价格,部署地点不限,Stripe 开具发票。 每月可用的许可证数量可以增加或减少,许可证可以在每月月底暂停或取消。
定价: 每月 29 美元起。
永久许可
永久许可证允许您更新到新版本,并在一定时间内获得支持。然后,您可以继续使用在此期间发布的版本开发软件,而无需更新许可证。
在同一公司内,每位开发人员的价格不限,部署地点不限。 无限期使用在支持/升级期限内发布的所有 EPPlus 版本。
可选择 32 天的试用期。
定价: 每年 599 美元起。
软件包
可提供永久许可证选项,初始期限为升级和支持。 这样,您就可以继续使用在此期间发布的版本开发软件,而无需更新许可证。
定价: 每年 4295 美元起。
Polyform 的非商业许可
EPPlus 从第 5 版开始采用 Polyform 非商业许可,这表明代码是开源的,可用于非商业用途。 您可以在他们的网站上查看更多详细信息。
永久许可: 每个许可只需购买一次,无需续订。
免费支持和产品更新:每个 License 都附带一年的免费产品更新和产品背后团队的支持。 可以随时购买扩展。 可查看扩展内容。
即时许可证:收到付款后立即发送注册许可证密钥。
如果您对 IronXL for .NET 许可有任何疑问,请联系我们的 Iron Software 许可专家。
所有许可证均为永久许可证,适用于开发、暂存和生产。
Lite - 允许企业中的单个软件开发人员在一个地方使用 Iron Software。 Iron Software 可用于单个网络应用程序、内联网应用程序或桌面软件程序。 许可证不可转让,也不能在组织或代理/客户关系之外共享。本许可类型与所有其他许可类型一样,明确排除本协议未明确授予的所有权利,包括 OEM 再分发和在未购买额外保险的情况下将 Iron Software 作为 SaaS 使用。
定价: 每年 489 美元起。
Professional License - 允许一个组织中预定数量的软件开发人员在一个地点使用 Iron Software,最多不超过 10 人。 Iron Software 可用于任意数量的网站、内网应用程序或桌面软件应用程序。许可证不可转让,也不能在组织或代理/客户关系之外共享。本许可类型与所有其他许可类型一样,明确排除本协议未明确授予的所有权利,包括 OEM 再分发和在未购买额外保险的情况下将 Iron Software 作为 SaaS 使用。
定价: 每年 976 美元起。
Unlimited License - 允许一个组织中数量不限的软件开发人员在数量不限的地点使用 Iron Software。 Iron Software 可用于任意数量的网站、内网应用程序或桌面软件应用程序。许可证不可转让,也不能在组织或代理/客户关系之外共享。本许可类型与所有其他许可类型一样,明确排除本协议未明确授予的所有权利,包括 OEM 再分发和在未购买额外保险的情况下将 Iron Software 作为 SaaS 使用。
Royalty-Free Redistribution - 允许您将 Iron Software 作为许多不同的打包商业产品的一部分进行分发(无需支付版税)基于基本许可证所涵盖的项目数量。 允许在 SaaS 软件服务中部署 Iron Software,以基本许可涵盖的项目数量为基础。
定价: 每年 2939 美元起。
总之,IronXL.Excel 比 EPPlus 更为实用,因为它可以让您根据需要灵活地在 Excel 表格中浏览,代码行数更短,导出机会更多,包括 XML、HTML 和 JSON。 IronXL 还允许您将工作簿数据整合到数据库中。 此外,它还有一个直观的系统,可以在每次编辑文档时重新计算公式,并提供一个带有工作表的直观范围设置。["A1:B10"]语法。 工作表函数包括与 Excel 配合使用的公式,每次编辑工作表都会重新计算。 单元格数据格式有多种文本、数字、公式、日期、货币、百分比、科学符号和时间。其自定义格式有不同的排序方法,如范围、列和行。 其单元格样式包括各种字体、大小、背景图案、边框和对齐方式。