2017-03-17 53 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 /米/ yyyy的
  • 15 - d-MMM-YY
  • 16 - d-MMM
  • 17 - MMM-YY
  • 18 - H:毫米TT
  • 19 - H:MM:SS TT
  • 20 - H:毫米
  • 21 - H:mm:ss的
  • 22 - M/d/yyyy的H:毫米
  • 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得到非常接近,但我真的需要的是米/日/年/月:毫米噸 - 有誰知道在OpenXml中設置的方法嗎?謝謝。

+0

'H:mm tt'很奇怪。你真的想用12小時說明符24小時制嗎? – Mitch

+0

我的錯誤,我想要12小時的時間,我會更新! – naspinski

回答

1

在OpenXml中沒有內置的格式來實現您的內容,但您可以輕鬆添加自己的格式。您需要的格式字符串是m/d/yyyy\ h:mm\ AM/PM

爲了應用,你需要創建一個NumberingFormats對象的格式,添加NumberingFormat它並將其分配給一個StylesheetNumberingFormats財產。下面的方法將創建一個Stylesheetm/d/yyyy\ h:mm\ AM/PM格式:

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

下面的代碼將使用上面添加的格式從頭開始創建新的文件2周的日期(在A1和B1):

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

原始提問(基於24小時的AM/PM說明符)

不幸的是我不認爲這是可能的。

您可以自定義格式規範規定的部分18.8.31 numFmts

如果格式包含AM或PM,則小時值基於12小時制,其中「AM」或「 A「表示從午夜到中午的時間,」PM「或」P「表示從中午到午夜的時間。否則,小時基於24小時制。

因此,將24小時格式與AM/PM後綴混合是不可能的。

+0

我搞砸了我的帖子,我想要12小時的時間與上午和下午,但與全日期以及。 – naspinski

+1

沒問題@naspinski,我已更新我的答案以反映更改 – petelids

+0

謝謝!神奇而徹底的答案。 – naspinski