使用开放式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());