我找不到这个.
我的情况:
我的问题:
我想构建的excel文件中的某些数据以DateTime格式存在.因为我不想只使用字符串(弦乐日期时间无法正确排序)我想将包含DateTime的单元格设置为我选择的格式,就像我在excel中所做的那样.
根据我的理解,我必须使用样式表来达到这一点.我已经浏览网页一段时间了,找到一个对这个问题有简单解释的人,但似乎很难找到.
我已经在mem中有一个电子表格,可以通过SheetData添加数据.我唯一缺少的是细胞的格式化/样式化.
这是我得到了多远:
DocumentFormat.OpenXml.Packaging.SpreadsheetDocument doc = SpreadsheetDocument.Create("test.xlsx", SpreadsheetDocumentType.Workbook);
WorkbookPart wbPart = doc.AddWorkbookPart();
wbPart.Workbook = new Workbook();
SheetData data = new SheetData(
new Row(...etc));
WorksheetPart wsPart = wbPart.AddNewPart<WorksheetPart>();
wsPart.Worksheet = new Worksheet(data);
Sheets sheets = doc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
Sheet sheet = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(wsPart), SheetId = 1, Name = "TestSheet" };
sheets.Append(sheet);
wbPart.Workbook.Save();
doc.Close();
Run Code Online (Sandbox Code Playgroud)
在哪里以及如何在日期时间(例如"dd-MM-yyyy")等样式中添加简单的附加内容,以及稍后可能更高级的样式?
我希望我足够具体:)同时我会继续寻找......
谢谢 !!!
将数字格式化为日期涉及很多内容。
您需要从数字格式开始。要么确定与您想要的模式匹配的内置格式,要么创建自定义格式。内置格式位于ECMA-376,第二版,第 1 部分 - 基础知识和标记语言参考第 18.8.30 节(样式和 的参考<numFmt>。如果您需要创建自定义格式,请从 ID 164 开始并将它们添加到文件<numFmts>中的元素。styles.xml这可以在 SDK 中访问,如下所示:
doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats
Run Code Online (Sandbox Code Playgroud)
接下来,您需要有一个引用日期格式的单元格格式。您总是需要一种单元格格式,没有内置的格式。单元格样式是指由insidenumFmtId定义的数字格式。这可以在 sdk 中访问,如下所示:styles.xml<cellXfs>
doc.WorkbookPart.WorkbookStylesPart.Stylesheet.CellStyles
Run Code Online (Sandbox Code Playgroud)
单元格样式本身没有 ID。它们通过单元格样式列表中的零索引位置来引用。因此,当您创建单元格时,请将其样式索引设置为您想要的日期样式。
对于值,您可以将它们存储为ISO 8601格式,但 Excel 2010 仍使用日期序列格式来存储其日期。如果您使用基于 1900 的日期序列以外的任何内容,则需要在工作簿属性中指定它。
doc.WorkbookPart.Workbook.WorkbookProperties.DateCompatibility
Run Code Online (Sandbox Code Playgroud)
有两种日期兼容性设置用于存储日期序列值,它们可以是基数 1900 或基数 1904。Excel 2010 使用 1900,而 1904 用于向后兼容旧版 Excel for Mac。
在基于 1900 年的日期序列中,数字是自 1899 年 12 月 31 日以来的天数,但更复杂的是,您必须将 1900 年 2 月 29 日视为有效日期,即使从技术上讲 1900 年不是闰年。
下面是我编写的用于从日期序列值转换为日期时间的方法。你需要相反。
/// <summary>
/// Represents the formula used for converting date serial values stored within the workbook into DateTime instances.
/// </summary>
/// <remarks>
/// Information on date serial conversion is available here: http://www.documentinteropinitiative.com/implnotes/ISO-IEC29500-2008/001.018.017.004.001.000.000.aspx
/// </remarks>
public enum XlsxDateCompatibility
{
/// <summary>
/// Standard dates are based on December 30, 1899 and are considered "Standard 1900" dates.
/// </summary>
StandardBase1900,
/// <summary>
/// Excel for Windows backwards compatible dates are based on December 31, 1899 are are considered "Backwards compatible 1900" dates.
/// </summary>
BackwardsCompatibleBase1900,
/// <summary>
/// Excel for Macintos backwards compatible dates are based on January 1, 1904 and are considered "1904" dates.
/// </summary>
BackwardsCompatibleBase1904
}
private static readonly IDictionary<XlsxDateCompatibility, DateTime> _dateSerialBaseDates
= new Dictionary<XlsxDateCompatibility, DateTime>
{
{XlsxDateCompatibility.StandardBase1900, new DateTime(1899, 12, 30)},
{XlsxDateCompatibility.BackwardsCompatibleBase1900, new DateTime(1899, 12, 31)},
{XlsxDateCompatibility.BackwardsCompatibleBase1904, new DateTime(1904, 1, 1)}
};
public static DateTime DateSerialToDateTime(double dateSerial, XlsxDateCompatibility dateCompatibility)
{
// special case for dateCompaitility 1900, Excel thinks 1900 is a leap year
// http://support.microsoft.com/kb/214019
if (dateCompatibility == XlsxDateCompatibility.BackwardsCompatibleBase1900 && dateSerial >= 61.0)
{
dateSerial -= 1;
}
DateTime baseDate;
if (!_dateSerialBaseDates.TryGetValue(dateCompatibility, out baseDate))
{
baseDate = _dateSerialBaseDates[XlsxDateCompatibility.StandardBase1900];
}
return baseDate.AddDays(dateSerial);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10719 次 |
| 最近记录: |