使用OpenXML

时间:2016-11-11 18:01:07

标签: c# excel validation office-interop openxml

在Excel中,我可以向一系列单元格添加验证规则,并将接受的输入限制为下拉列表中显示的值列表。这是使用数据验证工具完成的,如下图所示:

enter image description here

我有一些生成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的帖子,但还是无法弄清楚如何让它工作,如果这样可以解决我的问题。

3 个答案:

答案 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.