6


2

C#Open Xml SDK 2.0 Spreadsheet Settingセルの日時フォーマット

これを見つけるのに苦労しています。

私の状況:

  • SDK 2.0

  • テンプレートスプレッドシートなし

  • VS2010のC#4.0

私の問題:+作成するExcelファイル内の特定のデータは、DateTime形式で存在します。 文字列だけを使用したくないので(文字列化された日付時刻を適切に並べ替えることはできません)、Excelで行うように、DateTimeを含むセルを選択した形式に設定します。 +理解するには、スタイルシートを使用してそのポイントに到達する必要があります。 私はこの問題について簡単な説明をしている人を見つけるためにしばらくウェブをブラウジングしてきましたが、見つけるのは難しいようです。

SheetDataを使用して、データを追加する機能を備えたmemのスプレッドシートを既に持っています。 私が欠けている唯一のものは、セルの書式設定/スタイル設定です。

これは私が得た距離です:

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();
wsPart.Worksheet = new Worksheet(data);

Sheets sheets = doc.WorkbookPart.Workbook.AppendChild(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")のようなスタイルに簡単な追加を追加できますか。

私が十分に具体的であったことを願っています:)その間、私は探し続けます…​

THX !!!

2 Answer


3


数値を日付としてフォーマットするには、多くのことが関係します。

数値形式から始める必要があります。 必要なパターンに一致する組み込み形式を識別するか、カスタム形式を作成します。 組み込みのフォーマットは、ECMA-376、第2版、パート1-基礎とマークアップ言語リファレンス http://www.documentinteropinitiative.com/implnotes/iso-iec29500-2008/001.018.008.030.000.000.000.aspx [セクション18.8.30](スタイルおよび `。 カスタム形式を作成する必要がある場合は、ID 164から始めて、 `styles.xml`ファイル内の `要素に追加します。 SDKで次のようにアクセスできます。

doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats

次に、日付形式を参照するセル形式が必要です。 常にセル形式が必要で、組み込みのものはありません。 セルスタイルは、「numFmtId」による数値形式を参照し、「。」内の「styles.xml」内で定義されます。 SDKで次のようにアクセスできます。

doc.WorkbookPart.WorkbookStylesPart.Stylesheet.CellStyles

セルスタイル自体にはIDがありません。 これらは、セルスタイルリスト内のゼロインデックス位置によって参照されます。 そのため、セルを作成するときに、スタイルインデックスを日付に必要なスタイルに設定します。

値については、http://en.wikipedia.org/wiki/ISO_8601 [ISO 8601]形式で保存できますが、Excel 2010では引き続き日付のシリアル形式を使用して日付が保存されます。 1900ベースの日付シリアル以外を使用する場合は、ブックプロパティで指定する必要があります。

doc.WorkbookPart.Workbook.WorkbookProperties.DateCompatibility

日付シリアル値を保存するための日付互換性の設定は2つあり、それらはベース1900またはベース1904です。 1900はExcel 2010が使用するものであり、1904は古いExcel for Macとの後方互換性のためです。

1900年に基づいた日付の通し番号では、1899は12月31日からの日数であり、1900は技術的にはうるう年ではありませんが、1900年2月29日を有効な日付として扱う必要があります。

以下は、日付のシリアル値からDateTimeに変換するために書いたメソッドです。 あなたは逆が必要です。

///
/// Represents the formula used for converting date serial values stored within the workbook into DateTime instances.
///
///
/// Information on date serial conversion is available here: http://www.documentinteropinitiative.com/implnotes/ISO-IEC29500-2008/001.018.017.004.001.000.000.aspx
///
public enum XlsxDateCompatibility
{
    ///
    /// Standard dates are based on December 30, 1899 and are considered "Standard 1900" dates.
    ///
    StandardBase1900,

    ///
    /// Excel for Windows backwards compatible dates are based on December 31, 1899 are are considered "Backwards compatible 1900" dates.
    ///
    BackwardsCompatibleBase1900,

    ///
    /// Excel for Macintos backwards compatible dates are based on January 1, 1904 and are considered "1904" dates.
    ///
    BackwardsCompatibleBase1904
}

    private static readonly IDictionary _dateSerialBaseDates
        = new Dictionary
            {
                {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);
    }


0


他の人は、http://closedxml.codeplex.com/ [Closed XML]のようなライブラリを使用することを提案しています

このスタックオーバーフローの議論からhttps://stackoverflow.com/questions/6033376/open-xml-and-date-format-in-excel-cell[Open XML and Date Formats]