2017-04-19 128 views
0

我想在我的.xlsx文件中格式爲「1,000.00」的小數和整數。

用於產生樣式表的代碼:C#OpenXML:數字格式不適用

private Stylesheet GenerateStylesheet() 
{ 
    //styling and formatting 
    var cellFormats = new CellFormats(); 
    uint iExcelIndex = 164; 

    //number formats 
    var numericFormats = new NumberingFormats(); 
    var nformat4Decimal = new NumberingFormat 
    { 
     NumberFormatId = UInt32Value.FromUInt32(iExcelIndex++), 
     FormatCode = StringValue.FromString("#,##0.00") 
    }; 
    numericFormats.Append(nformat4Decimal);  

    //cell formats 
    var cellFormat = new CellFormat 
    { 
     NumberFormatId = nformat4Decimal.NumberFormatId, 
     FontId = 0, 
     FillId = 0, 
     BorderId = 0, 
     FormatId = 0, 
     ApplyNumberFormat = BooleanValue.FromBoolean(true) 
    }; 
    cellFormats.Append(cellFormat); 

    numericFormats.Count = UInt32Value.FromUInt32((uint)numericFormats.ChildElements.Count); 
    cellFormats.Count = UInt32Value.FromUInt32((uint)cellFormats.ChildElements.Count); 

    var stylesheet = new Stylesheet(); 
    stylesheet.Append(numericFormats); 

    return stylesheet; 
} 

用於將樣式表應用到文檔的代碼:

WorkbookStylesPart stylesPart = workbookpart.AddNewPart<WorkbookStylesPart>(); 
stylesPart.Stylesheet = GenerateStylesheet(); 
stylesPart.Stylesheet.Save(); 

這是細胞是如何產生的:

var numberCell = new Cell 
{ 
    DataType = CellValues.Number, 
    CellReference = header + index, 
    CellValue = new CellValue(text), 
    StyleIndex = 0 
}; 

通過OpenXML的生產率工具,我可以看到數字樣式在那裏,它被「應用」到單元格中。

enter image description here
enter image description here

但作爲預計在孔格開口生成的文檔值時,沒有格式化。

另外,我發現#,##0.00是ID = 4的默認Excel格式之一。但將NumberFormatId = nformat4Decimal.NumberFormatId更改爲NumberFormatId = 4沒有任何影響。

回答

1

因爲它發現,你不能只放數字格式。你必須指定字體,填充,邊界。在做了這個數字格式finnaly得到應用。 這樣結束了:

private static Stylesheet GenerateStylesheet2() 
{ 
    Stylesheet ss = new Stylesheet(); 

    Fonts fts = new Fonts(); 
    DocumentFormat.OpenXml.Spreadsheet.Font ft = new DocumentFormat.OpenXml.Spreadsheet.Font(); 
    FontName ftn = new FontName(); 
    ftn.Val = "Calibri"; 
    FontSize ftsz = new FontSize(); 
    ftsz.Val = 11; 
    ft.FontName = ftn; 
    ft.FontSize = ftsz; 
    fts.Append(ft); 
    fts.Count = (uint)fts.ChildElements.Count; 

    Fills fills = new Fills(); 
    Fill fill; 
    PatternFill patternFill; 
    fill = new Fill(); 
    patternFill = new PatternFill(); 
    patternFill.PatternType = PatternValues.None; 
    fill.PatternFill = patternFill; 
    fills.Append(fill); 
    fill = new Fill(); 
    patternFill = new PatternFill(); 
    patternFill.PatternType = PatternValues.Gray125; 
    fill.PatternFill = patternFill; 
    fills.Append(fill); 
    fills.Count = (uint)fills.ChildElements.Count; 

    Borders borders = new Borders(); 
    Border border = new Border(); 
    border.LeftBorder = new LeftBorder(); 
    border.RightBorder = new RightBorder(); 
    border.TopBorder = new TopBorder(); 
    border.BottomBorder = new BottomBorder(); 
    border.DiagonalBorder = new DiagonalBorder(); 
    borders.Append(border); 
    borders.Count = (uint)borders.ChildElements.Count; 

    CellStyleFormats csfs = new CellStyleFormats(); 
    CellFormat cf = new CellFormat(); 
    cf.NumberFormatId = 0; 
    cf.FontId = 0; 
    cf.FillId = 0; 
    cf.BorderId = 0; 
    csfs.Append(cf); 
    csfs.Count = (uint)csfs.ChildElements.Count; 

    uint iExcelIndex = 164; 
    NumberingFormats nfs = new NumberingFormats(); 
    CellFormats cfs = new CellFormats(); 

    cf = new CellFormat(); 
    cf.NumberFormatId = 0; 
    cf.FontId = 0; 
    cf.FillId = 0; 
    cf.BorderId = 0; 
    cf.FormatId = 0; 
    cfs.Append(cf); 

    NumberingFormat nf; 
    nf = new NumberingFormat(); 
    nf.NumberFormatId = iExcelIndex++; 
    nf.FormatCode = "dd/mm/yyyy hh:mm:ss"; 
    nfs.Append(nf); 
    cf = new CellFormat(); 
    cf.NumberFormatId = nf.NumberFormatId; 
    cf.FontId = 0; 
    cf.FillId = 0; 
    cf.BorderId = 0; 
    cf.FormatId = 0; 
    cf.ApplyNumberFormat = true; 
    cfs.Append(cf); 

    nf = new NumberingFormat(); 
    nf.NumberFormatId = iExcelIndex++; 
    nf.FormatCode = "#,##0.0000"; 
    nfs.Append(nf); 
    cf = new CellFormat(); 
    cf.NumberFormatId = nf.NumberFormatId; 
    cf.FontId = 0; 
    cf.FillId = 0; 
    cf.BorderId = 0; 
    cf.FormatId = 0; 
    cf.ApplyNumberFormat = true; 
    cfs.Append(cf); 

    // #,##0.00 is also Excel style index 4 
    nf = new NumberingFormat(); 
    nf.NumberFormatId = iExcelIndex++; 
    nf.FormatCode = "#,##0.00"; 
    nfs.Append(nf); 
    cf = new CellFormat(); 
    cf.NumberFormatId = nf.NumberFormatId; 
    cf.FontId = 0; 
    cf.FillId = 0; 
    cf.BorderId = 0; 
    cf.FormatId = 0; 
    cf.ApplyNumberFormat = true; 
    cfs.Append(cf); 

    // @ is also Excel style index 49 
    nf = new NumberingFormat(); 
    nf.NumberFormatId = iExcelIndex++; 
    nf.FormatCode = "@"; 
    nfs.Append(nf); 
    cf = new CellFormat(); 
    cf.NumberFormatId = nf.NumberFormatId; 
    cf.FontId = 0; 
    cf.FillId = 0; 
    cf.BorderId = 0; 
    cf.FormatId = 0; 
    cf.ApplyNumberFormat = true; 
    cfs.Append(cf); 

    nfs.Count = (uint)nfs.ChildElements.Count; 
    cfs.Count = (uint)cfs.ChildElements.Count; 

    ss.Append(nfs); 
    ss.Append(fts); 
    ss.Append(fills); 
    ss.Append(borders); 
    ss.Append(csfs); 
    ss.Append(cfs); 

    CellStyles css = new CellStyles(); 
    CellStyle cs = new CellStyle(); 
    cs.Name = "Normal"; 
    cs.FormatId = 0; 
    cs.BuiltinId = 0; 
    css.Append(cs); 
    css.Count = (uint)css.ChildElements.Count; 
    ss.Append(css); 

    DifferentialFormats dfs = new DifferentialFormats(); 
    dfs.Count = 0; 
    ss.Append(dfs); 

    TableStyles tss = new TableStyles(); 
    tss.Count = 0; 
    tss.DefaultTableStyle = "TableStyleMedium9"; 
    tss.DefaultPivotStyle = "PivotStyleLight16"; 
    ss.Append(tss); 

    return ss; 
} 

而對細胞產生:

var numberCell = new Cell 
{ 
    DataType = CellValues.Number, 
    CellReference = header + index, 
    CellValue = new CellValue(text), 
    StyleIndex = 3 
}; 

風格指數3是引用單元格樣式與數字格式"#,##0.00"