使用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(); }
两者对于目标细胞H13
都null
,但是提供对周围细胞的参考(即,“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并保存,则单元格现在具有一个值,因此它存在:
是一个细胞:
这可以通过在返回空引用时创build新的单元并将其附加到目标行来解决。
现在的困难在于需要引用共享string表的validation,并且不会接受原始文本作为单元格值….
更新:我能够find与单元格关联的DataValidation,find目标工作表和范围,在该范围内find目标值,并获取与该值关联的SharedStringsTable引用。 但是,无论我插入目标单元格的值是什么,打开Excel时都被认为是不好的数据。
最后,我放弃了,回到Excel Interop,并find了一种方法来从(ugh)Interop中select一个下拉字段。