2012-01-19 154 views
13

我一直在网站上搜索并搜索答案,但找不到解决方案 - 所有人都主要讨论如何添加新的数字格式添加到文档并应用。如何使用OpenXML SDK应用格式化(格式化的单元格值)来获取单元格值

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

我已经想到,没有简单的方法或内置函数会返回单元格的现成格式化值。

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

但我在这两个步骤都有问题。

人们可以很容易得到CellFormat实例,其中将包括NumberFormatId:

CellFormat cellFormat = (CellFormat) document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(cell.StyleIndex); 

但如何与这个NumberFormatId获得格式字符串,如果ID对应的标准定义的格式吗? (即低于160)他们不在电子表格文档中,我不相信他们应该在应用程序中进行硬编码。

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

我发现this page其中提到使用Microsoft.Office.Excel.Interop,但我宁愿留在OpenXML SDK只。

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

+0

这里找到一些不错的代码:http://joymonscode.blogspot.se/2013/10/reading-excel-cell-with-number.html –

回答

8

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

首先是让电池的编号格式(一旦你有CellFormat:

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

有关这一点,你可以去了解更多信息:NumberingFormats

进出口试图找出如何这种格式适用于cell.CellValue财产......我想这就是你要走的路

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

只需将值文本转换为其类型(int,double等)并调用传递格式的ToString方法。我正在尝试用String.Format来做,并没有奏效。我测试了ToString,它可以工作,但还是有一些东西丢失了。

我建议你看看这个类,并从GetFormattedString()方法获取代码,就像@El G在他的评论中告诉的那样。

Bassicaly你必须添加这样的事情:

double d = double.Parse(cell.CellValue.InnerText); 
string val = d.ToString(format); 

希望它可以帮助你......

+0

非常感谢分享这些信息,圭多!请让我知道,如果你会找到一种方法来应用格式。 –

+4

另一方面,如果在你的解决方案中,你不必仅限于OpenXML SDK,你可以使用[ClosedXML](http://closedxml.codeplex.com/)库,其中所有的操作似乎很多比纯OpenXML更容易(并且它建立在OpenXML之上)。 在[单元格值示例](http://closedxml.codeplex.com/wikipage?title=Cell%20Values&referringTitle=Documentation)中的ClosedXML文档中,有以下行: 'String booleanFormattedString = cellBoolean.GetFormattedString();' 显然它做我们正在寻找。另外挖掘这种方法的代码可能有助于理解。 –

+0

我添加了一些有用的信息!认为你的问题将在这一点上得到解决! –

0

如果你想利用细胞值与应用的格式一样,同样在Excel中显示,使用.Cell对象的Text属性。就像这样:

String formattedValue = cell.Text 
+0

单元格中似乎没有Text属性类,仅在CellValue下(这不是Excel中显示的内容) –

相关问题