在Excel中,我可以向一系列单元格添加验证规则,并将接受的输入限制为下拉列表中显示的值列表。这是使用数据验证工具完成的,如下图所示:
我有一些生成excel表的C#代码,我想在其中一个列中添加相同类型的验证。
使用Microsoft.Office.Interop.Excel
,我可以将这种下拉式验证添加到整个列:
string flatList = "FirstChoice,SecondChoice,ThirdChoice";
//select the entire first row as the range
Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range("A1").EntireColumn;
//remove any previously existing validation
range.Validation.Delete();
//add new validation
range.Validation.Add(
Microsoft.Office.Interop.Excel.XlDVType.xlValidateList,
Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation,
Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween,
flatList,
Type.Missing);
range.Validation.IgnoreBlank = true;
range.Validation.InCellDropdown = true;
问题是,我不能保证我的用户安装了Microsoft Office。因此,我想改为使用DocumentFormat.OpenXML
。
是否可以使用OpenXML添加相同类型的下拉验证?
我看过一些使用DataValidation
的帖子,但还是无法弄清楚如何让它工作,如果这样可以解决我的问题。
答案 0 :(得分:2)
你是正确的,你需要使用DataValidation
课程,但你也需要DataValidations
课程。
WorkSheet
可以有零个或一个DataValidations
,而DataValidation
又可以包含一个或多个using (SpreadsheetDocument myDoc = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
/*** GENERAL SETUP ***/
WorkbookPart workbookpart = myDoc.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
SheetData sheetData = new SheetData();
// Add a WorkbookPart to the document.
worksheetPart.Worksheet = new Worksheet(sheetData);
Sheets sheets = myDoc.WorkbookPart.Workbook.AppendChild(new Sheets());
sheets.AppendChild(new Sheet()
{
Id = myDoc.WorkbookPart.GetIdOfPart(myDoc.WorkbookPart.WorksheetParts.First()),
SheetId = 1,
Name = "Sheet1"
});
/*** DATA VALIDATION CODE ***/
DataValidations dataValidations = new DataValidations();
DataValidation dataValidation = new DataValidation()
{
Type = DataValidationValues.List,
AllowBlank = true,
SequenceOfReferences = new ListValue<StringValue>() { InnerText = "A1:A1048576" }
};
Formula1 formula = new Formula1();
formula.Text = "\"FirstChoice,SecondChoice,ThirdChoice\"";
dataValidation.Append(formula);
dataValidations.Append(dataValidation);
worksheetPart.Worksheet.AppendChild(dataValidations);
}
。
以下代码将创建您要查找的数据验证:
<batch:job id="downloadFile">
<batch:step id="validator" >
<batch:tasklet ref="InteropValidator"/>
<batch:next on="FAILED" to="AckStep"/>
<batch:next on="COMPLETED" to="loadFiles"/>
</batch:step>
<batch:step id="loadFiles" next="AckStep">
<partition step="slave" partitioner="partitionerFactory">
<handler grid-size="1" task-executor="taskExecutor" />
</partition>
</batch:step>
<batch:step id="AckStep" >
<batch:tasklet ref="Acksteptasklet"/>
<batch:fail on="FAILED"/>
</batch:step>
</batch:job>
答案 1 :(得分:1)
通过更多挖掘,我能够找出如何使用DataValidation
使用DocumentFormat.OpenXml
在Excel表格的整列中添加下拉列表验证:
string flatList = "FirstChoice,SecondChoice,ThirdChoice";
DataValidation dataValidation = new DataValidation
{
Type = DataValidationValues.List,
AllowBlank = true,
//Use A:A or A1:A1048576 to select the entire column A
//1048576 (2^20) is the max row number since Excel 2007.
SequenceOfReferences = new ListValue<StringValue>() { InnerText = "A:A" },
//Set the formula to the list of dropdown values. Escape the double quotes.
Formula1 = new Formula1("\"" + flatList + "\"")
};
//Check if there are any other DataValidations already in the worksheet
DataValidations dvs = worksheet.GetFirstChild<DataValidations>();
if (dvs != null)
{
//If you already have existing validation for column A, you may need to Remove()
//or Replace() the current validation to get the new validation to show.
//Add the new DataValidation to the list of DataValidations
dvs.Count = dvs.Count + 1;
dvs.Append(dataValidation);
}
else
{
DataValidations newDVs = new DataValidations();
newDVs.Append(dataValidation);
newDVs.Count = 1;
//Append the validation to the DocumentFormat.OpenXml.SpreadSheet.Worksheet variable
worksheet.Append(newDVs);
}
答案 2 :(得分:0)
我能够手动下拉列表,并且正在研究以获取动态excel。我能够弄清楚如何使用DataValidation通过DocumentFormat.OpenXml将下拉列表验证添加到Excel工作表的整个列中...
// Not right
viewInScrollView.anchor(top: view.safeAreaLayoutGuide.topAnchor, leading: view.leadingAnchor, bottom: view.bottomAnchor, trailing: view.trailingAnchor)
// It should aligned to `UIScrollView`'s top, bottom, left and right anchors.