OpenXML SDK:如何识别单元格的数据types?

我正在使用OPenXML SDK与Excel一起工作。 目前,我正面临着一个问题,如何识别单元格的数据types,date时间或数字。 因为,如果单元格的types是date,我们需要再次将double值转换为datetime。

根据我从OpenXML SDK帮助文件中find的信息,我写了下面的代码来回答你的问题

public class ExcelEngine : IExcelEngine { private readonly SpreadsheetDocument _wb; private WorkbookPart _wbp; private SharedStringTablePart _sstp; // Used to cache the lookup of worksheet parts private Dictionary<string, WorksheetPart> _wsParts = new Dictionary<string, WorksheetPart>(); #region Constructors public ExcelEngine(Stream stream) { Contracts.IsNotNull(stream); _wb = SpreadsheetDocument.Open(stream, false); Initialise(); } public ExcelEngine(string fileName) { Contracts.IsNullOrWhiteSpace(fileName); _wb = SpreadsheetDocument.Open(fileName, false); Initialise(); } #endregion #region IExcelEngine /// <summary> /// Get the list of sheet names from the spreadsheet /// </summary> /// <returns></returns> public IList<string> GetSheetNames() { return _wbp.Workbook .Descendants<Sheet>() .Select(s => s.Name.Value) .ToList<String>(); } /// <summary> /// Given a sheet name and a cell reference, return the contents of the cell /// </summary> /// <param name="sheetName"></param> /// <param name="addressName"></param> /// <returns></returns> public string GetCellValue(string sheetName, string addressName) { return GetCellValueLocal(sheetName, addressName); } /// <summary> /// Given a sheet name and a cell reference, return the contents of the cell as a boolean value /// </summary> /// <param name="sheetName"></param> /// <param name="addressName"></param> /// <returns></returns> public bool GetCellBool(string sheetName, string addressName) { var value = GetCellValueLocal(sheetName, addressName); bool result; bool.TryParse(value, out result); return result; } #endregion #region Private Methods private void Initialise() { _wbp = _wb.WorkbookPart; _sstp = _wbp.GetPartsOfType<SharedStringTablePart>().First(); } private string GetCellValueLocal(string sheetName, string addressName) { string value = null; WorksheetPart wsPart = GetWorkSheetPart(sheetName); // Use its Worksheet property to get a reference to the cell // whose address matches the address you supplied. Cell cell = wsPart.Worksheet.Descendants<Cell>(). Where(c => c.CellReference == addressName).FirstOrDefault(); if (cell != null) { value = cell.InnerText; if (cell.DataType != null) switch (cell.DataType.Value) { case CellValues.SharedString: int ssid = int.Parse(cell.CellValue.Text); value = _sstp.SharedStringTable.ElementAt(ssid).InnerText; break; case CellValues.Boolean: switch (value) { case "0": value = "FALSE"; break; default: value = "TRUE"; break; } break; case CellValues.Date: break; case CellValues.String: break; } Debug.WriteLine($"Cell {cell.CellReference}: '{value}'"); } return value; } private WorksheetPart GetWorkSheetPart(string sheetName) { // Does it exist in the cache? If not, load it if (!_wsParts.ContainsKey(sheetName)) { // Find the sheet with the supplied name, and then use that // Sheet object to retrieve a reference to the first worksheet. Sheet theSheet = _wbp.Workbook.Descendants<Sheet>() .Where(s => s.Name == sheetName) .FirstOrDefault(); // If not sheet throw an exception if (theSheet == null) throw new ArgumentException($"Sheet {sheetName} not found in workbook"); // Retrieve a reference to the worksheet part. _wsParts.Add(sheetName, (WorksheetPart) (_wbp.GetPartById(theSheet.Id))); } return _wsParts[sheetName]; } #endregion public void Dispose() { _wb.Close(); _wb.Dispose(); } }