如何将CellFormat应用于Cell

时间:2015-03-03 18:06:33

标签: c# excel openxml

这是我的代码:

public MemoryStream ExportDataTableToExcel(DataTable exportData, string sheetTitle = "Exported Data", bool includeColumnHeaders = true) {
    uint excelRow = 1;

    MemoryStream ms = new MemoryStream();
    SpreadsheetDocument objSpreadsheet = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook);
    WorkbookPart objWorkbookPart = objSpreadsheet.AddWorkbookPart();

    var wsp = objSpreadsheet.WorkbookPart.WorkbookStylesPart;

    if (wsp == null) {
        //objSpreadsheet.WorkbookPart.DeletePart(wsp);
        var stylesPart = objSpreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        stylesPart.Stylesheet = new Stylesheet();
        CellFormat cf = new CellFormat {
            NumberFormatId = 14,
            FontId = 0,
            FillId = 0,
            BorderId = 0,
            FormatId = 0,
            ApplyNumberFormat = BooleanValue.FromBoolean(true)
        };
        stylesPart.Stylesheet.CellFormats = new CellFormats();
        stylesPart.Stylesheet.CellFormats.AppendChild<CellFormat>(cf);
        stylesPart.Stylesheet.CellFormats.Count = UInt32Value.FromUInt32((uint)stylesPart.Stylesheet.CellFormats.ChildElements.Count);
        ////ss.Save(stylesPart);
        stylesPart.Stylesheet.Save();
    }

    objWorkbookPart.Workbook = new Workbook();
    WorksheetPart objSheetPart = objWorkbookPart.AddNewPart<WorksheetPart>();
    objSheetPart.Worksheet = new Worksheet(new SheetData());
    Sheets objSheets = objSpreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
    Sheet objSheet = new Sheet();

    objSheet.Id = objSpreadsheet.WorkbookPart.GetIdOfPart(objSheetPart);
    objSheet.SheetId = 1;
    objSheet.Name = sheetTitle;
    objSheets.Append(objSheet);


    if (includeColumnHeaders) {
        for (int intCol = 0; intCol < exportData.Columns.Count; intCol++) {
            string excelColumn = this.ConvertIndexToColumnValue(intCol + 1);
            string headerText = Common.TextTransformations.CapitalizeWords(exportData.Columns[intCol].ColumnName.Replace("_", " "));

            Cell objCell = InsertCellInWorksheet(excelColumn, excelRow, objSheetPart);
            objCell.CellValue = new CellValue(headerText);
            objCell.DataType = new EnumValue<CellValues>(CellValues.String);
        }
        excelRow++;
    }

    //Iterate through the row and column and add it to the cell
    foreach(DataRow row in exportData.Rows) {                
        for (int intCol = 0; intCol < exportData.Columns.Count; intCol++) {
            string excelColumn = this.ConvertIndexToColumnValue(intCol + 1);

            Cell objCell = InsertCellInWorksheet(excelColumn, excelRow, objSheetPart);

            if (exportData.Columns[intCol].DataType.ToString().Trim().ToLower() == "system.datetime") {
                objCell.DataType = new EnumValue<CellValues>(CellValues.Number);
                objCell.CellValue = new CellValue(((DateTime)row[intCol]).ToOADate().ToString());
                objCell.StyleIndex = 0;
                //
                //objCell.StyleIndex = 5;
                //objCell.CellReference = "A1";
            }else{
                objCell.CellValue = new CellValue(row[intCol].ToString());
                objCell.DataType = new EnumValue<CellValues>(this.GetCellValueFromColumnType(exportData.Columns[intCol]));

            }

        }

        excelRow++;
    }

    objSheetPart.Worksheet.Save();
    objSpreadsheet.WorkbookPart.Workbook.Save();

    objSpreadsheet.Close();
    return ms;        
}

问题是,在生成xlsx之后,当我尝试打开它时,它说&#34; Microsoft Excel已停止工作&#34;。我确信我的代码的cellformat部分是错误的,但我不知道如何纠正它。

1 个答案:

答案 0 :(得分:3)

问题是您没有正确创建样式表。

要创建最简单的样式表,您需要包含Font,Fill和Border。即使您不使用它们,它们也是强制性的。在你的代码中虽然你已经使用了FontId,FillId和BorderId的索引,但你还没有实际定义它们。

        // Where are these coming from ??? 
        FontId = 0,
        FillId = 0,
        BorderId = 0,

说我提供了以下代码片段,它将创建最简单的样式表

WorkbookStylesPart stylesheet = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();

Stylesheet workbookstylesheet = new Stylesheet();


// <Fonts>
Font font0 = new Font();         // Default font : Id =0

/* An example for another font
Font font1 = new Font();         // Bold font
Bold bold = new Bold();
font1.Append(bold);
*/

Fonts fonts = new Fonts();      // <APENDING Fonts>   
fonts.Append(font0);

//fonts.Append(font1);  // <= Bold font 

// <Fills>
Fill fill0 = new Fill();        // Default fill : Id = 0


Fills fills = new Fills();      // <APENDING Fills>
fills.Append(fill0);

// <Borders>
Border border0 = new Border();     // Defualt border : Id = 0

Borders borders = new Borders();    // <APENDING Borders>
borders.Append(border0);

// <CellFormats> : Now you can simple use above defined ID's
CellFormat cellformat0 = new CellFormat() { FormatId = 0, FillId = 0, BorderId = 0 }; 


// <APENDING CellFormats>
CellFormats cellformats = new CellFormats();
cellformats.Append(cellformat0);


// Append FONTS, FILLS , BORDERS & CellFormats to stylesheet <Preserve the ORDER>
workbookstylesheet.Append(fonts);
workbookstylesheet.Append(fills);
workbookstylesheet.Append(borders);
workbookstylesheet.Append(cellformats);

stylesheet.Stylesheet = workbookstylesheet;
stylesheet.Stylesheet.Save();

是的,它有点冗长,但只有一个时间代码,你会永远使用..