我一直在谷歌上搜索并在网站上搜索答案,但我找不到解决方案 - 各地人们大多讨论如何在文档中添加新的数字格式并应用它.
我需要的是将单元格值作为带有应用格式的字符串 - 即与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上找到这个问题的确切答案是如此困难,因为我认为这将是许多开发人员在日常工作中需要的东西.
我必须要消耗一些xlsx文件.我读过使用open xml sdk和http://www.dotnetperls.com/fromoadate 从xlsx读取日期.我的大多数列都是文本(共享字符串),但有一些数字(整数),我还有一些日期和日期时间.我正在使用OpenXML SDK 2.5.
我的问题是我不知道如何区分实际数字和日期.他们都具有DataType的null,和文本数表示是在Text小区的物业.
一些代码:
using (var xlsxStream = assembly.GetManifestResourceStream("Checklist.xlsx"))
using (var spreadsheetDocument = SpreadsheetDocument.Open(xlsxStream, false))
{
var workbookPart = spreadsheetDocument.WorkbookPart;
var sharedStringTable = workbookPart.SharedStringTablePart.SharedStringTable;
var worksheetPart = workbookPart.WorksheetParts.First();
var sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
string text;
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
if (c.CellValue != null)
{
text = c.CellValue.Text;
if (c.DataType != null)
{
if (c.DataType.Value == CellValues.SharedString)
{ …Run Code Online (Sandbox Code Playgroud)