使用OpenXml而不使用CellValues.Date DataType将TimeSpan写入单元格
本文关键字:DataType TimeSpan 单元格 Date CellValues OpenXml 使用 | 更新日期: 2023-09-27 18:19:45
我正在使用OpenXml在Excel中创建一个图。该图显示了两个DateTimes之间经过时间的TimeSpan。
我正在以以下方式将经过的时间写入一个单元格
new Cell {DataType = new EnumValue<CellValues>(CellValues.Date), StyleIndex = 4, CellValue = new CellValue(ElapsedTime.ToString())}
其中StyleIndex=4对应于
cellFormats.AppendChild(new CellFormat {NumberFormatId = 21, ApplyNumberFormat = true, FontId = 2, ApplyFont = true});
然而,这导致了Excel2007的一些问题,因为它不支持日期时间。
到目前为止,我找到的最好的解决方案是将其转换为DateTime的双重等效值,并将其写入单元格,但这似乎很糟糕,我宁愿保持小时/分钟的格式。
我用以下代码解决了这个问题(cellStringValue应该是14:45):
TimeSpan TsValue = new TimeSpan();
TimeSpan.TryParse(cellStringValue, out TsValue);
double ms = TsValue.TotalSeconds;
double ms1 = (ms / 86400);
myCell.CellValue = new CellValue(ms1.ToString(CultureInfo.InvariantCulture));
Excel以秒为单位保存时间,除以一天中的最大秒数。不使用数据类型或数据类型CellValues.Number-结果相同。该单元格应该有一个指向CellFormat的StyleIndex,例如20是"0";hh:mm";其中StyleIndex是CellFormats列表中的位置。我的初学者问题是,假设一个新创建的工作簿内置了所有的单元格格式。这是错误的。您需要手动添加它们。至少有一个空,一个表示日期,一个代表时间。
我设法解决了这个问题,将单元格写为数字单元格,因为数字单元格类型可以用于写入日期。虽然它似乎不支持TimeSpans,但我通过将我的TimeSpan表示为DateTime并将我的TimeSpan添加到DateTime:的MinValue来解决这个问题
new Cell {DataType = new EnumValue<CellValues>(CellValues.Number), StyleIndex = 4, CellValue = new CellValue(DateTime.MinValue.Add(platformOccupancyRow.ElapsedTime).ToOADate().ToString(CultureInfo.CurrentCulture))}