使用开放式XML SDK添加电子表格

我试图通过使用开放的XML SDK 2.5插入一个外部加载的图像来改变一个已有的办公文档。 我打算在excel中这样做,在工作簿上添加一个工作表,然后在那里完成所有的工作。 但是,我似乎无法解决特定的错误。

我的代码是:

public void insert(String filepath) { SpreadsheetDocument doc = SpreadsheetDocument.Open(filepath, false); // Add a WorksheetPart to the WorkbookPart. WorksheetPart worksheetPart = doc.WorkbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); // Add Sheets to the Workbook. Sheets sheets = doc.WorkbookPart.Workbook. AppendChild<Sheets>(new Sheets()); // Append a new worksheet and associate it with the workbook. Sheet sheet = new Sheet() { Id = doc.WorkbookPart. GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" }; sheets.Append(sheet); // Close the document. doc.Close(); } 

第6行(添加新的工作表部分)每次尝试testing程序时都会抛出一个IOexception。 这些代码大部分来自MSDN。 同样的网站build议,如果我得到一个IOexception,我可能会input错误的文件path,但事实绝非如此。 我也证实,我正在访问的成员确实是公开的,所以我有点困惑。 谁能告诉我这个错误可能是什么? 我希望这是简单的。 这是我第一次使用C#。

编辑:我应该提到的exception消息还指出“无法打开一个只读容器”,但我已经证实,该文件是不只读和Excel不打开。

打开文件时,您将false传递给isEditable参数。

 SpreadsheetDocument.Open(filepath, false) 

这使得文件是只读的。 如果将其更改为true ,则应该更好。

更多信息:


我首先将文件内容读入一个MemoryStream ,然后打开它。 这将减less文件损坏的风险。

 var memory = new MemoryStream(); using (var file = File.OpenRead(filepath)) { file.CopyTo(memory); } memory.Position = 0; var doc = SpreadsheetDocument.Open(memory, true); //... doc.Close(); File.WriteAllBytes(filepath, memory.ToArray());