跳過到頁腳內容
使用 IRONXL

如何不使用Interop在Excel中創建樞紐分析表

使用 C# 在 Excel 中建立資料透視表非常簡單,只需選擇合適的函式庫即可-Excel 互通 需要每台機器上都安裝 Office,而IronXL可以在任何執行.NET 的環境中執行。本指南將透過完整的程式碼範例詳細介紹這兩種方法,涵蓋設定、資料聚合、欄位配置和部署注意事項,以便您根據專案需求做出正確的選擇。

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 1 - IronXL

Excel 互通 和IronXL有什麼不同?

在編寫任何一行程式碼之前,了解每種方法的底層原理會很有幫助。 Excel 互通 使用COM(元件物件模型)直接從 C# 驅動 Microsoft Excel。 .NET程序會與正在執行的 Excel 執行個體通信,這表示電腦上必須安裝 Excel。您操作的每個物件(工作簿、工作表、區域、透視快取)都是 COM 包裝器,必須明確釋放每個包裝器,以避免進程洩漏。

IronXL採取了一條截然不同的道路。 它直接讀取和寫入Open XML 檔案格式,完全無需啟動 Excel。 最終得到的是一個標準的.NET庫,它具有熟悉的物件模式、垃圾回收內存,並且不依賴 Office 安裝或授權。 這種架構使得IronXL適用於伺服器端工作負載、Docker 容器、Linux 主機以及任何.NET 6、 .NET 8 或.NET 10 環境。

Excel 互通 與IronXL比較概覽
標準 Excel 互通 IronXL
辦公室要求 是的
僅限 Windows 系統 是的 否——跨平台
記憶體管理 手動 COM 版本 自動(.NET GC)
伺服器部署 難的 直截了當
原生透視表 完整的 Excel 透視表 API 透過 LINQ 進行資料聚合
需要許可證 辦公許可證 IronXL僅限授權

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 2 - 跨平台

如何安裝各個函式庫?

設定 Excel 互通

Excel 互通 以NuGet套件的形式提供。 在您的專案中執行以下任一命令:

Install-Package Microsoft.Office.Interop.Excel
dotnet add package Microsoft.Office.Interop.Excel
Install-Package Microsoft.Office.Interop.Excel
dotnet add package Microsoft.Office.Interop.Excel
SHELL

請注意,僅此軟體包是不夠的——目標電腦必須安裝匹配版本的 Microsoft Excel 並已獲得正確的許可。 這種依賴關係排除了大多數伺服器、容器和雲端場景。

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 3 - Excel 互通 安裝

設定IronXL

透過NuGet安裝IronXL ,無需其他系統需求:

Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

安裝完成後,您可以在任何支援.NET 的平台上立即開始讀取和寫入 Excel 檔案。 無需Office許可證,無需COM註冊,無需伺服器配置。 有關其他選項,包括離線安裝和項目參考設置,請參閱IronXL安裝指南

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 4 - 安裝

立即開始在您的項目中使用 IronXL 並免費試用。

第一步:
green arrow pointer

如何使用 C# Interop 建立 Excel 資料透視表?

Interop 透視表工作流程遵循嚴格的順序:從來源範圍建立透視緩存,然後在單獨的工作表上建立 PivotTable 對象,然後配置欄位方向。 以下範例使用與.NET 10 相容的頂級 C# 語句:

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Launch Excel and set up workbooks
var excelApp = new Excel.Application();
excelApp.Visible = false;
var workbook = excelApp.Workbooks.Add();
var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
dataSheet.Name = "SalesData";
var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
pivotSheet.Name = "Pivot";

// Populate header row
dataSheet.Cells[1, 1] = "Product";
dataSheet.Cells[1, 2] = "Region";
dataSheet.Cells[1, 3] = "Sales";

// Add sample data rows
object[,] rows = {
    { "Laptop",   "不rth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "不rth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "不rth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet.Cells[i + 2, 1] = rows[i, 0];
    dataSheet.Cells[i + 2, 2] = rows[i, 1];
    dataSheet.Cells[i + 2, 3] = rows[i, 2];
}

// Build pivot cache from source range
Excel.Range dataRange = dataSheet.Range["A1:C10"];
Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
    Excel.XlPivotTableSourceType.xlDatabase, dataRange);

// Create the PivotTable on the pivot sheet
Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
Excel.PivotTable pivotTable = pivotTables.Add(
    pivotCache, pivotSheet.Range["A3"], "SalesPivot");

// Assign field orientations
((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation =
    Excel.XlPivotFieldOrientation.xlRowField;
((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation =
    Excel.XlPivotFieldOrientation.xlColumnField;
((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation =
    Excel.XlPivotFieldOrientation.xlDataField;

// Enable grand totals
pivotTable.RowGrand = true;
pivotTable.ColumnGrand = true;

// Save and close
workbook.SaveAs(@"C:\output\pivot_interop.xlsx");
workbook.Close(false);
excelApp.Quit();

// Release every COM object -- skipping any of these causes Excel to stay in memory
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotTables);
Marshal.ReleaseComObject(pivotCache);
Marshal.ReleaseComObject(dataRange);
Marshal.ReleaseComObject(pivotSheet);
Marshal.ReleaseComObject(dataSheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Launch Excel and set up workbooks
var excelApp = new Excel.Application();
excelApp.Visible = false;
var workbook = excelApp.Workbooks.Add();
var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
dataSheet.Name = "SalesData";
var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
pivotSheet.Name = "Pivot";

// Populate header row
dataSheet.Cells[1, 1] = "Product";
dataSheet.Cells[1, 2] = "Region";
dataSheet.Cells[1, 3] = "Sales";

// Add sample data rows
object[,] rows = {
    { "Laptop",   "不rth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "不rth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "不rth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet.Cells[i + 2, 1] = rows[i, 0];
    dataSheet.Cells[i + 2, 2] = rows[i, 1];
    dataSheet.Cells[i + 2, 3] = rows[i, 2];
}

// Build pivot cache from source range
Excel.Range dataRange = dataSheet.Range["A1:C10"];
Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
    Excel.XlPivotTableSourceType.xlDatabase, dataRange);

// Create the PivotTable on the pivot sheet
Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
Excel.PivotTable pivotTable = pivotTables.Add(
    pivotCache, pivotSheet.Range["A3"], "SalesPivot");

// Assign field orientations
((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation =
    Excel.XlPivotFieldOrientation.xlRowField;
((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation =
    Excel.XlPivotFieldOrientation.xlColumnField;
((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation =
    Excel.XlPivotFieldOrientation.xlDataField;

// Enable grand totals
pivotTable.RowGrand = true;
pivotTable.ColumnGrand = true;

// Save and close
workbook.SaveAs(@"C:\output\pivot_interop.xlsx");
workbook.Close(false);
excelApp.Quit();

// Release every COM object -- skipping any of these causes Excel to stay in memory
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotTables);
Marshal.ReleaseComObject(pivotCache);
Marshal.ReleaseComObject(dataRange);
Marshal.ReleaseComObject(pivotSheet);
Marshal.ReleaseComObject(dataSheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);
$vbLabelText   $csharpLabel

每個 COM 包裝器都需要一個符合的 Marshal.ReleaseComObject 呼叫。 即使缺少一個引用,也會導致 Excel 程序在後台持續運行,消耗記憶體和檔案句柄,直到宿主程序結束。 清理工作量會隨著電子表格操作的複雜程度而增加。

如何用IronXL達到相同的效果?

IronXL不像 Interop 那樣公開原生透視表 API——Open XML 透視表格式有數百個 XML 屬性,大多數業務需求可以透過用純 C# 編寫的顯式 LINQ 聚合更可靠地滿足。 輸出結果是一個乾淨的匯總表,當檔案開啟時,該匯總表能夠正確地重新計算,而無需依賴 Excel 刷新資料透視表快取。

using IronXL;
using System.Data;

// Create workbook and populate source data
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet dataSheet = workbook.CreateWorkSheet("SalesData");

dataSheet["A1"].Value = "Product";
dataSheet["B1"].Value = "Region";
dataSheet["C1"].Value = "Sales";

object[,] rows = {
    { "Laptop",   "不rth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "不rth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "不rth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet[$"A{i + 2}"].Value = rows[i, 0];
    dataSheet[$"B{i + 2}"].Value = rows[i, 1];
    dataSheet[$"C{i + 2}"].Value = rows[i, 2];
}

// Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout
DataTable table = dataSheet["A1:C10"].ToDataTable(true);
var summary = table.AsEnumerable()
    .GroupBy(row => row.Field<string>("Product"))
    .Select((group, idx) => new
    {
        Product    = group.Key,
        TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
        RegionCount = group.Select(r => r.Field<string>("Region")).Distinct().Count(),
        RowIndex   = idx + 2
    })
    .OrderByDescending(x => x.TotalSales);

// Write the summary sheet
WorkSheet summarySheet = workbook.CreateWorkSheet("Summary");
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Total Sales";
summarySheet["C1"].Value = "Regions";

foreach (var item in summary)
{
    summarySheet[$"A{item.RowIndex}"].Value = item.Product;
    summarySheet[$"B{item.RowIndex}"].Value = (double)item.TotalSales;
    summarySheet[$"C{item.RowIndex}"].Value = item.RegionCount;
}

// Apply currency format to the sales column
summarySheet["B:B"].FormatString = "$#,##0.00";

// Bold the header row
summarySheet["A1:C1"].Style.Font.Bold = true;

// Save -- no COM cleanup needed
workbook.SaveAs(@"C:\output\analysis_ironxl.xlsx");
using IronXL;
using System.Data;

// Create workbook and populate source data
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet dataSheet = workbook.CreateWorkSheet("SalesData");

dataSheet["A1"].Value = "Product";
dataSheet["B1"].Value = "Region";
dataSheet["C1"].Value = "Sales";

object[,] rows = {
    { "Laptop",   "不rth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "不rth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "不rth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet[$"A{i + 2}"].Value = rows[i, 0];
    dataSheet[$"B{i + 2}"].Value = rows[i, 1];
    dataSheet[$"C{i + 2}"].Value = rows[i, 2];
}

// Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout
DataTable table = dataSheet["A1:C10"].ToDataTable(true);
var summary = table.AsEnumerable()
    .GroupBy(row => row.Field<string>("Product"))
    .Select((group, idx) => new
    {
        Product    = group.Key,
        TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
        RegionCount = group.Select(r => r.Field<string>("Region")).Distinct().Count(),
        RowIndex   = idx + 2
    })
    .OrderByDescending(x => x.TotalSales);

// Write the summary sheet
WorkSheet summarySheet = workbook.CreateWorkSheet("Summary");
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Total Sales";
summarySheet["C1"].Value = "Regions";

foreach (var item in summary)
{
    summarySheet[$"A{item.RowIndex}"].Value = item.Product;
    summarySheet[$"B{item.RowIndex}"].Value = (double)item.TotalSales;
    summarySheet[$"C{item.RowIndex}"].Value = item.RegionCount;
}

// Apply currency format to the sales column
summarySheet["B:B"].FormatString = "$#,##0.00";

// Bold the header row
summarySheet["A1:C1"].Style.Font.Bold = true;

// Save -- no COM cleanup needed
workbook.SaveAs(@"C:\output\analysis_ironxl.xlsx");
$vbLabelText   $csharpLabel

無需釋放 COM 對象,無需終止 Excel 進程,也無需管理 Office 授權。 同一段程式碼無需修改即可在 Linux、macOS 和 Windows 上編譯運行。 有關聚合 API 的更多詳細信息,請訪問IronXL WorkSheet 文件

輸出

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 6 - IronXL輸出

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 7 - 匯總輸出

部署和維護的主要差異是什麼?

部署要求

部署基於互通性的應用程式需要驗證目標環境是否執行 Windows,是否安裝了正確的 Office 版本,以及伺服器上是否配置了 COM 自動化權限。 雲端託管環境和容器化工作負載通常無法在不添加虛擬化 Windows 桌面基礎架構的情況下滿足這些要求,但這會顯著增加成本和操作複雜性。

IronXL沒有這樣的限制。 新增NuGet包,將目標框架設定為.NET 6 或更高版本,應用程式即可部署到任何主機,包括 Linux 容器、Linux 上的 Azure 應用程式服務、AWS Lambda 和本機 Windows 伺服器。 IronXL系統要求頁面列出了完整的相容性矩陣。

錯誤處理和調試

互通失敗表現為 COM 異常(COMException),這些異常很難對應到使用者可見的訊息。 已安裝的 Office 版本與 Interop 組件之間的版本不符會導致另一種故障模式。 調試這些問題通常需要在開發機器上重現完全相同的 Office 版本。

IronXL拋出帶有描述性訊息的標準 System.Exception 子類別。 您可以將檔案操作封裝在 try-catch 區塊中,並在不了解 COM 錯誤代碼的情況下提供有意義的回饋。 IronXL故障排除指南涵蓋了常見異常及其解決方法。

記憶體和效能

COM 物件持有非託管記憶體。 如果你的程式碼處理很多工作表或在循環中運行,未能正確釋放每個引用會導致記憶體隨著時間的推移而增長——這個問題很難被發現,直到它導致生產事故。 由於 Interop 只驅動一個 Excel 窗口,因此它本質上也是單線程的。

IronXL使用由.NET垃圾回收器支援的託管物件。 當物件超出作用域時,記憶體會自動回收。 並行處理多個工作簿非常簡單,因為沒有需要用鎖定來保護的共用 COM 狀態。

如何選擇這兩種方法?

選擇合適的工具取決於兩個限制條件:程式碼運行的位置,以及是否需要原生透視表 XML。

在以下情況下選擇 Excel 互通:

此工作負載僅在已安裝 Office 的 Windows 桌面電腦上執行。 輸出檔案必須完全符合原始資料透視表格式(切片器、分組日期欄位、計算項目)。

  • 您維護現有的互通程式碼庫,因此沒有必要進行完全重寫。

選擇IronXL 的情況:

  • 該應用程式運行在伺服器、容器或雲端函數上 需要跨平台或Linux部署 您需要的是可使用單元測試進行測試的資料聚合邏輯,而不是依賴 Excel 流程的邏輯。 您需要大規模或平行處理 Excel 檔案。

對於大多數新的.NET 10 專案而言, IronXL是實際的預設選擇。 IronXL庫還涵蓋了在 C# 中讀取 Excel 檔案建立圖表應用儲存格樣式使用公式以及將 Excel 資料匯出到 DataTable——從而減少了您的技術堆疊中對多個庫的需求。

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 8 - 功能

IronXL還有哪些功能支援數據分析?

除了基本的聚合功能外, IronXL還提供了多種功能,支援更豐富的資料分析工作流程:

資料排序和篩選

在編寫總計表之前,您可以按升序或降序對資料範圍進行排序。 這樣可以確保輸出始終以一致的順序呈現數據,從而使下游處理更具可預測性。 有關範圍級排序選項,請參閱IronXL排序文件

應用條件格式

透過程式化方式套用條件格式規則,突顯異常值或閾值。 例如,當銷售額低於目標時,您可以將匯總表中的儲存格顏色設為紅色,從而提供一目了然的視圖,而無需最終使用者手動配置規則。

讀取現有 Excel 文件

如果來源資料來自現有電子表格而不是資料庫,則可以直接使用 WorkBook.Load 載入它:

using IronXL;

WorkBook existing = WorkBook.Load(@"C:\data\sales_report.xlsx");
WorkSheet sheet = existing.WorkSheets[0];

// Read column C starting at row 2
var salesValues = sheet["C2:C100"]
    .Where(cell => cell.Value != null && cell.Value.ToString() != string.Empty)
    .Select(cell => cell.DecimalValue)
    .ToList();

decimal total = salesValues.Sum();
Console.WriteLine($"Total sales from file: {total:C}");
using IronXL;

WorkBook existing = WorkBook.Load(@"C:\data\sales_report.xlsx");
WorkSheet sheet = existing.WorkSheets[0];

// Read column C starting at row 2
var salesValues = sheet["C2:C100"]
    .Where(cell => cell.Value != null && cell.Value.ToString() != string.Empty)
    .Select(cell => cell.DecimalValue)
    .ToList();

decimal total = salesValues.Sum();
Console.WriteLine($"Total sales from file: {total:C}");
$vbLabelText   $csharpLabel

此模式適用於 .csv 以及IronXL支援的其他格式。 有關支援的格式的詳細信息,請參閱IronXL文件格式文件

匯出為 CSV

產生匯總工作表後,您可以將其匯出為 CSV 文件,以便供不支援 Excel 的下游系統使用:

workbook.SaveAsCsv(@"C:\output\summary.csv");
workbook.SaveAsCsv(@"C:\output\summary.csv");
$vbLabelText   $csharpLabel

這在 ETL 管道中尤其有用,因為最終用戶是資料庫導入工具或資料倉儲載入器。

如何免費開始使用IronXL ?

IronXL提供免費試用許可,讓您無需訂閱即可評估所有功能。 試用版會在輸出檔上新增浮水印,套用正式版許可證金鑰後即可移除浮水印。

若要在程式碼中啟動許可證金鑰,請在執行任何IronXL操作之前進行設定:

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
$vbLabelText   $csharpLabel

您也可以透過環境變數(IRONXL_LICENSEKEY)或在ASP.NET Core專案中透過 appsettings.json 來設定金鑰。 IronXL許可頁面描述了所有可用的級別,包括團隊和組織選項。

對於生產部署,請查看IronXL部署文件和更廣泛的IronXL教學庫,以了解涵蓋ASP.NET Core、Azure Functions 和 Docker 的模式。

如何使用 C# Interop 與IronXL在 Excel 中建立資料透視表:圖 9 - 授權

如何邁出下一步?

C# 中的 Excel 資料透視表並不一定意味著對 Office 的依賴和 COM 的複雜性。 使用IronXL,您可以編寫可在任何平台上運行的純.NET程式碼,自動處理內存,並自然地​​與單元測試框架和 CI/CD 管道整合。

下載免費的IronXL試用版,並使用本指南中的範例對您自己的資料執行該範例。 如果您遇到任何問題, IronXL社群論壇支援入口網站對試用用戶和授權用戶均開放。 準備部署時,請查看授權選項,找到適合您團隊規模和使用量的方案。

常見問題解答

使用IronXL而非Excel Interop來創建樞紐分析表的優勢是什麼?

與傳統的 Excel Interop 相比,IronXL 提供了一種更現代、更有效率的方式來建立 Excel 檔案中的資料透視表。它簡化了流程,並減少了所需的樣板程式碼量。

我可以使用 IronXL 和 C# 在 Excel 中建立資料透視表嗎?

是的,IronXL 提供了一種使用 C# 在 Excel 中建立資料透視表的簡單方法。它允許開發人員輕鬆操作 Excel 文件,而無需依賴 Excel Interop。

IronXL 與 .NET 應用程式相容嗎?

IronXL 與 .NET 應用程式完全相容,因此對於希望將 Excel 功能整合到其 C# 專案中的開發人員來說,它是一個絕佳的選擇。

IronXL 是否需要係統上安裝 Excel?

不,IronXL 不需要在系統上安裝 Microsoft Excel。它可以獨立運行,這比需要安裝 Excel 的 Excel Interop 具有顯著優勢。

IronXL 如何簡化建立資料透視表的流程?

IronXL 透過提供使用者友善的 API 簡化了流程,減少了對大量樣板程式碼的需求,從而使開發過程更快、更有效率。

使用 IronXL 的系統需求是什麼?

IronXL 需要 .NET Framework相容的環境,但不需要安裝 Microsoft Excel,這簡化了部署並減少了依賴項。

IronXL 能有效處理大型 Excel 文件嗎?

是的,IronXL 的設計宗旨就是高效處理大型 Excel 文件,因此適用於需要處理大量資料的商業應用。

與 Excel Interop 相比,IronXL 的學習曲線是否更陡峭?

IronXL 的設計直觀易學,並配有全面的文件和範例,與更複雜的 Excel Interop 相比,更容易上手。

除了建立資料透視表之外,IronXL 還能執行哪些類型的 Excel 操作?

IronXL 可以執行各種 Excel 操作,包括讀取和寫入 Excel 檔案、設定儲存格格式以及應用公式等。

IronXL 能否將資料透視表匯出為 Excel 以外的其他格式?

雖然 IronXL 主要專注於 Excel 操作,但它也支援將資料匯出為其他格式,例如 CSV 和 PDF,具體取決於您的專案要求。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me