IronXL 故障排除 Excel限制:字符串列表的數據驗證 Excel在字串資料驗證方面的局限性 Curtis Chau 更新:2025年8月19日 下載 IronXL NuGet 下載 DLL 下載 開始免費試用 法學碩士副本 法學碩士副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在 Grok 中打開 向 Grok 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 This article was translated from English: Does it need improvement? Translated View the article in English Microsoft Excel 對字串清單的長度有一個已知的限制,即清單的總長度(包括逗號等分隔符號)不能超過 255 個字元。 當您在來源欄位中手動輸入字串列表,而不是從 Excel 表格中的現有範圍中選擇資料時,就會出現此問題,如下所示。 Excel 限制問題 解決 Excel 限制問題 針對此限制的標準解決方法是在工作表的列或行中建立值列表,而不是在來源欄位中輸入字串列表。 如下圖所示。 Excel 限制解決方案範例 之後,在資料驗證中使用公式引用,例如 C1:C100,並指向該範圍。 這種方法可以繞過限制,讓你建立下拉清單而不受 255 個字元的限制。 IronXL 出現問題 IronXL 使用AddStringListRule方法將字串清單套用至資料驗證。 但是,由於上述 Excel 中的字元限制,保存方法仍然有效。 但是,需要注意的是,如果清單超過 255 個字符,則可能會導致嚴重問題:開啟檔案時 Excel 崩潰。 下面舉個例子來說明這個問題。 using IronXL; using IronXL.DataValidations; // Set your license key here if you have one IronXL.License.LicenseKey = "YOUR-LICENSE-KEY"; var workBook = WorkBook.Create(ExcelFileFormat.XLSX); var sheet = workBook.CreateWorkSheet("Validation Rule Example using"); // Apply rules from row 2 down to row 500 var validationRangeStart = "2"; var validationRangeFinish = "500"; // --- 1. Define All Column Headers --- sheet["A1"].Value = "String List Test"; sheet["B1"].Value = "Formula List Test"; sheet["A1:B1"].Style.Font.Bold = true; // 256 string[] arrayString = new string[] { "SKU-A01-R", "SKU-A02-R", "SKU-A03-R", "SKU-A04-R", "SKU-A05-R", "SKU-B01-G", "SKU-B02-G", "SKU-B03-G", "SKU-B04-G", "SKU-B05-G", "SKU-C01-B", "SKU-C02-B", "SKU-C03-B", "SKU-C04-B", "SKU-C05-B", "SKU-D01-Y", "SKU-D02-Y", "SKU-D03-Y", "SKU-D04-Y", "SKU-D05-Y", "END-001", "END-002", "END-003", "END-004", "END-005", "END-010", "END-001" }; // total char with seperator 257 (230 char + 26 sperator [,] ) // no problem when write to a file var skuValidation = sheet.DataValidations.AddStringListRule(sheet[$"A{validationRangeStart}:A{validationRangeFinish}"].RangeAddress, arrayString); // set error box skuValidation.ShowErrorBox = true; skuValidation.ErrorBoxTitle = "Invalid SKU"; skuValidation.ErrorBoxText = "Please select a SKU from the list."; skuValidation.ErrorAlert = ErrorAlert.Stop; //attempt to save the file var fileName = "CategoryProductCatalog.xlsx"; workBook.SaveAs(fileName); using IronXL; using IronXL.DataValidations; // Set your license key here if you have one IronXL.License.LicenseKey = "YOUR-LICENSE-KEY"; var workBook = WorkBook.Create(ExcelFileFormat.XLSX); var sheet = workBook.CreateWorkSheet("Validation Rule Example using"); // Apply rules from row 2 down to row 500 var validationRangeStart = "2"; var validationRangeFinish = "500"; // --- 1. Define All Column Headers --- sheet["A1"].Value = "String List Test"; sheet["B1"].Value = "Formula List Test"; sheet["A1:B1"].Style.Font.Bold = true; // 256 string[] arrayString = new string[] { "SKU-A01-R", "SKU-A02-R", "SKU-A03-R", "SKU-A04-R", "SKU-A05-R", "SKU-B01-G", "SKU-B02-G", "SKU-B03-G", "SKU-B04-G", "SKU-B05-G", "SKU-C01-B", "SKU-C02-B", "SKU-C03-B", "SKU-C04-B", "SKU-C05-B", "SKU-D01-Y", "SKU-D02-Y", "SKU-D03-Y", "SKU-D04-Y", "SKU-D05-Y", "END-001", "END-002", "END-003", "END-004", "END-005", "END-010", "END-001" }; // total char with seperator 257 (230 char + 26 sperator [,] ) // no problem when write to a file var skuValidation = sheet.DataValidations.AddStringListRule(sheet[$"A{validationRangeStart}:A{validationRangeFinish}"].RangeAddress, arrayString); // set error box skuValidation.ShowErrorBox = true; skuValidation.ErrorBoxTitle = "Invalid SKU"; skuValidation.ErrorBoxText = "Please select a SKU from the list."; skuValidation.ErrorAlert = ErrorAlert.Stop; //attempt to save the file var fileName = "CategoryProductCatalog.xlsx"; workBook.SaveAs(fileName); Imports IronXL Imports IronXL.DataValidations ' Set your license key here if you have one IronXL.License.LicenseKey = "YOUR-LICENSE-KEY" Dim workBook = WorkBook.Create(ExcelFileFormat.XLSX) Dim sheet = workBook.CreateWorkSheet("Validation Rule Example using") ' Apply rules from row 2 down to row 500 Dim validationRangeStart = "2" Dim validationRangeFinish = "500" ' --- 1. Define All Column Headers --- sheet("A1").Value = "String List Test" sheet("B1").Value = "Formula List Test" sheet("A1:B1").Style.Font.Bold = True ' 256 Dim arrayString() As String = { "SKU-A01-R", "SKU-A02-R", "SKU-A03-R", "SKU-A04-R", "SKU-A05-R", "SKU-B01-G", "SKU-B02-G", "SKU-B03-G", "SKU-B04-G", "SKU-B05-G", "SKU-C01-B", "SKU-C02-B", "SKU-C03-B", "SKU-C04-B", "SKU-C05-B", "SKU-D01-Y", "SKU-D02-Y", "SKU-D03-Y", "SKU-D04-Y", "SKU-D05-Y", "END-001", "END-002", "END-003", "END-004", "END-005", "END-010", "END-001" } ' no problem when write to a file Dim skuValidation = sheet.DataValidations.AddStringListRule(sheet($"A{validationRangeStart}:A{validationRangeFinish}").RangeAddress, arrayString) ' set error box skuValidation.ShowErrorBox = True skuValidation.ErrorBoxTitle = "Invalid SKU" skuValidation.ErrorBoxText = "Please select a SKU from the list." skuValidation.ErrorAlert = ErrorAlert.Stop 'attempt to save the file Dim fileName = "CategoryProductCatalog.xlsx" workBook.SaveAs(fileName) $vbLabelText $csharpLabel 在程式碼中,我們嘗試將名為arrayString字串清單作為字串清單的來源,以建立下拉式清單。然後,我們嘗試將其儲存為CategoryProductCatalog.xlsx 。 但是,由於這些限制,當使用 Microsoft Excel 開啟該檔案時,會顯示一則訊息,指出該檔案已損壞,無法開啟。 ! 替代文本 IronXL 的解決方案 為了妥善解決 Excel 的這項限制,IronXL 提供了AddFormulaListRule方法,可透過DataValidations屬性取得。 這種方法與使用 Excel 的解決方案類似。 我們首先將數值清單寫入工作表上的一系列儲存格。 然後使用AddFormulaListRule將該範圍引用為下拉清單的資料來源。這有效地繞過了限制,方法與我們對 Excel 解決方案所使用的方法相同,但這次是透過程式設計實現的。 正確使用AddFormulaListRule可以繞過 Excel 的限制,同時也確保檔案在 Excel 中開啟時仍然可讀且穩定,即使包含很長的值清單。 程式碼範例 以下是規避此問題的其他範例程式碼。 在同一個工作簿中,我們首先建立一個工作表,然後定義所有列標題。 我們輸入上一個範例中的字串列表,以及新的資料來示範該功能。 然後,我們使用上面給出的驗證範圍來呼叫AddFormulaListRule 。 最後,我們將其儲存為validationRuleExample.xlsx 。 為了確保工作簿沒有損壞且可以正常使用,我們在 Excel 中開啟它。 這一步驟至關重要,因為它證明了我們的程式碼已成功實現。 using IronXL; using IronXL.DataValidations; using System; // Set your license key here if you have one IronXL.License.LicenseKey = "YOUR-LICENSE-KEY"; var workBook = WorkBook.Create(ExcelFileFormat.XLSX); var sheet = workBook.CreateWorkSheet("Validation Rule Example using"); // Apply rules from row 2 down to row 500 var validationRangeStart = "2"; var validationRangeFinish = "500"; // --- 1. Define All Column Headers --- sheet["A1"].Value = "String List Test"; sheet["B1"].Value = "Formula List Test"; sheet["A1:B1"].Style.Font.Bold = true; string[] arrayString2 = new string[] { "SKU-A01-R", "SKU-A02-R", "SKU-A03-R", "SKU-A04-R", "SKU-A05-R", "SKU-B01-G", "SKU-B02-G", "SKU-B03-G", "SKU-B04-G", "SKU-B05-G", "SKU-C01-B", "SKU-C02-B", "SKU-C03-B", "SKU-C04-B", "SKU-C05-B", "SKU-D01-Y", "SKU-D02-Y", "SKU-D03-Y", "SKU-D04-Y", "SKU-D05-Y", "END-001", "END-002", "END-003", "END-004", "END-005", "END-010", "END-001", "IRON01","IRON02","IRON03","IRON04","IRON05","IRON06","IRON07","IRON08","IRON09","IRON10", "IRON11","IRON12","IRON13","IRON14","IRON15","IRON16","IRON17","IRON18","IRON19","IRON20", "IRON21","IRON22","IRON23","IRON24","IRON25","IRON26","IRON27","IRON28","IRON29","IRON30", "IRON31","IRON32","IRON33","IRON34","IRON35","IRON36","IRON37","IRON38","IRON39","IRON40", "IRON41","IRON42","IRON43","IRON44","IRON45","IRON46","IRON47","IRON48","IRON49","IRON50", "IRON51","IRON52","IRON53","IRON54","IRON55","IRON56","IRON57","IRON58","IRON59","IRON60", "IRON61","IRON62","IRON63","IRON64","IRON65","IRON66","IRON67","IRON68","IRON69","IRON70", "IRON71","IRON72","IRON73","IRON74","IRON75","IRON76","IRON77","IRON78","IRON79","IRON80", "IRON81","IRON82","IRON83","IRON84","IRON85","IRON86","IRON87","IRON88","IRON89","IRON90", "IRON91","IRON92","IRON93","IRON94","IRON95","IRON96","IRON97","IRON98","IRON99","IRON100" }; // total char with seperator 257 (230 char + 26 sperator [,] ) //Write the contents of your array to column A of the data sheet. for (int i = 0; i < arrayString2.Length; i++) { // Note: IronXL row and cell indices are 1-based. sheet[$"A{i + 1}"].Value = arrayString2[i]; } // Create the formula string that points to our data range. // This will look like: 'ValidationData'!$A$1:$A$100 string formula = $"'{sheet.Name}'!$A$1:$A${arrayString2.Length}"; Console.WriteLine($"Generated formula for validation: {formula}"); var sku2Validation = sheet.DataValidations.AddFormulaListRule(sheet[$"B{validationRangeStart}:B{validationRangeFinish}"], formula); sku2Validation.ShowErrorBox = true; sku2Validation.ErrorBoxTitle = "Invalid SKU2"; sku2Validation.ErrorBoxText = "Please select a SKU from the list."; sku2Validation.ErrorAlert = ErrorAlert.Stop; // --- Final Touches --- sheet.AutoSizeColumn(0, true); sheet.AutoSizeColumn(1, true); var fileName = "validationRuleExample.xlsx"; workBook.SaveAs(fileName); Console.WriteLine($"Successfully created '{fileName}' with 2 validation rules example."); using IronXL; using IronXL.DataValidations; using System; // Set your license key here if you have one IronXL.License.LicenseKey = "YOUR-LICENSE-KEY"; var workBook = WorkBook.Create(ExcelFileFormat.XLSX); var sheet = workBook.CreateWorkSheet("Validation Rule Example using"); // Apply rules from row 2 down to row 500 var validationRangeStart = "2"; var validationRangeFinish = "500"; // --- 1. Define All Column Headers --- sheet["A1"].Value = "String List Test"; sheet["B1"].Value = "Formula List Test"; sheet["A1:B1"].Style.Font.Bold = true; string[] arrayString2 = new string[] { "SKU-A01-R", "SKU-A02-R", "SKU-A03-R", "SKU-A04-R", "SKU-A05-R", "SKU-B01-G", "SKU-B02-G", "SKU-B03-G", "SKU-B04-G", "SKU-B05-G", "SKU-C01-B", "SKU-C02-B", "SKU-C03-B", "SKU-C04-B", "SKU-C05-B", "SKU-D01-Y", "SKU-D02-Y", "SKU-D03-Y", "SKU-D04-Y", "SKU-D05-Y", "END-001", "END-002", "END-003", "END-004", "END-005", "END-010", "END-001", "IRON01","IRON02","IRON03","IRON04","IRON05","IRON06","IRON07","IRON08","IRON09","IRON10", "IRON11","IRON12","IRON13","IRON14","IRON15","IRON16","IRON17","IRON18","IRON19","IRON20", "IRON21","IRON22","IRON23","IRON24","IRON25","IRON26","IRON27","IRON28","IRON29","IRON30", "IRON31","IRON32","IRON33","IRON34","IRON35","IRON36","IRON37","IRON38","IRON39","IRON40", "IRON41","IRON42","IRON43","IRON44","IRON45","IRON46","IRON47","IRON48","IRON49","IRON50", "IRON51","IRON52","IRON53","IRON54","IRON55","IRON56","IRON57","IRON58","IRON59","IRON60", "IRON61","IRON62","IRON63","IRON64","IRON65","IRON66","IRON67","IRON68","IRON69","IRON70", "IRON71","IRON72","IRON73","IRON74","IRON75","IRON76","IRON77","IRON78","IRON79","IRON80", "IRON81","IRON82","IRON83","IRON84","IRON85","IRON86","IRON87","IRON88","IRON89","IRON90", "IRON91","IRON92","IRON93","IRON94","IRON95","IRON96","IRON97","IRON98","IRON99","IRON100" }; // total char with seperator 257 (230 char + 26 sperator [,] ) //Write the contents of your array to column A of the data sheet. for (int i = 0; i < arrayString2.Length; i++) { // Note: IronXL row and cell indices are 1-based. sheet[$"A{i + 1}"].Value = arrayString2[i]; } // Create the formula string that points to our data range. // This will look like: 'ValidationData'!$A$1:$A$100 string formula = $"'{sheet.Name}'!$A$1:$A${arrayString2.Length}"; Console.WriteLine($"Generated formula for validation: {formula}"); var sku2Validation = sheet.DataValidations.AddFormulaListRule(sheet[$"B{validationRangeStart}:B{validationRangeFinish}"], formula); sku2Validation.ShowErrorBox = true; sku2Validation.ErrorBoxTitle = "Invalid SKU2"; sku2Validation.ErrorBoxText = "Please select a SKU from the list."; sku2Validation.ErrorAlert = ErrorAlert.Stop; // --- Final Touches --- sheet.AutoSizeColumn(0, true); sheet.AutoSizeColumn(1, true); var fileName = "validationRuleExample.xlsx"; workBook.SaveAs(fileName); Console.WriteLine($"Successfully created '{fileName}' with 2 validation rules example."); Imports IronXL Imports IronXL.DataValidations Imports System ' Set your license key here if you have one IronXL.License.LicenseKey = "YOUR-LICENSE-KEY" Dim workBook = WorkBook.Create(ExcelFileFormat.XLSX) Dim sheet = workBook.CreateWorkSheet("Validation Rule Example using") ' Apply rules from row 2 down to row 500 Dim validationRangeStart = "2" Dim validationRangeFinish = "500" ' --- 1. Define All Column Headers --- sheet("A1").Value = "String List Test" sheet("B1").Value = "Formula List Test" sheet("A1:B1").Style.Font.Bold = True Dim arrayString2() As String = {"SKU-A01-R", "SKU-A02-R", "SKU-A03-R", "SKU-A04-R", "SKU-A05-R", "SKU-B01-G", "SKU-B02-G", "SKU-B03-G", "SKU-B04-G", "SKU-B05-G", "SKU-C01-B", "SKU-C02-B", "SKU-C03-B", "SKU-C04-B", "SKU-C05-B", "SKU-D01-Y", "SKU-D02-Y", "SKU-D03-Y", "SKU-D04-Y", "SKU-D05-Y", "END-001", "END-002", "END-003", "END-004", "END-005", "END-010", "END-001", "IRON01", "IRON02", "IRON03", "IRON04", "IRON05", "IRON06", "IRON07", "IRON08", "IRON09", "IRON10", "IRON11", "IRON12", "IRON13", "IRON14", "IRON15", "IRON16", "IRON17", "IRON18", "IRON19", "IRON20", "IRON21", "IRON22", "IRON23", "IRON24", "IRON25", "IRON26", "IRON27", "IRON28", "IRON29", "IRON30", "IRON31", "IRON32", "IRON33", "IRON34", "IRON35", "IRON36", "IRON37", "IRON38", "IRON39", "IRON40", "IRON41", "IRON42", "IRON43", "IRON44", "IRON45", "IRON46", "IRON47", "IRON48", "IRON49", "IRON50", "IRON51", "IRON52", "IRON53", "IRON54", "IRON55", "IRON56", "IRON57", "IRON58", "IRON59", "IRON60", "IRON61", "IRON62", "IRON63", "IRON64", "IRON65", "IRON66", "IRON67", "IRON68", "IRON69", "IRON70", "IRON71", "IRON72", "IRON73", "IRON74", "IRON75", "IRON76", "IRON77", "IRON78", "IRON79", "IRON80", "IRON81", "IRON82", "IRON83", "IRON84", "IRON85", "IRON86", "IRON87", "IRON88", "IRON89", "IRON90", "IRON91", "IRON92", "IRON93", "IRON94", "IRON95", "IRON96", "IRON97", "IRON98", "IRON99", "IRON100"} 'Write the contents of your array to column A of the data sheet. For i As Integer = 0 To arrayString2.Length - 1 ' Note: IronXL row and cell indices are 1-based. sheet($"A{i + 1}").Value = arrayString2(i) Next i ' Create the formula string that points to our data range. ' This will look like: 'ValidationData'!$A$1:$A$100 Dim formula As String = $"'{sheet.Name}'!$A$1:$A${arrayString2.Length}" Console.WriteLine($"Generated formula for validation: {formula}") Dim sku2Validation = sheet.DataValidations.AddFormulaListRule(sheet($"B{validationRangeStart}:B{validationRangeFinish}"), formula) sku2Validation.ShowErrorBox = True sku2Validation.ErrorBoxTitle = "Invalid SKU2" sku2Validation.ErrorBoxText = "Please select a SKU from the list." sku2Validation.ErrorAlert = ErrorAlert.Stop ' --- Final Touches --- sheet.AutoSizeColumn(0, True) sheet.AutoSizeColumn(1, True) Dim fileName = "validationRuleExample.xlsx" workBook.SaveAs(fileName) Console.WriteLine($"Successfully created '{fileName}' with 2 validation rules example.") $vbLabelText $csharpLabel 輸出 Excel 文件 如您所見,使用AddFormulaListRule後,Excel 檔案穩定,沒有出現任何當機。 要親自體驗,請點擊此連結查看本文中使用的應用程式演示以及 Excel 文件。此演示將幫助您了解流程的實際運作情況,並了解如何將其應用到您的工作中。 Curtis Chau 立即與工程團隊聊天 技術撰稿人 Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。 準備好開始了嗎? Nuget 下載 1,846,091 | 版本: 2026.2 剛剛發布 免費 NuGet 下載 總下載量:1,846,091 查看許可證