这就是我在做的事情:
CellFormat cellFormat =
new CellFormat()
{ NumberFormatId = (UInt32Value)14U,
FontId = (UInt32Value)0U,
FillId = (UInt32Value)0U,
BorderId = (UInt32Value)0U,
FormatId = (UInt32Value)0U,
ApplyNumberFormat = true };
sd.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.AppendChild<CellFormat>(cellFormat);
_dateStyleIndex = sd.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.Count() - 1;
然后在我的代码中的某个地方
else if (type == DataTypes.DateTime)
{
DateTime dateTime = DateTime.Parse(text);
double oaValue = dateTime.ToOADate();
cell.CellValue = new CellValue(oaValue.ToString(CultureInfo.InvariantCulture));
cell.DataType = new EnumValue<CellValues>(CellValues.Date);
cell.StyleIndex = Convert.ToUInt32(_dateStyleIndex);
}
但是,当我使用Open XML SDK Tool验证生成的excel文件时,出现以下验证错误:属性&#39; t&#39;有无效价值&#39; d&#39;。枚举约束失败。
我在这里缺少什么?感谢您的帮助。
PS:添加,这就是x:sheetData的样子。它给了我验证错误:
<x:sheetData xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:row r="2">
<x:c r="B2" t="s">
<x:v>0</x:v>
</x:c>
<x:c r="C2" t="s">
<x:v>1</x:v>
</x:c>
<x:c r="D2" t="s">
<x:v>2</x:v>
</x:c>
</x:row>
<x:row r="3">
<x:c r="B3" t="s">
<x:v>3</x:v>
</x:c>
<x:c r="C3" t="s">
<x:v>6</x:v>
</x:c>
<x:c r="D3" s="1" t="d">
<x:v>42634.906087963</x:v>
</x:c>
</x:row>
<x:row r="4">
<x:c r="B4" t="s">
<x:v>4</x:v>
</x:c>
<x:c r="C4" t="s">
<x:v>7</x:v>
</x:c>
<x:c r="D4" s="1" t="d">
<x:v>42634.9062037037</x:v>
</x:c>
</x:row>
<x:row r="5">
<x:c r="B5" t="s">
<x:v>5</x:v>
</x:c>
<x:c r="C5" t="s">
<x:v>8</x:v>
</x:c>
<x:c r="D5" s="1" t="d">
<x:v>42634.9062847222</x:v>
</x:c>
</x:row>
</x:sheetData>
答案 0 :(得分:8)
为了获得最广泛的兼容性,请使用CellValues.Number
作为单元格数据类型。
根据docs,CellValues.Date适用于Excel 2010,因此您可能希望避免它与Excel 2007(以及可能的其他应用程序)完全向后兼容。
//broadly supported - earliest Excel numeric date 01/01/1900
DateTime dateTime = DateTime.Parse(text);
double oaValue = dateTime.ToOADate();
cell.CellValue = new CellValue(oaValue.ToString(CultureInfo.InvariantCulture));
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.StyleIndex = Convert.ToUInt32(_numericDateCellFormatIndex);
//supported in excel 2010 - not XLSX Transitional compliant
DateTime dateTime = DateTime.Parse(text);
cell.CellValue = new CellValue(dateTime.ToString("s"));
cell.DataType = new EnumValue<CellValues>(CellValues.Date);
cell.StyleIndex = Convert.ToUInt32(_sortableDateCellFormatIndex);
此earlier more complete answer表示Excel 2010默认情况下不使用'sortable'CellValues.Date
数据类型。
推测CellValues.Date
类型的原因是为了克服数字日期的限制,例如最早的Excel数字日期是01/01/1900。
digitalpreservation.gov explains some of the historical intention behind the date cell type,此页面解释了XLSX Transitional is the version used by mainstream real world applications(2014年测试过)。
XLSX Strict具有日期单元格的值类型,使用Complete, ISO 8601中的扩展格式日历表示。出于...的原因 向后兼容性,ISO 8601日期的这种类型使用不是 允许在XLSX Transitional中使用。
ISO标准化的后期 在OOXML的过程中,提出了采用ISO 8601格式的提议 用于电子表格中的日期和时间。
出席会议的专家 ISO 29500投票决议会议,投票通过 OOXML格式的优秀提案主要是专家 XML和文本文档而不是电子表格
由于 ISO 29500的Transitional变体的目的是 与.xlsx文件的现有语料库兼容 旨在处理它们的应用程序,对第4部分的修订 禁止在过渡变体中引入ISO 8601日期。 其次,ISO 8601是一种非常灵活的格式,并且可以在上下文中使用 旨在实现互操作性的需要具体针对哪些内容 特定的文本字符串模式预计日期和时间。
... 2014年11月的测试显示Google表格和自由办公室 两者都在Transitional变体中创建了新文档