使用OpenXML,我如何关联数据validation列表

我正在处理一个.xlsm文件,并需要知道如何使用另一张表上的列表来使用openXML和C#进行数据validation。

首先,我有一个.xlsm文件,里面有两个空的表单和macros。 在我的程序中,我打开文件,在Sheet1上创build列标题,然后在Sheet2上创buildvalidation列表。 所以,在我运行程序Sheet1后,“A1”包含文本“Color”,Sheet2“A1:A4”包含“Blue”,“Green”,“Red”,“Yellow”。 我得到这个很好。

我想这样做,所以在sheet1上的列“A”的所有单元格中都有一个下拉列表,其中包含4种颜色中的每一种,并将它们强制为唯一的input。 在Microsoft Excel中,通过转到“数据”选项卡,select“数据validation”,select“列表”并突出显示要使用的单元格。 我需要以编程方式进行这种关联。

Microsoft Excel创build的(所需的)XML如果手动执行的话是这样的:

<extLst> <ext uri="{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"> <x14:dataValidations count="1" xmlns:xm="http://schemas.microsoft.com/office/excel/2006/main"> <x14:dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1"> <x14:formula1> <xm:f>'Validation Data'!$A$1:$A$4</xm:f> </x14:formula1> <xm:sqref>A1:A1048576</xm:sqref> </x14:dataValidation> </x14:dataValidations> </ext> </extLst> 

下面的方法和结果是我尝试过的。 这可能会给我想要做的更好的想法。

在这里,我将“Sheet2'!$ A $ 1:$ A $ 4”作为“validationListCells”参数传入。 这表示“Sheet2”中的单元格,在这个例子中,它将包含颜色名称“Red”,“Green”等等。

我通过“A2:A1048576”作为“cellsToValidate”参数。 这表示Sheet1列“A”的所有单元格,我要在其上执行validation。

我传递“Sheet1”作为worksheetName参数。

 private void InsertValidation(String worksheetName, String validationListCells, String cellsToValidate) { DataValidations dataValidations1 = new DataValidations() { Count = (UInt32Value)1U }; DataValidation dataValidation1 = new DataValidation() { Formula1 = new Formula1(validationListCells), Type = DataValidationValues.List, ShowInputMessage = true, ShowErrorMessage = true, SequenceOfReferences = new ListValue<StringValue>() { InnerText = cellsToValidate } }; dataValidations1.Append(dataValidation1); using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(_documentPath, true)) { WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName); worksheetPart.Worksheet.Append(dataValidations1); worksheetPart.Worksheet.Save(); } } 

它在Sheet1.xml中产生这个XML。 这在Excel中导致错误。

 <x:dataValidations count="1"> <x:dataValidation type="list" showInputMessage="1" showErrorMessage="1" sqref="A2: A1048576"> <x:formula1>'Sheet2'!$A$1:$A$5</x:formula1> </x:dataValidation> </x:dataValidations> 

它看起来像我可能在正确的轨道上,因为它开始像Excel创build的XML,但我是完全新的openXML,我在networking上找不到这个话题。

提前致谢!

对于需要这个的任何人..下面的代码为我工作。 我把那里的user3251089的variables名称。

一般来说,当我尝试以编程方式创build一个excel“function”时,我手动制作了一个非常基本的excel,其中包含了该function(也删除了额外的工作表)。 然后我反映这个代码,并尝试使它更漂亮。

希望它服务于某人!

 using Excel = DocumentFormat.OpenXml.Office.Excel; using X14 = DocumentFormat.OpenXml.Office2010.Excel; 

…..

 Worksheet worksheet = worksheetPart.Worksheet; WorksheetExtensionList worksheetExtensionList = new WorksheetExtensionList(); WorksheetExtension worksheetExtension = new WorksheetExtension() { Uri = "{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" }; worksheetExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); X14.DataValidations dataValidations = new X14.DataValidations() { Count = (UInt32Value)3U }; dataValidations.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); //sites validation dataValidations.Append(new X14.DataValidation() { Type = DataValidationValues.List, AllowBlank = true, ShowInputMessage = true, ShowErrorMessage = true, DataValidationForumla1 = new X14.DataValidationForumla1() { Formula = new Excel.Formula(validationListCells) }, ReferenceSequence = new Excel.ReferenceSequence(cellsToValidate) }); worksheetExtension.Append(dataValidations); worksheetExtensionList.Append(worksheetExtension); worksheet.Append(worksheetExtensionList); worksheet.Save();