C# 使用OpenXML将验证器放入现有已格式化工作表的单元格中

C# 使用OpenXML将验证器放入现有已格式化工作表的单元格中,c#,openxml,openxml-sdk,C#,Openxml,Openxml Sdk,如何将验证器下拉对象放入已由OpenXML进程打开的格式化工作表的单元格中 我确实有一个例程,必须在添加验证器之前首先打开一个文档并创建一个新的工作表,但到目前为止,我无法将它集成到一个已经打开的工作表中。在这里: public static void ForValidator() { using (SpreadsheetDocument myDoc = SpreadsheetDocument.Create("validator output.xlsx", SpreadsheetDocument

如何将验证器下拉对象放入已由OpenXML进程打开的格式化工作表的单元格中

我确实有一个例程,必须在添加验证器之前首先打开一个文档并创建一个新的工作表,但到目前为止,我无法将它集成到一个已经打开的工作表中。在这里:

public static void ForValidator() {
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Create("validator output.xlsx", SpreadsheetDocumentType.Workbook)) {
 WorkbookPart workbookpart = myDoc.AddWorkbookPart();
 workbookpart.Workbook = new Workbook();
 WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
 SheetData sheetData_ = new SheetData();
 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"
 });

 DataValidations dataValidations = new DataValidations();
 DataValidation dataValidation = new DataValidation() {
  Type = DataValidationValues.List,
  AllowBlank = true,
  SequenceOfReferences = new ListValue<StringValue>() { InnerText = "F11" }
 };
 Formula1 formula = new Formula1();
 formula.Text = "\"Selection 1,Selection 2,Selection 3\"";

 dataValidation.Append(formula);
 dataValidations.Append(dataValidation);

 worksheetPart.Worksheet.AppendChild(dataValidations);
}
publicstaticvoidforvalidator(){
使用(SpreadsheetDocument myDoc=SpreadsheetDocument.Create(“validator output.xlsx”,SpreadsheetDocumentType.工作簿)){
WorkbookPart WorkbookPart=myDoc.AddWorkbookPart();
workbookpart.工作簿=新工作簿();
WorksheetPart WorksheetPart=workbookpart.AddNewPart();
SheetData SheetData_u2;=新的SheetData();
工作表部分工作表=新工作表(sheetData_u2;);
Sheets Sheets_uz=myDoc.WorkbookPart.Workbook.AppendChild(新工作表());
sheets_uu.AppendChild(新工作表(){
Id=myDoc.WorkbookPart.GetIdOfPart(myDoc.WorkbookPart.WorksheetParts.First()),
SheetId=1,
Name=“Sheet1”
});
DataValidations DataValidations=新的DataValidations();
DataValidation DataValidation=新的DataValidation(){
类型=DataValidationValues.List,
AllowBlank=true,
SequenceOfReferences=new ListValue(){InnerText=“F11”}
};
公式1公式=新公式1();
formula.Text=“\”选择1、选择2、选择3\”;
dataValidation.Append(公式);
dataValidations.Append(dataValidation);
worksheetPart.Worksheet.AppendChild(数据验证);
}
我更希望它能像下面这样工作,一个在已经打开的文档上运行的颜色填充程序,甚至不需要活动工作表的名称:

static Row getRow(uint rowIndex, WorksheetPart worksheetPart) {
 Worksheet worksheet = worksheetPart.Worksheet;
 SheetData sheetData = worksheet.GetFirstChild<SheetData>();
 Row row;
 if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) {
 row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
 }
 else {
  row = new Row() { RowIndex = rowIndex };
  sheetData.Append(row);
 }
 return row;
}

static void AddbackgroundFormat(SpreadsheetDocument document, Cell c, string colorCode) {
 Fills fs = AddFill(document.WorkbookPart.WorkbookStylesPart.Stylesheet.Fills, colorCode);
 AddCellFormat(document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats, document.WorkbookPart.WorkbookStylesPart.Stylesheet.Fills);
 c.StyleIndex = (UInt32)(document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Elements<CellFormat>().Count() - 1);
}

static Fills AddFill(Fills fills1, string colorCode) {
 Fill fill1 = new Fill();

 PatternFill patternFill1 = new PatternFill() { PatternType = PatternValues.Solid };
 ForegroundColor foregroundColor1 = new ForegroundColor() { Rgb = colorCode };

 patternFill1.Append(foregroundColor1);

 fill1.Append(patternFill1);
 fills1.Append(fill1);
 return fills1;
}

static void AddCellFormat(CellFormats cf, Fills fs) {
 CellFormat cellFormat2 = new CellFormat() { NumberFormatId = 0, FontId = 0, FillId = (UInt32)(fs.Elements<Fill>().Count() - 1), BorderId = 0, FormatId = 0, ApplyFill = true };
 cf.Append(cellFormat2);
}

Row row1 = getRow(11, worksheetPart);
foreach (Cell c2 in row1.Elements<Cell>()) {
 if (c2.CellReference.Value == "F11") {
  AddbackgroundFormat(document, c2, "ff0000");
 }
}
静态行getRow(uint行索引,工作表部分工作表部分){
工作表=工作表零件工作表;
SheetData SheetData=工作表.GetFirstChild();
行行;
if(sheetData.Elements().Where(r=>r.RowIndex==RowIndex).Count()!=0){
row=sheetData.Elements()。其中(r=>r.RowIndex==RowIndex)。First();
}
否则{
行=新行(){RowIndex=RowIndex};
sheetData.Append(行);
}
返回行;
}
静态void AddbackgroundFormat(电子表格文档、单元格c、字符串颜色代码){
Fills fs=AddFill(document.WorkbookPart.WorkbookStylesPart.Stylesheet.Fills,颜色代码);
AddCellFormat(document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats,document.WorkbookPart.WorkbookStylesPart.Stylesheet.Fills);
c、 StyleIndex=(UInt32)(document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Elements().Count()-1);
}
静态填充AddFill(填充填充1,字符串颜色代码){
填充1=新填充();
PatternFill patternFill1=新的PatternFill(){PatternType=PatternValues.Solid};
ForegroundColor ForegroundColor 1=新的ForegroundColor(){Rgb=colorCode};
patternFill1.Append(foregroundColor1);
fill1.追加(patternFill1);
fills1.追加(fill1);
返回填充1;
}
静态无效AddCellFormat(CellFormats cf,填充fs){
CellFormat cellFormat2=new CellFormat(){NumberFormatId=0,FontId=0,FillId=(UInt32)(fs.Elements().Count()-1),BorderId=0,FormatId=0,ApplyFill=true};
cf.Append(cellFormat2);
}
行row1=getRow(11,工作表部分);
foreach(第1行中的单元格c2.Elements()){
如果(c2.CellReference.Value==“F11”){
AddbackgroundFormat(文件,c2,“ff0000”);
}
}
谢谢你的帮助

更新: 我的最新尝试无效。它不会崩溃,但也不会创建验证程序:

    DataValidations dataValidations1 = new DataValidations(){ Count = (UInt32Value)1U };
    DataValidation dataValidation1 = new DataValidation(){ Type = DataValidationValues.List, AllowBlank = true, ShowInputMessage = true, ShowErrorMessage = true, SequenceOfReferences = new ListValue<StringValue>() { InnerText = "F11" } };
    Formula1 formula11 = new Formula1();
    formula11.Text = "\"item 1,item 2,item 3\"";
    dataValidation1.Append(formula11);
    dataValidations1.Append(dataValidation1);
    document.WorkbookPart.WorkbookStylesPart.Stylesheet.Append(dataValidations1);
DataValidations dataValidations1=newdatavalidations(){Count=(UInt32Value)1U};
DataValidation dataValidation1=new DataValidation(){Type=DataValidationValues.List,AllowBlank=true,ShowInputMessage=true,淋浴RorMessage=true,SequenceOfReferences=new ListValue(){InnerText=“F11”};
公式1公式11=新公式1();
公式11.Text=“\”项目1、项目2、项目3\”;
数据验证1.追加(公式11);
dataValidations1.Append(dataValidation1);
document.WorkbookPart.WorkbookStylesPart.Stylesheet.Append(dataValidations1);

您是否尝试过创建两个几乎相同的电子表格,一个有验证器,一个没有验证器,然后使用OpenXML生产力工具(OOXML程序所能拥有的最好礼物)对它们进行比较?首先,我听说过它。(几个月前安装2.5库时,我可能忽略了它。)既然你推荐了它,我正在阅读有关它的精彩文章,我会按照你的建议去做。谢谢。