我正在处理.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完全不熟悉,而且我在网上找不到这个主题。
提前致谢!
答案 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();