使用OpenXML,如何关联列表以进行数据验证

时间:2014-01-30 00:02:29

标签: c# xml excel openxml

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

首先,我有一个.xlsm文件,里面有两张空页和宏。在我的程序中,我打开文件,在Sheet1上创建列标题,然后在sheet2上创建验证列表。因此,在我运行程序后,Sheet1“A1”包含文本“Color”,Sheet2“A1:A4”包含“Blue”,“Green”,“Red”,“Yellow”。我觉得这很好。

我想这样做,因此在sheet1上的列“A”的所有单元格中都有一个下拉列表,其中包含4种颜色中的每种颜色并强制它们作为唯一的输入。在Microsoft Excel中,这可以通过转到“数据”选项卡,选择“数据验证”,选择“列表”并突出显示要使用的单元格来完成。我需要以编程方式建立这种关联。

如果我手动执行,Microsoft Excel创建的(所需)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”的所有单元格,我要在其上强制执行验证。

我将“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创建的xml,但我对openXML完全不熟悉,而且我在网上找不到这个主题。

提前致谢!

1 个答案:

答案 0 :(得分:0)

对于其他需要此功能的人......下面的代码对我有用。 我在那里放了user3251089的变量名。

通常,当我尝试以编程方式创建一个excel“功能”时,我手动创建一个非常基本的excel,其中包含该功能(也删除额外的工作表)。然后我反思代码,并试着让它更漂亮。

希望它能为某人服务!

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();