打开XML Excel单元格格式

问题描述 投票:0回答:1

我正试图使用Open XML以简单的格式导出到Excel。导出到Excel是工作。问题是数据的格式化。我试图有非常基本的格式化,即列名应该是粗体,其余的内容以正常的字体。这是我所做的。请让我知道我哪里做错了。

private Stylesheet GenerateStyleSheet()
{
    return new Stylesheet(
        new Fonts(
            new Font(new DocumentFormat.OpenXml.Spreadsheet.FontSize { Val = 12},
                new Bold(),
            new Font(new DocumentFormat.OpenXml.Spreadsheet.FontSize { Val = 12}))
        )
    );
}
 protected void ExportExcel(DataTable dtExport)
    {
        Response.ClearHeaders();
        Response.ClearContent();
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
        //"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" '"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" '"application/vnd.ms-excel"
        Response.AddHeader("content-disposition", "attachment; filename=Test.xlsx");
        Response.Charset = "";
        this.EnableViewState = false;
        MemoryStream ms = new MemoryStream();
        SpreadsheetDocument objSpreadsheet = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook);
        WorkbookPart objWorkbookPart = objSpreadsheet.AddWorkbookPart();
        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 = "mySheet";
        objSheets.Append(objSheet);

        WorkbookStylesPart stylesPart = objSpreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        stylesPart.Stylesheet = GenerateStyleSheet();
        stylesPart.Stylesheet.Save();
        objSheetPart.Worksheet.Save();

        objSpreadsheet.WorkbookPart.Workbook.Save();
        for (int cols = 0; cols < dtExport.Columns.Count; cols++)
        {
            Cell objCell = InsertCellInWorksheet(GetColumnName(cols), 1, objSheetPart);
            objCell.CellValue = new CellValue(dtExport.Columns[cols].ColumnName);
            objCell.DataType = new EnumValue<CellValues>(CellValues.String);
            objCell.StyleIndex = 0;
        }
        objSheetPart.Worksheet.Save();
        objSpreadsheet.WorkbookPart.Workbook.Save();
        for (uint row = 0; row < dtExport.Rows.Count; row++)
        {
            for (int cols = 0; cols < dtExport.Columns.Count; cols++)
            {
                //row + 2 as we need to start adding data from second row. First row is left for header
                Cell objCell = InsertCellInWorksheet(GetColumnName(cols), row + 2, objSheetPart);
                objCell.CellValue = new CellValue(Convert.ToString(dtExport.Rows[Convert.ToInt32(row)][cols]));
                objCell.DataType = new EnumValue<CellValues>(CellValues.String);
                objCell.StyleIndex = 1;
            }
        }
        objSheetPart.Worksheet.Save();
        objSpreadsheet.WorkbookPart.Workbook.Save();
        objSpreadsheet.Close();
        ms.WriteTo(Response.OutputStream);
        Response.Flush();
        Response.End();

    }
 // Given a column name, a row index, and a WorksheetPart, inserts a cell into the worksheet. 
    // If the cell already exists, return it. 
    private Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart)
    {
        Worksheet worksheet = worksheetPart.Worksheet;
        SheetData sheetData = worksheet.GetFirstChild<SheetData>();
        string cellReference = (columnName + rowIndex.ToString());

        // If the worksheet does not contain a row with the specified row index, insert one. 
        Row row = default(Row);

        if ((sheetData.Elements<Row>().Where(r => r.RowIndex.Value == rowIndex).Count() != 0))
        {
            row = sheetData.Elements<Row>().Where(r => r.RowIndex.Value == rowIndex).First();
        }
        else
        {
            row = new Row();
            row.RowIndex = rowIndex;
            sheetData.Append(row);
        }

        // If there is not a cell with the specified column name, insert one. 
        if ((row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex.ToString()).Count() > 0))
        {
            return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
        }
        else
        {
            // Cells must be in sequential order according to CellReference. Determine where to insert the new cell. 
            Cell refCell = null;
            foreach (Cell cell in row.Elements<Cell>())
            {
                if ((string.Compare(cell.CellReference.Value, cellReference, true) > 0))
                {
                    refCell = cell;
                    break; // TODO: might not be correct. Was : Exit For
                }
            }
            Cell newCell = new Cell();
            newCell.CellReference = cellReference;

            row.InsertBefore(newCell, refCell);
            return newCell;
        }

    }
cell spreadsheet openxml export-to-excel
1个回答
1
投票

似乎你在第一次创建字体后缺少一个")"。所以,你最终oppa只有一个字体索引(默认的一个)下面是我使用的代码,正是你所要求的.你可能会删除填充和边框,并从cellformat中删除它们,但我在写这个的时候遇到了一些语法问题,所以当它全部工作时,我只是留下它:-)

private Stylesheet GenerateStyleSheet()
{
    return new Stylesheet(
        new Fonts(
            // Index 0 - Default font.
            new Font(
                new FontSize() { Val = 11 },
                new Color() { Rgb = new HexBinaryValue() { Value = "000000" } }
                ),
            new Font(
                new Bold(),
                new FontSize() { Val = 11 },
                new Color() { Rgb = new HexBinaryValue() { Value = "000000" } }
                )
        ),
        new Fills(
            // Index 0 - Default fill.
            new Fill(
                new PatternFill() { PatternType = PatternValues.None })
        ),
        new Borders(
            // Index 0 - Default border.
            new Border(
                new LeftBorder(),
                new RightBorder(),
                new TopBorder(),
                new BottomBorder(),
                new DiagonalBorder())
        ),
        new CellFormats(
            // Index 0 - Default cell style
            new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 },
            new CellFormat() { FontId = 1, FillId = 0, BorderId = 0, ApplyFont = true }
        )
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.