如何使用 IronXL 在 C# 中將資料匯出到現有的 Excel 模板
使用 Microsoft Excel 模板,您可以在動態填入資料的同時保留格式、公式和版面配置。 本教學課程示範如何使用 IronXL 將資料匯出到現有的 Excel 工作表模板,而無需依賴 Microsoft Office 或 Excel Interop。您將學習如何載入預設範本、取代佔位符標記、寫入表格資料、處理常見邊界情況,以及在任何 .NET 10 應用程式中保存專業的 XLSX 輸出。
如果您需要匯出到已存在的 Excel 範本(但未安裝 Microsoft Office),IronXL 提供了一個高效能的解決方案,支援從字典、清單、DataTable 物件和資料庫查詢結果插入資料。 無論您的範本是格式化的發票、每月儀表板還是合規性報告,IronXL 都會以程式設計方式填充它們,並在過程中保留每個樣式規則、公式和條件格式。
如何使用 IronXL 在 C# 中將 Excel 資料匯出到現有的 Excel 檔案範本:圖 1 - IronXL
為什麼Excel範本可以提高報表產生效率?
與從頭開始建立電子表格相比,Excel 範本具有顯著優勢。 範本可以保持專業的格式、複雜的公式、條件格式規則以及貴組織已經批准的經過驗證的資料結構。 財務團隊、營運部門和合規部門通常都有標準化的發票、儀表板和監管文件模板,這些模板必須在保留其設計的同時,整合來自資料庫、API 或記憶體集合的新資料。
透過以程式設計方式填入現有模板,您可以節省數小時的格式化工作,並確保每個產生的文件的一致性。 IronXL 支援 XLSX、XLS、XLSM 和 XLTX 格式,無需安裝 Office,因此適用於伺服器環境、Docker 容器和雲端管道等不方便或無法安裝 Microsoft Office 的環境。
基於模板的方法的主要優點:
-公式保留-資料寫入後,現有的 SUM、AVERAGE 和查找公式會自動重新計算。 -樣式保留-字體、邊框、儲存格顏色和數字格式均與設計完全一致。 -條件格式設定-與儲存格區域關聯的規則會根據新的資料值繼續觸發 -完全不依賴 Office -- IronXL 完全使用託管的 .NET 程式碼讀取和寫入 Excel 文件 -跨平台支援-可在 Windows、Linux 和 macOS 上運行,包括 .NET 10 環境
如何在專案中安裝 IronXL?
首先透過 NuGet 安裝 IronXL。 開啟軟體包管理器控制台並執行:
Install-Package IronXL
Install-Package IronXL
或使用 .NET CLI:
dotnet add package IronXL
dotnet add package IronXL
如何使用 IronXL 在 C# 中將 Excel 資料匯出到現有的 Excel 檔案範本:圖 3 - 安裝
IronXL 無需安裝 Microsoft Office 即可獨立運行,因此非常適合伺服器環境和跨平台應用程式。 有關詳細的設定說明,請造訪IronXL 入門指南。 此程式庫面向 .NET Framework、.NET Core 以及 .NET 5 至 .NET 10,可在 Windows、Linux 和 macOS 上運作。
安裝完成後,在檔案頂部新增命名空間:
using IronXL;
using IronXL;
Imports IronXL
如何載入和填入現有的Excel模板?
使用 IronXL 的WorkBook.Load()方法載入現有模板非常簡單。 以下範例開啟季度銷售報告模板,並使用頂級語句向特定單元格填充資料:
using IronXL;
// Load the existing Excel template
WorkBook workbook = WorkBook.Load("ReportTemplate.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Write header values to named cells
sheet["B2"].Value = "Q4 2025 Sales Report";
sheet["C4"].StringValue = DateTime.Now.ToString("MMMM dd, yyyy");
sheet["C6"].DecimalValue = 125000.50m;
sheet["C7"].DecimalValue = 98500.75m;
// Add a profit formula -- Excel recalculates automatically
sheet["C8"].Formula = "=C6-C7";
// Populate a column range with monthly data
decimal[] monthlyData = { 10500, 12300, 15600, 11200 };
for (int i = 0; i < monthlyData.Length; i++)
{
sheet[$"E{10 + i}"].DecimalValue = monthlyData[i];
}
// Save the populated file
workbook.SaveAs("Q4_Sales_Report.xlsx");
using IronXL;
// Load the existing Excel template
WorkBook workbook = WorkBook.Load("ReportTemplate.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Write header values to named cells
sheet["B2"].Value = "Q4 2025 Sales Report";
sheet["C4"].StringValue = DateTime.Now.ToString("MMMM dd, yyyy");
sheet["C6"].DecimalValue = 125000.50m;
sheet["C7"].DecimalValue = 98500.75m;
// Add a profit formula -- Excel recalculates automatically
sheet["C8"].Formula = "=C6-C7";
// Populate a column range with monthly data
decimal[] monthlyData = { 10500, 12300, 15600, 11200 };
for (int i = 0; i < monthlyData.Length; i++)
{
sheet[$"E{10 + i}"].DecimalValue = monthlyData[i];
}
// Save the populated file
workbook.SaveAs("Q4_Sales_Report.xlsx");
Imports IronXL
' Load the existing Excel template
Dim workbook As WorkBook = WorkBook.Load("ReportTemplate.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Write header values to named cells
sheet("B2").Value = "Q4 2025 Sales Report"
sheet("C4").StringValue = DateTime.Now.ToString("MMMM dd, yyyy")
sheet("C6").DecimalValue = 125000.50D
sheet("C7").DecimalValue = 98500.75D
' Add a profit formula -- Excel recalculates automatically
sheet("C8").Formula = "=C6-C7"
' Populate a column range with monthly data
Dim monthlyData As Decimal() = {10500D, 12300D, 15600D, 11200D}
For i As Integer = 0 To monthlyData.Length - 1
sheet($"E{10 + i}").DecimalValue = monthlyData(i)
Next
' Save the populated file
workbook.SaveAs("Q4_Sales_Report.xlsx")
這段程式碼載入一個預先設計的模板,保留所有現有格式,並填入指定的儲存格。 DecimalValue屬性確保數值資料保留正確的貨幣或小數格式。 當相鄰資料發生變化時,公式儲存格會自動重新計算,因此範本的計算邏輯保持不變。
有關使用 Excel 儲存格參考和區域的指導,請參閱IronXL 儲存格和區域文件。 您也可以使用IronXL 範例頁面來探索其他模式。
輸入
輸出
如何使用 IronXL 在 C# 中將 Excel 資料匯出到現有的 Excel 檔案範本:圖 6 - 載入 Excel 範本輸出
如何在模板中替換佔位標記?
許多範本使用佔位符文字標記,例如 {{CustomerName}} 或 {{InvoiceDate}},這些標記需要替換為實際的執行時間值。 IronXL 透過在定義的範圍內進行儲存格迭代來處理這種情況。 這種模式對於產生發票、填寫合約和建立個人化報告尤其有用:
using IronXL;
// Load an invoice template containing placeholder markers
WorkBook workbook = WorkBook.Load("InvoiceTemplate.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Iterate over a range and replace placeholder text
foreach (var cell in sheet["A1:H50"])
{
if (cell.Text.Contains("{{CustomerName}}"))
cell.Value = cell.Text.Replace("{{CustomerName}}", "Acme Corporation");
if (cell.Text.Contains("{{InvoiceDate}}"))
cell.Value = cell.Text.Replace("{{InvoiceDate}}", DateTime.Now.ToShortDateString());
if (cell.Text.Contains("{{InvoiceNumber}}"))
cell.Value = cell.Text.Replace("{{InvoiceNumber}}", "INV-2025-001");
}
// Append line items starting at row 15
var items = new[]
{
new { Description = "Software License", Qty = 5, Price = 299.99 },
new { Description = "Support Package", Qty = 1, Price = 999.99 }
};
int startRow = 15;
foreach (var item in items)
{
sheet[$"B{startRow}"].Value = item.Description;
sheet[$"E{startRow}"].IntValue = item.Qty;
sheet[$"F{startRow}"].DoubleValue = item.Price;
sheet[$"G{startRow}"].Formula = $"=E{startRow}*F{startRow}";
startRow++;
}
workbook.SaveAs("GeneratedInvoice.xlsx");
using IronXL;
// Load an invoice template containing placeholder markers
WorkBook workbook = WorkBook.Load("InvoiceTemplate.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Iterate over a range and replace placeholder text
foreach (var cell in sheet["A1:H50"])
{
if (cell.Text.Contains("{{CustomerName}}"))
cell.Value = cell.Text.Replace("{{CustomerName}}", "Acme Corporation");
if (cell.Text.Contains("{{InvoiceDate}}"))
cell.Value = cell.Text.Replace("{{InvoiceDate}}", DateTime.Now.ToShortDateString());
if (cell.Text.Contains("{{InvoiceNumber}}"))
cell.Value = cell.Text.Replace("{{InvoiceNumber}}", "INV-2025-001");
}
// Append line items starting at row 15
var items = new[]
{
new { Description = "Software License", Qty = 5, Price = 299.99 },
new { Description = "Support Package", Qty = 1, Price = 999.99 }
};
int startRow = 15;
foreach (var item in items)
{
sheet[$"B{startRow}"].Value = item.Description;
sheet[$"E{startRow}"].IntValue = item.Qty;
sheet[$"F{startRow}"].DoubleValue = item.Price;
sheet[$"G{startRow}"].Formula = $"=E{startRow}*F{startRow}";
startRow++;
}
workbook.SaveAs("GeneratedInvoice.xlsx");
Imports IronXL
' Load an invoice template containing placeholder markers
Dim workbook As WorkBook = WorkBook.Load("InvoiceTemplate.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Iterate over a range and replace placeholder text
For Each cell In sheet("A1:H50")
If cell.Text.Contains("{{CustomerName}}") Then
cell.Value = cell.Text.Replace("{{CustomerName}}", "Acme Corporation")
End If
If cell.Text.Contains("{{InvoiceDate}}") Then
cell.Value = cell.Text.Replace("{{InvoiceDate}}", DateTime.Now.ToShortDateString())
End If
If cell.Text.Contains("{{InvoiceNumber}}") Then
cell.Value = cell.Text.Replace("{{InvoiceNumber}}", "INV-2025-001")
End If
Next
' Append line items starting at row 15
Dim items = {
New With {.Description = "Software License", .Qty = 5, .Price = 299.99},
New With {.Description = "Support Package", .Qty = 1, .Price = 999.99}
}
Dim startRow As Integer = 15
For Each item In items
sheet($"B{startRow}").Value = item.Description
sheet($"E{startRow}").IntValue = item.Qty
sheet($"F{startRow}").DoubleValue = item.Price
sheet($"G{startRow}").Formula = $"=E{startRow}*F{startRow}"
startRow += 1
Next
workbook.SaveAs("GeneratedInvoice.xlsx")
此方法在定義的儲存格範圍內搜尋標記,並將其替換為實際值。 模板的格式(字體、顏色、邊框和數字格式)始終保持不變。 如需在執行時間進行更進階的樣式更改,請參閱IronXL 儲存格樣式指南,其中涵蓋背景顏色、字體屬性和邊框樣式。
如何選擇用於迭代的正確單元格範圍?
在迭代尋找佔位符時,選擇一個能夠覆蓋所有包含標記的儲存格但又不會過大的範圍。 對於大多數發票範本來說,像 "A1:H50" 這樣的範圍是有效的。 對於資料分佈在數百行的模板,將迭代限制在標題部分,並對資料主體使用直接單元格尋址。 即使處理大型工作簿,也能保持效能的可預測性。
如何處理缺失或不符的佔位符?
在呼叫 .Replace() 之前新增空值或空檢查,以避免模板版本不同時出現異常。 您可以記錄未解析的佔位符以進行偵錯:
using IronXL;
WorkBook workbook = WorkBook.Load("InvoiceTemplate.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
var replacements = new Dictionary<string, string>
{
{ "{{CustomerName}}", "Acme Corporation" },
{ "{{InvoiceDate}}", DateTime.Now.ToShortDateString() },
{ "{{InvoiceNumber}}", "INV-2025-002" }
};
foreach (var cell in sheet["A1:H50"])
{
if (string.IsNullOrEmpty(cell.Text)) continue;
foreach (var replacement in replacements)
{
if (cell.Text.Contains(replacement.Key))
cell.Value = cell.Text.Replace(replacement.Key, replacement.Value);
}
}
workbook.SaveAs("GeneratedInvoice_Safe.xlsx");
using IronXL;
WorkBook workbook = WorkBook.Load("InvoiceTemplate.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
var replacements = new Dictionary<string, string>
{
{ "{{CustomerName}}", "Acme Corporation" },
{ "{{InvoiceDate}}", DateTime.Now.ToShortDateString() },
{ "{{InvoiceNumber}}", "INV-2025-002" }
};
foreach (var cell in sheet["A1:H50"])
{
if (string.IsNullOrEmpty(cell.Text)) continue;
foreach (var replacement in replacements)
{
if (cell.Text.Contains(replacement.Key))
cell.Value = cell.Text.Replace(replacement.Key, replacement.Value);
}
}
workbook.SaveAs("GeneratedInvoice_Safe.xlsx");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Load("InvoiceTemplate.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
Dim replacements As New Dictionary(Of String, String) From {
{"{{CustomerName}}", "Acme Corporation"},
{"{{InvoiceDate}}", DateTime.Now.ToShortDateString()},
{"{{InvoiceNumber}}", "INV-2025-002"}
}
For Each cell In sheet("A1:H50")
If String.IsNullOrEmpty(cell.Text) Then Continue For
For Each replacement In replacements
If cell.Text.Contains(replacement.Key) Then
cell.Value = cell.Text.Replace(replacement.Key, replacement.Value)
End If
Next
Next
workbook.SaveAs("GeneratedInvoice_Safe.xlsx")
使用替換字典可讓程式碼更易於維護,並在模板中新增佔位符類型時更便於擴充。
如何從範本生成月度報告?
以下是一個實際範例,展示如何從現有的 Excel 範本(內含預先格式化的儲存格、圖表及百分比公式)生成每月銷售報告。 該程式碼採用頂層陳述式,並接受一個產品與銷售對應的字典:
using IronXL;
// Load the monthly report template
WorkBook workbook = WorkBook.Load("MonthlyReportTemplate.xlsx");
WorkSheet sheet = workbook.GetWorkSheet("Monthly Report");
// Build sample sales data
var salesData = new Dictionary<string, decimal>
{
{ "Product A", 42500.00m },
{ "Product B", 31750.50m },
{ "Product C", 18300.25m }
};
// Write report header
sheet["B2"].Value = $"Sales Report - {DateTime.Now:MMMM yyyy}";
sheet["B3"].Value = $"Generated: {DateTime.Now:g}";
// Write each product row starting at row 6
int currentRow = 6;
decimal totalSales = salesData.Values.Sum();
foreach (var sale in salesData)
{
sheet[$"B{currentRow}"].Value = sale.Key;
sheet[$"C{currentRow}"].DecimalValue = sale.Value;
// Percentage of total formula
sheet[$"D{currentRow}"].Formula = $"=C{currentRow}/C{currentRow + salesData.Count}*100";
currentRow++;
}
// Write the total row and apply bold style
sheet[$"C{currentRow}"].DecimalValue = totalSales;
sheet[$"C{currentRow}"].Style.Font.Bold = true;
// Save with a date-stamped filename
string outputPath = $"Reports/Monthly_Report_{DateTime.Now:yyyyMMdd}.xlsx";
workbook.SaveAs(outputPath);
using IronXL;
// Load the monthly report template
WorkBook workbook = WorkBook.Load("MonthlyReportTemplate.xlsx");
WorkSheet sheet = workbook.GetWorkSheet("Monthly Report");
// Build sample sales data
var salesData = new Dictionary<string, decimal>
{
{ "Product A", 42500.00m },
{ "Product B", 31750.50m },
{ "Product C", 18300.25m }
};
// Write report header
sheet["B2"].Value = $"Sales Report - {DateTime.Now:MMMM yyyy}";
sheet["B3"].Value = $"Generated: {DateTime.Now:g}";
// Write each product row starting at row 6
int currentRow = 6;
decimal totalSales = salesData.Values.Sum();
foreach (var sale in salesData)
{
sheet[$"B{currentRow}"].Value = sale.Key;
sheet[$"C{currentRow}"].DecimalValue = sale.Value;
// Percentage of total formula
sheet[$"D{currentRow}"].Formula = $"=C{currentRow}/C{currentRow + salesData.Count}*100";
currentRow++;
}
// Write the total row and apply bold style
sheet[$"C{currentRow}"].DecimalValue = totalSales;
sheet[$"C{currentRow}"].Style.Font.Bold = true;
// Save with a date-stamped filename
string outputPath = $"Reports/Monthly_Report_{DateTime.Now:yyyyMMdd}.xlsx";
workbook.SaveAs(outputPath);
Imports IronXL
' Load the monthly report template
Dim workbook As WorkBook = WorkBook.Load("MonthlyReportTemplate.xlsx")
Dim sheet As WorkSheet = workbook.GetWorkSheet("Monthly Report")
' Build sample sales data
Dim salesData As New Dictionary(Of String, Decimal) From {
{"Product A", 42500.0D},
{"Product B", 31750.5D},
{"Product C", 18300.25D}
}
' Write report header
sheet("B2").Value = $"Sales Report - {DateTime.Now:MMMM yyyy}"
sheet("B3").Value = $"Generated: {DateTime.Now:g}"
' Write each product row starting at row 6
Dim currentRow As Integer = 6
Dim totalSales As Decimal = salesData.Values.Sum()
For Each sale In salesData
sheet($"B{currentRow}").Value = sale.Key
sheet($"C{currentRow}").DecimalValue = sale.Value
' Percentage of total formula
sheet($"D{currentRow}").Formula = $"=C{currentRow}/C{currentRow + salesData.Count}*100"
currentRow += 1
Next
' Write the total row and apply bold style
sheet($"C{currentRow}").DecimalValue = totalSales
sheet($"C{currentRow}").Style.Font.Bold = True
' Save with a date-stamped filename
Dim outputPath As String = $"Reports/Monthly_Report_{DateTime.Now:yyyyMMdd}.xlsx"
workbook.SaveAs(outputPath)
此方法會填入標準化範本,自動計算百分比貢獻,並維持範本的Professional外觀。 由於來源範圍未變,範本中的現有圖表會根據新的資料值進行更新。
從 DataTable 或 DataSet 傳輸資料時,保留列名並將第一行視為標題。 有關從 DataTable 物件匯入的更多信息,請參閱IronXL DataTable 文件。
輸入
如何使用 IronXL 在 C# 中將 Excel 資料匯出到現有的 Excel 檔案範本:圖 7 - Excel 範本輸入
輸出
如何排除常見的範本錯誤?
在使用範本時,經常會遇到幾項常見問題。 下表將各項問題症狀對應至其成因與解決方案:
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 載入時發生 FileNotFoundException | 檔案路徑或工作目錄不正確 | 請使用 Path.Combine(AppContext.BaseDirectory, "template.xlsx") 以確保路徑的可靠性 |
| 顯示過期值的公式 | 寫入後未觸發自動計算 | 儲存前請呼叫 sheet.Calculate() |
| 受密碼保護的範本無法開啟 | 範本設有工作簿或工作表密碼 | 傳遞密碼:WorkBook.Load("template.xlsx", "password") |
| 處理大量資料時記憶體使用量過高 | 寫入期間將整個工作簿保留在記憶體中 | 使用 workbook.SaveAs() 搭配串流處理,並在儲存後釋放工作簿 |
| 寫入後儲存格格式遺失 | 直接覆寫儲存格樣式物件 | 僅設定 Value/Formula —— 請避免替換整個 Style 物件 |
| 圖表資料未更新 | 超出圖表來源範圍的書寫 | 確保資料列保持在為圖表提供資料的命名範圍或表格內 |
對於受密碼保護的文件,請將密碼作為第二個參數提供給 WorkBook.Load。 如果在寫入資料後公式沒有更新,請在呼叫 workbook.SaveAs() 之前呼叫 sheet.Calculate()。 對於大型資料集,請在儲存後釋放工作簿物件,以立即釋放受管與非受管記憶體。
更多疑難排解資源請參閱 IronXL 疑難排解文件及 IronXL API 參考手冊。
IronXL 還支援哪些其他 Excel 操作?
除了填入範本外,IronXL 還提供廣泛的 Excel 操作功能,可與上述工作流程相輔相成:
- 讀取 Excel 檔案 -- 將現有工作簿中的資料擷取至 C# 物件、清單或 DataTables
- 從頭建立 Excel 檔案 -- 當需要完全控制版面配置時,可不使用範本來建立新的工作簿
- 將 DataTable 匯出至 Excel -- 將 ADO.NET DataTable 物件直接轉換為試算表列
- 套用儲存格樣式 -- 透過程式設定背景顏色、字型粗細、邊框及數字格式
- 處理 Excel 公式——編寫並評估公式字串,包括 SUM、VLOOKUP 及條件公式
- 合併儲存格 -- 合併與取消合併標題及報表版面的儲存格範圍
- 保護工作表——鎖定儲存格或工作表,以防止意外編輯範本結構
- 轉換為 PDF -- 將已填入資料的範本直接渲染為 PDF,無需透過 Excel 即可進行分發
- 匯出為 CSV -- 將工作表資料儲存為逗號分隔值,以便進行後續處理
這些功能與範本填入功能整合,因此單一工作流程即可在一次操作中載入範本、填入資料、保護敏感的公式儲存格,並同時匯出 XLSX 檔與 PDF 版本。
IronXL 亦能與 XML 等其他資料交換格式完美整合,讓您能夠匯入結構化資料、進行轉換,並將結果匯出至範本中。 若需進一步了解與資料庫驅動報表生成的進階整合,請參閱 IronXL 部落格上的社群教學文章。
如何在生產環境中開始使用 IronXL?
IronXL 可免費用於開發與測試。 當您準備部署時,可從多種彈性授權方案中選擇,涵蓋個人開發者、團隊及 OEM 轉售。 請造訪 IronXL 授權頁面,尋找適合您專案的方案。
若要立即開始,請探索免費試用版下載,並將本教學中的程式碼範例套用至您自己的範本中執行。 IronXL 的 NuGet 頁面提供版本歷史與套件詳細資訊。 更多社群討論與範例請參閱 Iron Software 的 GitHub 儲存庫。 關於 XLSX 檔案所採用的 Open XML 檔案格式背景資訊,請參閱 ECMA-376 規格概述。
對於正在評估 IronXL 與其他替代方案的組織,IronXL 比較指南涵蓋功能差異、授權模式及效能基準測試,以協助您做出明智的決策。
常見問題解答
如何使用 C# 將資料匯出到現有的 Excel 範本?
使用 IronXL,您無需 Microsoft Office 即可在 C# 中將資料匯出到現有的 Excel 範本。 IronXL 讓您在填充動態資料的同時,保留 Excel 範本的格式、公式和佈局。
使用 IronXL 進行 Excel 範本匯出有哪些好處?
IronXL 提供了一種高效能的解決方案,可保留範本格式並提供高級功能,例如從各種來源(如資料集物件)插入數據,而無需依賴 Excel Interop 或 Microsoft Office。
使用 IronXL 是否必須安裝 Microsoft Office?
不,IronXL 不需要安裝 Microsoft Office。它可以獨立運行,使您能夠處理 Excel 文件和模板,而無需依賴任何 Office 軟體。
IronXL 能夠處理帶有公式的複雜 Excel 模板嗎?
是的,IronXL 可以處理複雜的 Excel 模板,包括帶有公式的模板,確保在匯出資料時保留所有現有功能和佈局。
IronXL 可以將哪些類型的資料來源匯出到 Excel 範本?
IronXL 可以從各種來源匯出數據,包括資料集對象,從而可以靈活地使用所需的資料填充 Excel 範本。
IronXL 如何提升工作流程效率?
IronXL 允許將資料無縫匯出到現有的 Excel 模板,而無需依賴 Office,從而簡化了報表產生過程,節省了時間和資源。
IronXL 是否適合產生專業的 Excel 表格輸出?
是的,IronXL 旨在透過保持模板的完整性並確保高品質的資料整合來創建專業的 Excel 表格輸出。


