Почему я получаю сообщение об ошибке «Восстановленные записи: формат из /xl/styles.xml» в этой загрузке OpenXML Excel? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь добавить форматирование строки заголовка в свой документ электронной таблицы OpenXML, и я получаю вышеупомянутую ошибку.Я почти уверен, что это как-то связано с тем, как я добавляю стиль, но я не могу понять, что я делаю неправильно.

Документ открывался правильно, прежде чем я попытался добавить стилизацию.

Любая помощь очень ценится.

    private void AddStyles()
    {
        stylesPart = doc.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        stylesPart.Stylesheet = new Stylesheet();
        stylesPart.Stylesheet.Fonts = new Fonts();
        stylesPart.Stylesheet.Fills = new Fills();
        stylesPart.Stylesheet.Borders = new Borders();
        stylesPart.Stylesheet.CellFormats = new CellFormats();

        stylesPart.Stylesheet.Fonts.Append(new Font()); // normal
        stylesPart.Stylesheet.Fonts.Append(new Font(new Bold())); // header

        stylesPart.Stylesheet.Fills.Append(new Fill()); //default fill
        stylesPart.Stylesheet.Borders.Append(new Borders()); // default border

        stylesPart.Stylesheet.CellFormats.Append(new CellFormat() { FormatId = 0, FillId = 0, BorderId = 0, FontId = 0 });
        stylesPart.Stylesheet.CellFormats.Append(new CellFormat() { FormatId = 1, FillId = 0, BorderId = 0, FontId = 1 });
    }

Когда я открываю его, он предлагает восстановить его, иэто так правильно.Однако, если я открою его в блокноте, я получу некоторые сумасшедшие вещи.

PK    ÄCSM5øiº   %    xl/workbook.xml ¢ (                      Á‚0†_eé]‡F   !€/^õ   æè`­dÊã;1‘«·¯›æû«ÓìFñÄÀ–|

Ниже приведен остальной код для справки:

    public OpenXMLExcelDoc(string sheetName = "Sheet 1")
    {
        ms = new MemoryStream();
        doc = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook);

        workBookPart = doc.AddWorkbookPart();
        workBookPart.Workbook = new Workbook();

        workSheetPart = workBookPart.AddNewPart<WorksheetPart>();
        workSheetPart.Worksheet = new Worksheet();

        sheets = workBookPart.Workbook.AppendChild(new Sheets());
        sheet = new Sheet() { Id = workBookPart.GetIdOfPart(workSheetPart), SheetId = 1, Name = sheetName };
        sheetData = workSheetPart.Worksheet.AppendChild(new SheetData());
        sheets.Append(sheet);

        AddStyles();

        doc.Save();
    }

    public void StartRow()
    {
        row = new Row();
    }
    public void FinishRow()
    {
        sheetData.AppendChild(row);
    }

    public void AddCellData(string data, CellValues dataType, FontStyles style = FontStyles.Normal)
    {
        var newCell = new Cell()
        {
            CellValue = new CellValue(data),
            DataType = new EnumValue<CellValues>(dataType),
            StyleIndex = Convert.ToUInt32((int)style)
        };

        row.Append(newCell);
    }

    public void AddDataGrid(DataGrid dg)
    {
        StartRow();
        for (var i = 0; i < dg.Columns.Count; i++)
        {
            AddCellData(dg.Columns[i].HeaderText, CellValues.String, FontStyles.Header);
        }
        FinishRow();

        for (var i = 0; i < dg.Items.Count; i++)
        {
            var gridRow = dg.Items[i];

            StartRow();
            for(var j = 0; j < gridRow.Cells.Count; j++)
            {
                var gridCell = gridRow.Cells[j];
                AddCellData(gridCell.Text, CellValues.String);
            }

            FinishRow();
        }
    }


    public void Finish(string title, HttpResponse Response)
    {            
        doc.Close();

        Response.AddHeader("content-disposition", "attachment;filename=" + title + ".xlsx");

        ms.Position = 0;
        ms.CopyTo(Response.OutputStream);

        Response.End();            
    }

1 Ответ

0 голосов
/ 19 октября 2018

Ну, я до сих пор не понимаю, "почему" мой код не работает, но код, основанный на , этот пост делает.

    private void AddStyles()
    {
        stylesPart = workBookPart.AddNewPart<WorkbookStylesPart>();

        Fonts fonts = new Fonts(
            new Font(),
            new Font(new Bold())
            );

        Fills fills = new Fills(new Fill());
        Borders borders = new Borders(new Border());

        CellFormats cellFormats = new CellFormats(
                new CellFormat(), // default
                new CellFormat { FontId = 0, FillId = 0, BorderId = 0 }, // body
                new CellFormat { FontId = 1, FillId = 0, BorderId = 0 } // header
            );

        stylesPart.Stylesheet = new Stylesheet(fonts, fills, borders, cellFormats);
        stylesPart.Stylesheet.Save();
    }
...