修复logging:从头开始创build的工作表中的单元信息

打开我的OpenXML创build的电子表格时,出现错误。 错误如下。

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 

我唯一能够在网上find的东西很有帮助,这个问题是一个algorithm的讨论,它改变了一个单独的单元多次导致问题。 话虽如此,我将链接我的构造函数的SpreadsheetDocument以及三个function更新单元格(我做了一次)。

我可以根据需要提供任何其他function,但我相信问题在下面列出的两个地方。

顺便一提,

  GetWorksheetPartByName InsertCellInWorksheet GetCell 

应该都按预期工作。

实际计划

 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); } 

构造函数

  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(); } 

更新单元格

  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(); } } } 

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

使用CellValue时生成的XML如下所示:

 <x:row> <x:c> <x:v>12345</x:v> </x:c> </x:row> 

当你使用一个内联string时,它看起来像:

 <x:row> <x:ct="inlineStr"> <x:is> <x:t>Foo</x:t> </x:is> </x:c> </x:row> 

请注意内联string的“is”节点,并将单元格types属性设置为“inlineStr”。

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

 cell.DataType = CellValues.InlineString; cell.InlineString = new InlineString() { Text = new Text(textToInsert) }; 

从我读过使用共享string是可取的,但使用内联string避免了错误,并且看起来就好,当你在Excel中打开文件。

我意识到这是一个旧的线程,但我只是有一个程序生成的Excel工作表也popup相同的错误消息。 我的问题是我一直在设置工作表的名称,其中有一个正斜杠的名称。

希望这可以帮助别人在这个话题上磕磕绊绊,因为它是话题上最受欢迎的话题。

另一个较晚的 – 但检查你如何添加细胞连续。 你是否剪切和粘贴添加单元格代码,其中有一个'简单的'与行中现有的单元格引用(A1等)进行比较? 在这种情况下,如果你有一个单元格超出列Z – AA1向前 – 那么你可能最终尝试在单元格B1之前插入单元格(例如)AB1)。 您将在Excel中打开书面表单时出现此错误。 相反,如果简单地在每行的单元格之后添加单元格,就直接插入之前的参考单元格设置为空 – 即。 添加新的单元格结束。

希望是有道理的。

在这个问题上自己陷入困境,发现这个线程。 在我的情况差异不能修复该文件。 问题是我从MSDN上的示例传递给InsertCellInWorksheet行索引。

 Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart); 

插入行时,请确保行的索引是1,而不是0.但是,对于SheetData集合, SheetData 0。

 sheetData.InsertAt(new Row() { RowIndex = 1 }, 0); lastRow = sheetData.Elements<Row>().LastOrDefault(); 

希望能节省一些经历同样麻烦的人。

有趣的是,我的集成testing通过,但是,通过Excel打开文件时,它显示了有关腐败的popup窗口。 似乎有一个索引0的行,但是,有点秘密,因为你将无法用Excel打开文件。