Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OpenXML,如何关联用于数据验证的列表_C#_Xml_Excel_Openxml - Fatal编程技术网

C# 使用OpenXML,如何关联用于数据验证的列表

C# 使用OpenXML,如何关联用于数据验证的列表,c#,xml,excel,openxml,C#,Xml,Excel,Openxml,我正在处理一个.xlsm文件,需要知道如何使用openXML和C#在另一个工作表上使用列表进行数据验证 首先,我有一个.xlsm文件,其中有两个空工作表和宏。在我的程序中,我打开文件,在Sheet1上创建列标题,然后在sheet2上创建验证列表。因此,在我运行程序后,Sheet1“A1”包含文本“颜色”,Sheet2“A1:A4”包含“蓝色”、“绿色”、“红色”、“黄色”。我走到这一步还不错 我想这样做,在sheet1上列“a”的所有单元格中都有一个下拉列表,其中包含4种颜色中的每一种,并强制将

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

首先,我有一个.xlsm文件,其中有两个空工作表和宏。在我的程序中,我打开文件,在Sheet1上创建列标题,然后在sheet2上创建验证列表。因此,在我运行程序后,Sheet1“A1”包含文本“颜色”,Sheet2“A1:A4”包含“蓝色”、“绿色”、“红色”、“黄色”。我走到这一步还不错

我想这样做,在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>

“验证数据”$A$1:$A$4
A1:A1048576
下面的方法和结果是我尝试过的。这也许能让我更好地了解我在做什么

在这里,我传入“'Sheet2'!$A$1:$A$4”作为“validationListCells”参数。这表示“Sheet2”中的单元格,在本例中,这些单元格将包含颜色名称“红色”、“绿色”等

我传入“A2:A1048576”作为“cellsToValidate”参数。这表示Sheet1列“A”的所有单元格,我希望对其执行验证

我将“Sheet1”作为工作表名称参数传递

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();
    }
}
private void InsertValidation(字符串工作表名称、字符串验证列表单元格、字符串单元格验证)
{
DataValidations dataValidations1=新的DataValidations(){Count=(uint32值)1U};
DataValidation dataValidation1=新的DataValidation()
{ 
公式1=新公式1(validationListCells),
类型=DataValidationValues.List,
ShowInputMessage=true,
消息=true,
SequenceOfReferences=new ListValue(){InnerText=cellsToValidate}
};
dataValidations1.Append(dataValidation1);
使用(SpreadsheetDocument电子表格=SpreadsheetDocument.Open(_documentPath,true))
{
WorksheetPart WorksheetPart=GetWorksheetPartByName(电子表格,工作表名称);
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>

“床单2”$A$1:$A$5
看起来我的思路是正确的,因为它开始类似于Excel创建的xml,但我对openXML完全陌生,我在网上几乎找不到关于这个主题的内容


提前谢谢

对于其他需要此功能的人..下面的代码对我很有用。 我把user3251089的变量名放进去了

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

希望对某人有用

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


您需要为多个xml文件或仅为一个xml文件执行此操作吗?如果您只需要为一个用户执行此操作,那么使用“搜索和替换”可能已经足以使其正常工作。不确定使用搜索和替换是什么意思。当我最初试图弄明白这一点时,看起来我需要使用openXML DataValidation和DataValidations类,也许还有formula类。请参阅已编辑的帖子。您是否已解决此问题?我有完全相同的问题,但最终的范围值不是+1,而是+20。在我的例子中,这种情况只发生在+20项目录中。短的就行了
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();