在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
C# Excel 庫
using IronXL;
using System;
using System.Linq;
// Supported for XLSX, XLS, XLSM, XLTX, CSV and TSV
WorkBook workBook = WorkBook.Load("sample.xlsx");
// Select worksheet at index 0
WorkSheet workSheet = workBook.WorkSheets[0];
// Get any existing worksheet
WorkSheet firstSheet = workBook.DefaultWorkSheet;
// Select a cell and return the converted value
int cellValue = workSheet["A2"].IntValue;
// Read from ranges of cells elegantly.
foreach (var cell in workSheet["A2:A10"])
{
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
}
// Calculate aggregate values such as Min, Max and Sum
decimal sum = workSheet["A2:A10"].Sum();
// Linq compatible
decimal max = workSheet["A2:A10"].Max(c => c.DecimalValue);
在本文中,我們探討 IronXL 和 EPPlus 軟體之間的相似性和差異。
對於大多數組織來說,Microsoft Excel 已被證明是一個極其有用的工具。 Excel 檔案(例如資料庫)將資料存儲在儲存格中,簡單來說,這樣就容易管理需要儲存的資料。
Excel 也使用 .xls 和 .xlsx 文件格式。 C# 語言可能會使管理 Excel 文件變得困難。 然而,IronXL 和 EPPlus 軟體使得處理這些過程變得更簡單。
使用此軟體不需要安裝 Microsoft Office。
請注意,您可以在不安裝 Microsoft Office 的情況下,以 C# 讀取和建立 Excel 文件。今天,我們將探討一些易於實施的不同選項。
ExcelPackage
Epplus C# 類別來讀取 Excel 文件從DataTable載入
方法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,請依次選擇檢視 > 其他視窗 > 套件管理器主控台,然後鍵入以下命令:
PM> Install-Package EPPlus
如果您想使用 .NET CLI,請從提升權限的指令提示字元或 PowerShell 提示字元執行以下命令:
PM> dotnet add package EPPlus
EPPlus 是一個可以添加到您的專案中的 dotnet 套件。
IronXL 是一個簡單的 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 > Install-Package IronXL.Excel
使用 NuGet 套件管理器安裝 IronXL
這是安裝 NuGet 套件管理器的不同方法。 如果您已經使用之前的方法完成安裝,則無需使用此方法。
要訪問 NuGet 套件管理器,請前往工具 > NuGet 套件管理器 => 從下拉菜單中選擇為解決方案管理 NuGet 套件。
這將啟動 NuGet 方案; 選擇「瀏覽」,然後尋找 IronXL。
在搜尋欄中輸入 Excel:
當您點擊「Install」按鈕時,IronXL 將為您安裝。 安裝IronXL後,您可以進入您的表單並開始開發。
使用 IronXL 建立新 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
如您所見,這是可以用於任何 ASP.NET MVC 控制器的 ActionResult 方法; 如果您沒有使用 ASP.NET MVC,只需複製方法內容並將其粘貼到您需要的地方即可。(經典 ASP.NET、控制台應用程式、Windows Forms,等等).
代碼本身具有自解能力,並附有足夠的註釋來幫助您理解各種處理過程。 但首先,讓我們快速回顧一下我們正在做什麼:
我們創建 HTML 答案,並通過 Content-Disposition 附件將 XLSX 文件發送給用戶,使瀏覽器自動下載該文件。
在這種情況下,IronXL 脫穎而出,因為創建過程非常簡單——只需一行代碼即可使用。 這有助於節省時間和進行調試,而EPPlus提供的代碼行既乏味又難以調試。
EPPlus 支援處理 Excel 文件。 這是一個讀取和寫入 Excel 文件的 .NET 程式庫。
讀取 Excel 文件
要這樣做,首先需要安裝 EPPlus 套件:轉到 「工具」-> 「NuGet 套件管理器」-> 「管理此解決方案的 NuGet」-> 搜索「EPPlus」-> 在「瀏覽」選項卡中找到「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 文件。
可以使用 "cells" 屬性以下列方式從多個來源加載數據(ExcelRange):
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 應用程式,並且邏輯可以根據您的需求進行更改。
可以使用 "cells" 屬性來訪問這些技術(ExcelRange):
值 — 返回或設定範圍的值。
可以直接在工作表對象上使用GetValue和SetValue方法。 (這將提供比範圍讀寫稍微更好的結果):
SetValue — 更改單一儲存格的值。
由於單元格屬性實現了 IEnumerable 介面,可以使用 Linq 從工作表中查詢數據。
IronXL 是一個.NET 庫,允許 C# 開發人員快速輕鬆地處理 Excel、樞紐分析表和其他試算表文件。
不需要 Office Interop。 在 Core 或 Azure 上不需要特定的依賴項或安裝 Microsoft Office。
IronXL 是著名的 C# 和 VB.NET xl 試算表庫,適用於 .NET core 和 .NET framework。
要加載的工作表
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")
工作表物件可以在許多工作簿中找到。 這些是 Excel 文件的工作表。 如果該工作表包含工作表,請使用名稱 WorkBook 來查找它們。 取得工作表。
var worksheet = workbook.GetWorkSheet("GDPByCountry");
var worksheet = workbook.GetWorkSheet("GDPByCountry");
Dim worksheet = workbook.GetWorkSheet("GDPByCountry")
製作自己的工作簿。
建構具有工作表類型的新 WorkBook 以在記憶體中產生新 WorkBook。
/**
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 及以前).
如果您還沒有工作表,請建立一個。
在每個「WorkBook」中可以有許多「WorkSheet」。一個「WorkSheet」是一個單一的數據表,而「WorkBook」則是多個WorkSheet的集合。 在 Excel 中,這是一個包含兩個工作表的工作簿的樣子。
WorkBook 是您可以建立的新 WorkSheet 的名稱。
var worksheet = workbook.CreateWorkSheet("Countries");
var worksheet = workbook.CreateWorkSheet("Countries");
Dim worksheet = workbook.CreateWorkSheet("Countries")
將工作表的名稱傳遞給 CreateWorkSheet。
取得行動範圍
由「Range」類代表的二維集合包含「Cell」對象。 它表示一個特定範圍的 Excel 儲存格。 在 WorkSheet 對象上使用字符串索引器,可以獲取範圍。
var range = worksheet ["D2:D101"];
var range = worksheet ["D2:D101"];
Dim range = worksheet ("D2:D101")
參數文字可以是儲存格的座標(例如,“A1”)或從左到右、從上到下的單元格範圍(例如 "B2:E5"). GetRange 也可以從 WorkSheet 上呼叫。
在範圍內編輯單元格值
可以通過多種方式讀取或編輯範圍內單元格的值。 如果已知計數,使用 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")
使用 Entity Framework 匯出資料
使用 IronXL 將 Excel 試算表轉換為資料庫或將數據匯出到資料庫。 ExcelToDB 範例讀取包含各國 GDP 的電子表格,並將其匯出到 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
將公式納入電子表格
可以使用 Formula 屬性來設定儲存格的公式。
//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))()
從 API 獲取的 JSON 數據如下:
以下程式碼遍歷各個國家,並將名稱、人口、地區、數字代碼和前三大語言填入試算表。
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 文件後,添加前幾行代碼以讀取第一個工作表的第一個單元格,然後打印。
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>
<?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 更容易。 IronXL 提供更多簡化代碼,可以涵蓋訪問工作簿中所有列、行和單元格所需的一切,而使用 EPPlus 則需要特定的代碼行來讀取列和行。
IronXL 在操作 Excel 文件方面更智能。 它使您在任何時刻都能佔據優勢,創建更多工作表,以及從多個工作表和工作簿中讀取數據,而 EPPlus 一次只能處理一個工作表。使用 IronXL,您還可以將 Excel 工作簿中的數據填充到數據庫中。
EPPlus 可以在兩種授權模式下使用,分別是非商業授權模式或來自 Polyform 的商業授權模式。
商業授權
這些產品提供永續和訂閱制兩種形式,期限從一個月至兩年不等。
在所有授權類別中,於授權期間內包含通過支援中心的支援服務以及通過NuGet的升級。
EPPlus 需要每位開發者購買一個許可證。 授權證書發給單一個人,不能共享。 一般而言,任何製作或需要調試直接使用EPPlus的程式碼的人都應該擁有商業授權。
如果您在內部提供EPPlus服務(例如,通過 API 暴露其功能), 您的公司必須購買一個涵蓋內部使用者數量的訂閱(開發人員)誰將使用該服務。
訂閱
您可以在訂閱的情況下隨時使用最新版本,但只要您使用EPPlus進行開發,就必須擁有有效的許可證。 在授權期結束時,該授權將在付款完成後自動開具發票並續期。 您可以在授權期限結束時取消訂閱,並隨時開始新的訂閱。訂閱僅能透過網路購買。
EPPlus 可以用於商業環境中。 該許可證適用於每家公司一位開發人員,部署地點不限。 每年可購買的許可證數量可以增加或減少,並且許可證可以在每年結束時暫停或取消。
32 天的試用期可供選擇。
價格: 每年起價 $299。
您可以隨用隨付
每位開發人員在單一組織內的價格,具有不限部署地點和 Stripe 開票功能。 每月可以增加或降低可用的許可證數量,並且可以在每月底暫停或取消許可證。
價格: 起價每月 $29。
永久授權
永久授權允許您在設定的時間內更新到新版本並獲得支援。然後,您可以繼續使用在此期間發布的版本開發軟體,而無需續訂您的授權。
在同一家公司內,每位開發者的價格與不限部署站點。 在支援/升級期限內,無限期使用所有發行的EPPlus版本。
32 天的試用期可供選擇。
價格: 每年起價 $599。
Packages
提供具有初始升級和支援期限的永久授權選項。 然後,您可以繼續使用在這段時間內發布的版本進行軟體開發,而無需續訂許可證。
價格: 每年起價 $4295。
Polyform 非商業授權
從第 5 版開始,EPPlus 採用 Polyform Noncommercial 授權,這表示程式碼是開源的,可用於非商業用途。 您可以在他們的網站上查看更多詳情。
永久授權: 每份授權只需購買一次,無需續訂。
免費支援和產品更新:每個授權皆包含一年免費的產品更新和來自產品團隊的支援服務。 可以隨時購買擴充套件。 可以查看擴展。
即時授權:註冊授權金鑰在收到付款後立即發送。
如果您對 IronXL for .NET 授權有任何疑問,請聯絡我們的 Iron Software 授權專家。
所有授權都是永久性的,適用於開發、測試和生產環境。
Lite - 允許組織中的單個軟體開發者在單一位置使用Iron Software。 Iron Software 可以用於單一的網路應用程式、內部網應用程式或桌面軟體程式。 許可證不可轉讓,並且不能在組織外或代理/客戶關係中共享。此類許可,包括所有其他類許可,明確排除協議中未明確授予的所有權利,包括OEM重新分發以及未購買額外覆蓋範圍的前提下將Iron Software用作SaaS。
價格: 每年起始於 $489。
Professional License - 允許一個組織中的特定數量的軟體開發人員在單一地點使用 Iron Software,最多可達十人。 Iron Software 可以在任意數量的網站、內聯網應用程式或桌面軟體應用程式中使用。許可證不可轉讓,也不能在組織或機構/客戶關係之外共用。此類型的許可證與所有其他類型的許可證一樣,明確排除在協議下未明確授予的所有權利,包括 OEM 重新分發和在未購買額外保障的情況下將 Iron Software 作為 SaaS 使用。
定價: 每年起價 $976。
Unlimited License - 允許組織中無限制數量的軟體開發人員在無限制數量的地點使用Iron Software。 Iron Software 可以在任意數量的網站、內聯網應用程式或桌面軟體應用程式中使用。許可證不可轉讓,也不能在組織或機構/客戶關係之外共用。此類型的許可證與所有其他類型的許可證一樣,明確排除在協議下未明確授予的所有權利,包括 OEM 重新分發和在未購買額外保障的情況下將 Iron Software 作為 SaaS 使用。
免版税再分发 - 允許您將 Iron Software 作為各種不同的商業產品套裝的一部分進行分發(無需支付版稅)根據基礎授權涵蓋的專案數量。 允許在 SaaS 軟體服務內部署 Iron Software,根據基礎授權所涵蓋的專案數量。
定價: 每年起價 $2939。
總之,IronXL 比 EPPlus 更實用,因為它提供更大的靈活性讓您依需要瀏覽 Excel 表格,使用更短的代碼行,並提供更多導出機會,包括 XML、HTML 和 JSON。 IronXL 還允許您將工作簿數據整合到數據庫中。 此外,它具有直觀的系統,每次編輯文件時均會重新計算公式,並提供帶有工作表的直觀範圍設置。[“A1:B10”]語法。 工作表功能包括用於 Excel 的公式,且每次編輯工作表時都會重新計算。 儲存格數據格式包含多種文本、數字、公式、日期、貨幣、百分比、科學記號和時間。它們的自定義格式具有不同的排序方法,如範圍、列和行。 它的儲存格樣式包括多種字體、大小、背景圖案、邊框和對齊方式。
PM > Install-Package IronXL.Excel
想將 IronXL 部署到現實專案中免費使用嗎?
您的試用金鑰應該在郵件中。
如果不是,請聯繫
support@ironsoftware.com
免費開始
不需要信用卡
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
獲得30天完全功能的產品。
幾分鐘內即可啟動並運行。
試用產品期間完全訪問我們的支援工程團隊