c# - 在 Excel 中打开 OpenXML 文件时需要修复

标签 c# .net openxml .net-standard

我正在开发一个使用 OpenXML 将 DataTable 转换为 .xlsx 文件的函数。我能够很好地创建 .xlsx 文件并将其导出,但是当我在 Excel 中打开它时,出现以下错误:

Repaired Records: Cell information from /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 Productivity 工具中打开该文件,但没有收到任何验证错误。

这是 xml 层次结构的屏幕截图:

enter image description here

最佳答案

您正在输出错误的 cell.DataType。在您的 header 中,您正在输出 CellValues.SharedString 但随后将字符串直接添加到单元格中。您需要将其设置为 CellValues.String

当您调用未列出的 GetCellValueType(val.GetType()) 时,很难说出您为其余单元格输出的内容,但同样,您将需要如果要写出字符串,请避免使用 CellValues.SharedString

只有将值本身写入 SharedStringTable 时才应使用 CellValues.SharedString .

关于c# - 在 Excel 中打开 OpenXML 文件时需要修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52617610/

相关文章:

c# - ASP.NET 5 - TypeLoadException - 无法从程序集 'Microsoft.JSInterop.WebAssembly 加载类型 'WebAssembly.JSInterop.JSCallInfo'

javascript - Excel 图表到 JavaScript

c# - Thread.Sleep 的精度还很差吗?

c# - 哪个运行时性能更快 : WPF or Winforms?

.net - Visual Studio Shell - 创建自定义 IDE

.net - Azure 表存储插入或替换结果

c# - 如何从 OpenXML docx 文件中删除书签?

c# - 为 OPEN XML 中的单元格设置 Font.Bold 和 Column.Width

c# - 您可以使用 Entity Framework 4.1 代码优先方法创建 sql View /存储过程吗

c# - 根据墨卡托投影的纬度计算 Y 位置