gpt4 book ai didi

C# Open Xml SDK 2.0 电子表格设置单元格日期时间格式

转载 作者:太空狗 更新时间:2023-10-29 21:52:12 25 4
gpt4 key购买 nike

我找不到这个。

我的情况:

  • SDK 2.0
  • 没有模板电子表格
  • VS2010 中的 C# 4.0

我的问题:
我要构建的 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();

我可以在何处以及如何向日期时间(例如“dd-MM-yyyy”)等样式添加简单的添加项,以及稍后可能添加更高级的样式?

我希望我足够具体 :)与此同时,我会继续寻找...

谢谢!!!

最佳答案

将数字格式化为日期涉及很多内容。

您需要从数字格式开始。要么确定与您想要的模式相匹配的内置格式,要么创建自定义格式。内置格式位于 ECMA-376,第二版,第 1 部分 - 基础和标记语言引用 section 18.8.30 (样式和 <numFmt> 的引用。如果您需要创建自定义格式,请从 ID 164 开始并将它们添加到 <numFmts> 文件中的 styles.xml 元素。这在 SDK 中可通过以下方式访问:

doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats

接下来您需要一个引用日期格式的单元格格式。你总是需要一个单元格格式,没有内置的。单元格样式引用数字格式numFmtId并在 styles.xml 中定义里面<cellXfs> .这可以在 sdk 中访问:

doc.WorkbookPart.WorkbookStylesPart.Stylesheet.CellStyles

单元格样式本身没有 ID。它们由单元格样式列表中的零索引位置引用。因此,当您创建单元格时,将它们的样式索引设置为您想要的日期样式。

对于值,您可以将它们存储在ISO 8601中。格式,但 Excel 2010 仍使用日期序列格式来存储其日期。如果您使用的不是基于 1900 的日期序列,则需要在工作簿属性中指定它。

doc.WorkbookPart.Workbook.WorkbookProperties.DateCompatibility

存储日期序列值有两种日期兼容性设置,它们可以是 base 1900 或 base 1904。1900 是 Excel 2010 使用的,1904 是为了向后兼容旧的 Excel for Mac。

在基于 1900 年的日期序列中,该数字是自 1899 年 12 月 31 日以来的天数,但更复杂的是您必须将 1900 年 2 月 29 日视为有效日期,即使 1900 年在技术上不是闰年。

下面是我编写的用于将日期序列值转换为 DateTime 的方法。你需要反过来。

/// <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);
}

关于C# Open Xml SDK 2.0 电子表格设置单元格日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3308418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com