我正在使用以下代码作为更大项目的一部分 - 该程序基本上是根据从下拉框中选择的工作表读取电子表格 - 然后将结果分配给数据表 - 我有一个for循环运行以下函数以获取Cell内容并将其添加到数据表
public string GetValue(Cell cell, SharedStringTablePart stringTablePart)
{
if (cell.ChildElements.Count == 0) return null;
//get cell value
string value = cell.ElementAt(0).InnerText;//CellValue.InnerText;
//Look up real value from shared string table
if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
return value;
}
在我使用的电子表格中,这会返回公式而不是结果。电子表格公式是= Sheet1!A12,基本上,无论用户输入Sheet1 A12的是什么,都应该在单元格中显示。现在,电子表格已经填写了信息,但程序不会仅仅根据公式提取结果。
这方面的一个例子是:表1 A12包含单词" Dog"这意味着在Sheet2中,单元格A4具有公式= Sheet1A12并且应该显示" Dog" (它在excel中执行但在程序中没有。)
OpenXML是否能够显示已经存在的结果?
答案 0 :(得分:1)
我不完全同意给出的两个答案。 我做了一个快速测试,为一个新工作簿的sheet1添加了一些值和总和公式,保存为xmlx,解压缩并查看/xl/worksheets/sheet1.xml。
<row r="14" spans="1:1" x14ac:dyDescent="0.25">
<c r="A14">
<f>SUM(A1:A13)</f>
<v>1295</v>
</c>
</row>
如您所见,公式及其计算值均可见。然后我做了一个精确的搜索,发现了这个:OpenXML SDK: Make Excel recalculate formula
简而言之:绝对可以访问公式值,甚至可以根据需要重新计算。
答案 1 :(得分:0)
OpenXml只是保存SpreadSheet内容的格式。要获得单元格的结果,您需要SpreadSheet引擎(即excel)
答案 2 :(得分:0)
抱歉,但没有。 OpenXML SDK只是一组用于在低级别操作Word,Excel和PowerPoint文件的类。公式以纯文本形式存储,您需要为此实现公式求值程序。如果您想参与此项活动,请参阅Interpreter design pattern。
还使用SDK提供的属性来访问单元格数据(CellValue,CellFormula)。另请注意,Excel并不总是填充DataType(仅当它无法正确推断为更精确时,例如:共享字符串,而不是将值读取为数字,它填充数据类型以告诉该数字实际上是一个索引在共享字符串表中,如代码片段所示。)
我没有使用ClosedXML,但我听说值得一试。