Файл OpenXML нуждается в восстановлении при открытии в Excel - PullRequest
0 голосов
/ 03 октября 2018

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

Восстановленные записи: Информация о ячейке из / xl / worksheets/sheet1.xml part

Я пытался найти решение подобных проблем, но ничего не помогло.

Вот мой код:

public MemoryStream ConvertToXLSX(DataTable table, string sheetName)
{
    MemoryStream excelStream = new MemoryStream();

    using (var workbook = SpreadsheetDocument.Create(excelStream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
    {
        var workBookPart = workbook.AddWorkbookPart();
        workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
        workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();

        uint sheetID = 1;

        var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
        var sheetData = new SheetData();
        sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);

        DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
        string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);

        if (sheets.Elements<Sheet>().Count() > 0)
        {
            sheetID = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
        }

        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetID, Name = sheetName };
        sheets.Append(sheet);

        Row headerRow = new Row();

        List<string> columns = new List<string>();

        foreach (DataColumn column in table.Columns)
        {
            columns.Add(column.ColumnName);
            Cell cell = new Cell();
            cell.DataType = CellValues.SharedString;
            cell.CellValue = new CellValue(column.ColumnName);
            headerRow.AppendChild(cell);
        }

        sheetData.AppendChild(headerRow);

        foreach (DataRow tabRow in table.Rows)
        {
            Row newRow = new Row();

            foreach (String col in columns)
            {
                var val = tabRow[col];

                Cell cell = new Cell();
                cell.DataType = GetCellValueType(val.GetType());
                cell.CellValue = new CellValue(val.ToString());
                newRow.AppendChild(cell);
            }

            sheetData.AppendChild(newRow);
        }

        workbook.WorkbookPart.Workbook.Save();
    }

    return excelStream;
}

Вот пример данных после их открытия в Excel:

enter image description here

Я попытался открыть файл в средстве повышения производительности Open XML SDK 2.5, и я не получаю никаких ошибок проверки.

Вот скриншот иерархии xml:

enter image description here

1 Ответ

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

Вы выводите неправильный cell.DataType.В ваших заголовках вы выводите CellValues.SharedString, но затем добавляете строку непосредственно в ячейку.Вам нужно установить его на CellValues.String.

. Трудно сказать, что вы выводите для остальных ячеек, когда вы звоните GetCellValueType(val.GetType()), которого нет в списке, но вам снова понадобитсячтобы не использовать CellValues.SharedString, если вы пишете строку.

CellValues.SharedString следует использовать, только если вы записываете само значение в SharedStringTable .

...