【问题标题】:Corrupt records from OpenXML Spreadsheet creation来自 OpenXML 电子表格创建的损坏记录
【发布时间】:2018-04-16 02:15:13
【问题描述】:

我正在尝试使用 OpenXML 生成一个简单的 XLSX 文件,但是当我打开文件时出现错误,并且日志文件的 repairedRecord 部分中的唯一信息是:

修复的记录:来自 /xl/worksheets/sheet1.xml 部分的单元格信息

奇怪的是,我尝试编写的所有单元格都具有我期望它们具有的值。我现在只是想写一个标题行,其中headers 只是一个IEnumerable<string>

using (var doc = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook)) {
    var workbookPart = doc.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet();

    var sheets = workbookPart.Workbook.AppendChild(new Sheets());
    var sheet = new Sheet {
        Id = workbookPart.GetIdOfPart(worksheetPart),
        SheetId = 1,
        Name = "Sheet 1"
    };
    sheets.Append(sheet);

    workbookPart.Workbook.Save();

    var sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());

    var row = new Row { RowIndex = 1 };

    var column = 1;
    foreach (var header in headers)
        row.AppendChild(new Cell {
            CellReference = GetColumnLetter(column++) + "1",
            DataType = CellValues.SharedString,
            CellValue = new CellValue(header)
        });

    sheetData.Append(row);

    workbookPart.Workbook.Save();
}

【问题讨论】:

    标签: openxml openxml-sdk


    【解决方案1】:

    如果你要插入一个字符串值,你应该使用 CellValues.InlineString

      foreach (var header in headers)
            row.AppendChild(new Cell (new InlineString(new Text(header))) {
                CellReference = GetColumnLetter(column++) + "1",
                DataType = CellValues.InlineString
            });
    

    【讨论】:

    • 编译器不喜欢这样。说它不能在 CellValue 构造函数上从 InlineString 转换为字符串。
    • 难道他们不能让这个 API 变得更迟钝吗?
    • @Gargoyle FWIW 之所以如此迟钝,是因为 OpenXML 格式的文件大小非常大 - 并且性能随后非常差。最小化文件大小以最佳方式产生复杂的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多