使用OpenXmlSDK,我如何select/更新范围控制的单元格中的值?

我甚至不确定是否使用了正确的术语; 我会根据需要更新问题和标题。

我正在使用OpenXmlSDK来填充预先存在的Excel 2010 .xlsm文件 – 一个启用macros的工作表。

我可以很好地访问工作表和单元格。

然而,我不知道如何访问或更新单元格中的数据,这是一个下拉控件,从另一个工作表上的范围中取值。

在工作表上标记为“H13”,并右键单击>>格式控制显示

 Input range: 'anotherWorksheet'!$N$3:$N$54 Cell link: 'anotherWorksheet'!$M$3 

每当我试图获得对这个单元格的引用,我找不到它 – 我得到一个null

我已经尝试了两种访问方法:

我甚至不确定是否使用了正确的术语; 我会根据需要更新问题和标题。

我正在使用OpenXmlSDK来填充预先存在的Excel 2010 .xlsm文件 – 一个启用macros的工作表。

我可以很好地访问工作表和单元格。

然而,我不知道如何访问或更新单元格中的数据,这是一个下拉控件,从另一个工作表上的范围中取值。

在工作表上标记为“H13”,并右键单击>>格式控制显示

 Input range: 'anotherWorksheet'!$N$3:$N$54 Cell link: 'anotherWorksheet'!$M$3 

每当我试图获得对这个单元格的引用,我找不到它 – 我得到一个null

我已经尝试了两种访问方法:

  // http://msdn.microsoft.com/en-us/library/ff921204.aspx private static Cell GetCell(Worksheet worksheet, string addressName) { return worksheet.Descendants<Cell>().Where( c => c.CellReference == addressName).FirstOrDefault(); } 

和:

  // Given a worksheet, a column name, and a row index, // gets the cell at the specified column and // http://stackoverflow.com/questions/527028/open-xml-sdk-2-0-how-to-update-a-cell-in-a-spreadsheet private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex) { Row row = GetRow(worksheet, rowIndex); if (row == null) return null; return row.Elements<Cell>().Where(c => string.Compare (c.CellReference.Value, columnName + rowIndex, true) == 0).FirstOrDefault(); } // Given a worksheet and a row index, return the row. private static Row GetRow(Worksheet worksheet, uint rowIndex) { return worksheet.GetFirstChild<SheetData>(). Elements<Row>().Where(r => r.RowIndex == rowIndex).First(); } 

两者对于目标细胞H13null ,但是提供对周围细胞的参考(即,“H12,H14,G13'

实际上, I13也是null ,但是这个单元格没有任何东西。 但是,如果我不能得到一个参考,我怎么可以填充SDK? 不是我的要点,在这里。

我将会收到与下拉菜单中的一个条目匹配的数据; 我只需要实际填充/select目标电子表格中的特定条目。

我怎样才能用OpenXmlSDK做到这一点? 我试过使用各种开源库,但似乎都不支持.xslm文件(由客户端提供的文件,不能以其他格式使用;macros必须在启动时执行等)。

虽然我使用C#,因为我的问题是关于OpenXmlSDK,我会接受使用该框架的其他语言的答案。

简答:单元格不存在,因此是null引用。

我创build了一个带有一个列表(下拉)DataValidation指向另一个工作表中单元格范围的小工作表。

使用Open XML SDK 2.0生产力工具反映文件我看到,而不是创build一个单元格并将其附加到工作表中,而是创buildDataValidation(具有与目标等同的CellReference)。

    使用X14 = DocumentFormat.OpenXml.Office2010.Excel;

     [....]

     X14.DataValidations dataValidations1 = new X14.DataValidations(){Count =(UInt32Value)1U};
     dataValidations1.AddNamespaceDeclaration(“xm”,“http://schemas.microsoft.com/office/excel/2006/main”);

     X14.DataValidation dataValidation1 = new X14.DataValidation(){Type = DataValidationValues.List,AllowBlank = true,ShowInputMessage = true,ShowErrorMessage = true};

     X14.DataValidationForumla1 dataValidationForumla11 = new X14.DataValidationForumla1();
     Excel.Formula formula1 = new Excel.Formula();
     formula1.Text =“列表!$ A $ 1:$ A $ 51”;

     dataValidationForumla11.Append(一级方程式);
     Excel.ReferenceSequence referenceSequence1 = new Excel.ReferenceSequence();
     referenceSequence1.Text =“A1”;

     dataValidation1.Append(dataValidationForumla11);
     dataValidation1.Append(referenceSequence1);

     dataValidations1.Append(dataValidation1);

除非工作表位置具有预设值,否则在运行时访问时,它实际上不会成为“单元格”。

回想起来,这是有道理的。 但在视觉上,它看起来像一个细胞,所以它并不明显….

不是一个细胞: 不需要电池

注意:如果从DataValidation中进行select并保存,则单元格现在具有一个值,因此它存在:

是一个细胞: c'est离奇,不?

这可以通过在返回空引用时创build新的单元并将其附加到目标行来解决。

现在的困难在于需要引用共享string表的validation,并且不会接受原始文本作为单元格值….

更新:我能够find与单元格关联的DataValidation,find目标工作表和范围,在该范围内find目标值,并获取与该值关联的SharedStringsTable引用。 但是,无论我插入目标单元格的值是什么,打开Excel时都被认为是不好的数据。

最后,我放弃了,回到Excel Interop,并find了一种方法来从(ugh)Interop中select一个下拉字段。