【问题标题】:Adding Spreadsheets with open XML SDK使用开放 XML SDK 添加电子表格
【发布时间】:2015-09-15 08:31:05
【问题描述】:

我正在尝试通过使用开放 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 行(添加新的工作表部分)都会引发 IO 异常。大部分代码取自 MSDN。同一个站点建议如果我遇到 IO 异常,我可能输入了错误的文件路径,但绝对不是这种情况。我还验证了我正在访问的成员确实是公开的,所以我有点困惑。谁能告诉我这个错误可能是什么?我希望这很简单。这是我第一次使用 C#。

编辑:我应该提到异常消息还指出“无法打开只读容器”,但我已经验证该文件不是只读的并且 excel 没有打开。

【问题讨论】:

  • @Donal 不,我没有。而且我在正在运行的进程列表中没有看到 excel。

标签: c# excel visual-studio openxml-sdk


【解决方案1】:

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

SpreadsheetDocument.Open(filepath, false)

这使文档成为只读的。如果你把它改成true,应该会更好。

更多信息:


我会先将文件内容读入MemoryStream,然后打开它。这将降低文件损坏的风险。

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

【讨论】:

  • 哇,谢谢!我对工具缺乏经验的情况。现在我只需要担心文件损坏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多