如何获取openxml.spreadsheet.cell屏幕显示值

时间:2016-01-21 08:08:29

标签: c# excel-formula openxml openxml-sdk

我有一个C#应用程序,用于读取在Excel 2013中创建的上载的Excel文件(.xslx)

我读了每个单元格,使用C#openxml库将每个单元格放入每个行集合的单元格集合中。

代码正常工作,但它没有正确读取格式化的excel单元格值。

以下是单元格在excel中的显示方式:

enter image description here

和冷冻: enter image description here

当C#应用程序读取它时,我检查了该单元格的DocumentFormat.OpenXml.Spreadsheet.Cell cell属性,但没有一个单元格属性等于我想要的May-15的值。

我注意到cell.DataType和cell.CellFormula都是null,因此它们不能用于确定格式。

cell.InnerText值为“42125”。如果我将Excel中的单元格格式更改为常规,则显示为42125。

我使用的是this文章

中的代码

以下是我正在使用的代码段

for (var i = 0; i < rows.Count; i++)
{
    var dataRow = new List<string>();
    data.DataRows.Add(dataRow);
    var row = rows[i];
    var cellEnumerator = GetExcelCellEnumerator(row);
    while (cellEnumerator.MoveNext())
    {
        var cell = cellEnumerator.Current; //return the current DocumentFormat.OpenXml.Spreadsheet.Cell
        var text = ReadExcelCell(cell, workbookPart).Trim();
        dataRow.Add(text);
    }
}

private string ReadExcelCell(Cell cell, WorkbookPart workbookPart)
{
    var cellValue = cell.CellValue;
    var text = (cellValue == null) ? cell.InnerText : cellValue.Text;
    if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
    {
        text = workbookPart.SharedStringTablePart.SharedStringTable
            .Elements<SharedStringItem>().ElementAt(
                Convert.ToInt32(cell.CellValue.Text)).InnerText;
    }

    return (text ?? string.Empty).Trim();
}

问题:

  1. 如何阅读5月15日的cell.InnerText的显示值?

  2. 如果格式为mmm-y,是否可以使用标准C#字符串/日期格式将“May-15”转换为“42125”或“42125”为“May-15”?

1 个答案:

答案 0 :(得分:1)

第二个问题的答案:

如何将42125转换为May-15

var myval = String.Format("{0:MMM-yy}", DateTime.FromOADate(42125));

将5月15日转换为42125

var myval =  DateTime.ParseExact("May-15", "MMM-yy", System.Globalization.CultureInfo.InvariantCulture).ToOADate();