【发布时间】:2014-02-15 16:05:07
【问题描述】:
我有一个修改现有电子表格的程序。该程序的一部分会创建某些工作表的副本。要创建一个副本,程序运行良好,生成的文件也很好,在 Excel 中打开时没有错误。但是,当创建同一个工作表的两个副本时,程序仍然可以正常运行,但是在 Excel 中打开时,出现以下关于不可读内容的错误:
Repaired Records: Worksheet properties from /xl/workbook.xml part (Workbook)
这是用于执行复制的代码:
private void CopySheet(int sNum, int pNum, string type)
{
var tempSheet = SpreadsheetDocument.Create(new MemoryStream(), SpreadsheetDocumentType.Workbook);
WorkbookPart tempWBP = tempSheet.AddWorkbookPart();
var part = Document.XGetWorkSheetPart(sNum);
var sheetData = part.Worksheet.ChildElements[5].Clone() as SheetData;
var merge = part.Worksheet.ChildElements[6].Clone() as MergeCells;
WorksheetPart tempWSP = tempWBP.AddPart<WorksheetPart>(part);
var copy = Document.WorkbookPart.AddPart<WorksheetPart>(tempWSP);
//copy.Worksheet.RemoveChild<SheetData>(copy.Worksheet.ChildElements[5] as SheetData);
//copy.Worksheet.InsertAt<SheetData>(sheetData, 5);
//copy.Worksheet.RemoveChild<MergeCells>(copy.Worksheet.ChildElements[6] as MergeCells);
//copy.Worksheet.InsertAt<MergeCells>(merge, 6);
//copy.Worksheet.SheetProperties.CodeName.Value = "Phase" + pNum + type;
var sheets = Document.WorkbookPart.Workbook.Sheets;
var sheet = new Sheet();
sheet.Id = Document.WorkbookPart.GetIdOfPart(copy);
sheet.Name = "Phase " + pNum + " " + type;
sheet.SheetId = (uint)sheets.ChildElements.Count;
sheets.Append(sheet);
}
此方法利用.AddPart<>() 对不属于文档的任何部件(及其引用的任何内容)执行深层复制这一事实,在临时工作表的帮助下,创建深层副本工作表的所有引用部分。
如上所述,如果该函数只为给定的工作表调用一次,这将非常有效。但是,如果多次调用该文件,则在 Excel 中打开该文件时会出现内容不可读的错误。话虽这么说,文件本身看起来还不错,没有丢失数据或任何东西(这将有助于找出究竟是什么问题),只是错误表明有问题。
被注释掉的行是我必须做的一个“hack”来处理与.AddPart<>()有关的问题,但我不会在这里详细介绍它们,因为我已经发布了关于这个here (但我仍然没有得到答复,所以请务必也回答这个问题!)。话虽如此,这些行似乎与当前的问题无关,因为无论是否有这些代码行都会出现错误。
【问题讨论】: