如何使用OpenXML SDK通过应用格式(格式化单元格值)获取单元格值

El *_*l G 14 .net c# openxml openxml-sdk

我一直在谷歌上搜索并在网站上搜索答案,但我找不到解决方案 - 各地人们大多讨论如何在文档中添加新的数字格式并应用它.

我需要的是将单元格值作为带有应用格式的字符串 - 即与Excel显示的字符串相同.

我已经认为没有简单的方法或内置函数可以返回单元格的现成格式化值.

所以在我看来,要获得我需要做两件事的价值:1.获取格式字符串.2.使用此字符串格式化单元格值.

但是这两个步骤都有问题.

可以轻松获取包含NumberFormatId的CellFormat实例:

CellFormat cellFormat = (CellFormat) document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(cell.StyleIndex);
Run Code Online (Sandbox Code Playgroud)

但是,如果id对应于标准预定义格式之一,如何使用此NumberFormatId获取格式字符串?(即低于160)它们不在电子表格文档中,我无法相信它们应该在应用程序中进行硬编码.

此外,一旦获得格式字符串,如何将其应用于单元格值?到目前为止我理解,代码应该检查单元格值的类型,如果是数字 - 使用格式字符串将其转换为字符串.

我发现这个页面提到了使用Microsoft.Office.Excel.Interop,但我更愿意继续使用OpenXML SDK.

总的来说,我很惊讶在Web上找到这个问题的确切答案是如此困难,因为我认为这将是许多开发人员在日常工作中需要的东西.

Gui*_*non 8

男人,这是一个艰难的...我会在这里添加我发现可能值得的东西..

首先是获取单元格的编号格式(一旦你有了CellFormat:

string format = excel.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>()
            .Where(i => i.NumberFormatId.ToString() == cellFormat.NumberFormatId.ToString())
            .First().FormatCode;
Run Code Online (Sandbox Code Playgroud)

有关此内容的更多信息,请访问:NumberingFormats

我试图找出如何将这种格式应用于cell.CellValue财产...我认为这就是你必须去的方式!

好的,阅读ClosedXml代码(它的开源代码)似乎很容易获得格式.

只需将值文本转换为其类型(int,double等),并调用ToString方法传递格式.我正在尝试使用String.Format并且没有工作.我已经测试了ToString并且它可以工作,但仍然缺少一些东西.

我建议你看看这个类,并从他的评论中得到@El G告诉GetFormattedString()方法的代码.

Bassicaly你必须添加这样的东西:

double d = double.Parse(cell.CellValue.InnerText);
string val = d.ToString(format);
Run Code Online (Sandbox Code Playgroud)

希望它能帮到你......

  • 另外,如果在您的解决方案中您不必仅限于OpenXML SDK,则可以使用[ClosedXML](http://closedxml.codeplex.com/)库,其中所有操作似乎都更容易而不是纯OpenXML(它建立在OpenXML之上).在[单元格值示例](http://closedxml.codeplex.com/wikipage?title=Cell%20Values&referringTitle=Documentation)中的ClosedXML文档中,有以下行:'String booleanFormattedString = cellBoolean.GetFormattedString();' 显然它正是我们正在寻找的.另外深入研究这种方法的代码可能有助于理解. (4认同)