修复记录:从头开始创建的工作表中的单元信息

Kul*_*gar 30 c# xml excel openxml

打开OpenXML创建的电子表格时收到错误.错误如下.

Repaired Records: Cell information from /xl/worksheets/sheet.xml part
Repaired Records: Cell information from /xl/worksheets/sheet2.xml part
Repaired Records: Cell information from /xl/worksheets/sheet3.xml part
Run Code Online (Sandbox Code Playgroud)

我唯一能在网上找到有用的东西就是这个问题讨论了一种算法,它会多次改变单个单元格导致问题.话虽如此,我将把我的构造函数链接到SpreadsheetDocument以及更新单元格的三个函数(我曾经做过一次).

我可以根据需要提供任何其他功能,但我相信问题出现在下面列出的两个中.

顺便说说,

 GetWorksheetPartByName
 InsertCellInWorksheet
 GetCell
Run Code Online (Sandbox Code Playgroud)

应该都按预期工作.

实际计划

static void Main(string[] args)
    {
        //Full path for File
        const string newFile = "@C:\test.xlsx";

        //Constructor creates default worksheet called "mySheet"
        var spreadsheet = new XLSXHelper(newFile);

        //updating some cells.
        spreadsheet.UpdateCell("mySheet", "D2", "R", 2);
    }
Run Code Online (Sandbox Code Playgroud)

构造函数

    public XLSXHelper(string filepath)
    {
        newFile = filepath;
        spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
        this.workbookPart = spreadsheetDocument.AddWorkbookPart();
        workbookPart.Workbook = new Workbook();
        this.worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());
        Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
        AppendChild<Sheets>(new Sheets());
        Sheet sheet = new Sheet()
        {
            Id = spreadsheetDocument.WorkbookPart.
                GetIdOfPart(worksheetPart),
            SheetId = 1,
            Name = "mySheet"
        };
        sheets.Append(sheet);
        workbookPart.Workbook.Save();
        spreadsheetDocument.Close();
    }
Run Code Online (Sandbox Code Playgroud)

更新单元格

    public void UpdateCell(string worksheetName, string textToInsert, string columnName, uint rowIndex)
    {
        using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(newFile, true))
        {
            WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName);
            if (worksheetPart != null)
            {
                InsertCellInWorksheet(columnName, rowIndex, worksheetPart);
                Cell cell = GetCell(worksheetPart.Worksheet,columnName, rowIndex);
                cell.CellValue = new CellValue(textToInsert);
                worksheetPart.Worksheet.Save();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 63

如果要向单元格而不是数字(或可以转换为数字的字符串)添加字符串,则应使用内联字符串或共享字符串而不是CellValue.如果值为数字,则只能使用CellValue.

使用CellValue时生成的XML类似于:

<x:row>
  <x:c>
    <x:v>12345</x:v>
  </x:c>
</x:row>
Run Code Online (Sandbox Code Playgroud)

当您使用内联字符串时,它看起来像:

<x:row>
  <x:c t="inlineStr">
    <x:is>
      <x:t>Foo</x:t>
    </x:is>
  </x:c>
</x:row>
Run Code Online (Sandbox Code Playgroud)

请注意内联字符串的"is"节点,并且单元格类型属性设置为"inlineStr".

以下是为包含文本的单元格生成正确XML的C#代码:

cell.DataType = CellValues.InlineString;
cell.InlineString = new InlineString() { Text = new Text(textToInsert) };
Run Code Online (Sandbox Code Playgroud)

从我使用共享字符串读取的内容是可取的,但使用内联字符串可以避免错误,并且在Excel中打开文件时看起来很好.


Ste*_*ner 9

我意识到这是一个旧线程,但我刚刚为编程生成的Excel工作表弹出了相同的错误消息.我的问题是我一直在设置工作表的名称,其名称中包含正斜杠.

希望这可以帮助那些偶然发现这个主题的人,因为它是该主题中最受欢迎的主题.