繁体   English   中英

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

[英]C# Open Xml SDK 2.0 Spreadsheet Setting Cell DateTime Format

我找不到这个。

我的情况:

  • 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部分 - 基础和标记语言参考 部分18.8.30 (样式和<numFmt>的参考。如果您需要创建自定义格式,请从ID 164开始,将它们添加到styles.xml文件中的<numFmts>元素。可以在SDK中访问:

doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats

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

doc.WorkbookPart.WorkbookStylesPart.Stylesheet.CellStyles

单元格样式本身没有ID。 它们由单元格样式列表中的零索引位置引用。 因此,在创建单元格时,请将其样式索引设置为日期所需的样式。

对于该值,您可以将它们存储为ISO 8601格式,但Excel 2010仍使用日期序列格式来存储其日期。 如果使用除基于1900的日期序列之外的任何其他内容,则需要在工作簿属性中指定它。

doc.WorkbookPart.Workbook.WorkbookProperties.DateCompatibility

有两个日期兼容性设置用于存储日期序列值,它们可以是基准1900或基准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);
    }

其他人建议使用像Closed XML这样的库

来自此堆栈溢出讨论Open XML和Date Formats

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM