2017-03-17 6 views
1

リストhereを見ると、あなたが見ることができます:"m/d/yyyy h:mm tt" [AM/PM]のOpenXml(C#)の日付/時刻形式はありますか?

  • 0 - 一般
  • 1から0
  • 2から0.00
  • 3 - #、## 0
  • 4 - #は、 ## 0.00
  • 9から0パーセント
  • 10から0.00パーセント
  • 11 - 0.00E + 00
  • 12 - #?/?
  • 13 - #??/??
  • 14 - D/M/YYYY
  • 15 - D-MMM-YY
  • 16 - D-MMM
  • 17 - MMM-YY
  • 18 - 時間:ミリメートルTT
  • 19 - H:MM:SS TT
  • 20 - H:MM
  • 21 - H:MM:SS
  • 22 - M/D/YYYYのH:MM
  • 37 - #、## 0;(# 、## 0)
  • 38 - #、## 0;赤
  • 39 - #、## 0.00;(#、## 0.00)
  • 40 - #、## 0.00;赤
  • 45 - MM:SS
  • 46 - [H]:mm:ssの
  • 47 - mmss.0
  • 48 - ## 0.0E + 0
  • 49 - @

あなたは見ることができます最もケースはカバーされているようですが、22は非常に近くになりますが、本当に必要なのはm/d/yyyy h:mm ttです。OpenXmlで設定する方法は誰にも分かりますか?ありがとうございました。

+0

'H:mm ttは非常に奇妙です。あなたは実際に12時間指定子で24時間の時間を望んでいますか? – Mitch

+0

私の間違い、私は12時間を欲しい、私は更新されます! – naspinski

答えて

1

OpenXmlの中で成し遂げたことを達成するための組み込みのフォーマットはありませんが、独自のフォーマットを簡単に追加できます。必要な書式文字列はm/d/yyyy\ h:mm\ AM/PMです。

あなたがNumberingFormatsオブジェクトを作成する必要があるフォーマットを適用するためには、それにNumberingFormatを追加し、StylesheetNumberingFormatsプロパティに割り当てます。以下の方法はm/d/yyyy\ h:mm\ AM/PM形式でStylesheetを作成します。

private static Stylesheet CreateStyles() 
{ 
    Stylesheet styleSheet = new Stylesheet(); 

    NumberingFormats nfs = new NumberingFormats(); 

    NumberingFormat nf; 
    nf = new NumberingFormat(); 
    nf.NumberFormatId = 165; 
    nf.FormatCode = "m/d/yyyy\\ h:mm\\ AM/PM"; 
    nfs.Append(nf); 

    CellFormat cf = new CellFormat(); 
    cf.NumberFormatId = nf.NumberFormatId; 
    cf.ApplyNumberFormat = true; 

    CellFormats cfs = new CellFormats(); 
    cfs.Append(cf); 
    styleSheet.CellFormats = cfs; 
    styleSheet.NumberingFormats = nfs; 
    styleSheet.Borders = new Borders(); 
    styleSheet.Borders.Append(new Border()); 
    styleSheet.Fills = new Fills(); 
    styleSheet.Fills.Append(new Fill()); 
    styleSheet.Fonts = new Fonts(); 
    styleSheet.Fonts.Append(new Font()); 

    CellStyles css = new CellStyles(); 
    CellStyle cs = new CellStyle(); 
    cs.FormatId = 0; 
    cs.BuiltinId = 0; 
    css.Append(cs); 
    css.Count = UInt32Value.FromUInt32((uint)css.ChildElements.Count); 
    styleSheet.Append(css); 
    return styleSheet; 
} 

上に追加のフォーマットを使用して(A1及びB1で)2つの日付とスクラッチから新しいファイルを作成する次のコード

public static void CreateFile(string filename) 
{ 
    using (SpreadsheetDocument spreadsheetDocument = 
     SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook)) 
    { 
     // Add a WorkbookPart to the document. 
     WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); 
     workbookpart.Workbook = new Workbook(); 
     workbookpart.AddNewPart<WorkbookStylesPart>(); 

     // Add a WorksheetPart to the WorkbookPart. 
     WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); 
     worksheetPart.Worksheet = new Worksheet(new SheetData()); 

     // Add Sheets to the Workbook. 
     Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 

     // Append a new worksheet and associate it with the workbook. 
     Sheet sheet = new Sheet() 
     { 
      Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), 
      SheetId = 1, 
      Name = "Sheet 1" 
     }; 
     sheets.Append(sheet); 
     Worksheet worksheet = new Worksheet(); 
     SheetData sheetData = new SheetData(); 

     Stylesheet styleSheet = CreateStyles(); 
     Row row = CreateRow(); 

     sheetData.Append(row); 
     worksheet.Append(sheetData); 
     worksheetPart.Worksheet = worksheet; 
     workbookpart.WorkbookStylesPart.Stylesheet = styleSheet; 

     // Close the document. 
     spreadsheetDocument.Close(); 
    } 
} 

private static Row CreateRow() 
{ 
    Row row = new Row(); 

    DateTime now = DateTime.UtcNow; 
    //add a date cell using the number data type 
    Cell cell = new Cell(); 
    cell.StyleIndex = 0; 
    cell.DataType = CellValues.Number; 
    string columnValue = now.ToOADate().ToString(); 
    cell.CellValue = new CellValue(columnValue); 
    row.Append(cell); 

    //add a date cell using the date data type 
    Cell cell2 = new Cell(); 
    cell2.StyleIndex = 0; 
    cell2.DataType = CellValues.Date; 
    columnValue = now.ToString("o"); 
    cell2.CellValue = new CellValue(columnValue); 
    row.Append(cell2); 
    return row; 
} 

元の回答(AM/PM指定子で24時間を基準にして)

残念ながら私はこれが可能ではないと思います。

あなたは定義することができ、カスタムフォーマット仕様状態のしかしセクション18.8.31 numFmts:フォーマットは、AMまたはPMが含まれてい

場合は、時間は12時間制、「AM」または「に基づいています「A」は真夜中から正午までの時間を示し、「PM」または「P」は正午から真夜中までの時間を示す。それ以外の場合、時間は24時間制に基づいています。

したがって、AM/PM接尾辞と24時間形式を混在させることはできません。

+0

私は私のポストで台無しになった、私は午前と午後12時間の時間が欲しいが、完全な日付でも。 – naspinski

+1

問題はありません@naspinski、私は変更を反映するために私の答えを更新しました – petelids

+0

ありがとう!ファンタスティックで徹底的な答え。 – naspinski

関連する問題