OpenXML电子表格另存为。

16

我有一个Excel 2007电子表格,使用OpenXML SDK 2进行编辑。我删除了一些行等。我想知道如何将该Spreadsheetdocument保存到另一个文件名。

6个回答

15
据我所知,没有内置的方法可以更改文件名,但由于编辑文件的一种方式是使用流,因此在输出流内容时可以轻松地指定要使用的文件名:
byte[] byteArray = File.ReadAllBytes("C:\\temp\\oldName.xltx");
using (MemoryStream stream = new MemoryStream())
{
    stream.Write(byteArray, 0, (int)byteArray.Length);
    using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
    {
       // Do work here
    }
    File.WriteAllBytes("C:\\temp\\newName.xlsx", stream.ToArray()); 
}

还有其他的方式来更改名称,比如在将文件返回给ASP.NET MVC Web应用程序用户时,但这取决于你要做什么。


这段代码似乎不正确。在调用SpreadsheetDocument.Open之前,您需要使用stream.Seek(0, SeekOrigin.Begin)吗?否则,由于流位于流的末尾,打开调用将接收到一个空流。 - Earth Engine
可能有内部调用来寻找0,因为代码按原样适用于我的情况。 - Eric J.

11

看看这个基于 OpenXML 的库ClosedXML,它简化了很多文档操作并提供了 SaveAs 方法。下面是一个示例:

        var workbook = new XLWorkbook();
        var worksheet = workbook.Worksheets.Add("Sample Sheet");
        worksheet.Cell("A1").Value = "Hello World!";
        workbook.SaveAs("HelloWorld.xlsx");

3
我本想继续使用OpenXML,但在试图找出如何打开现有的Excel模板、填写一些信息并将其推送到浏览器后,我尝试了一下ClosedXML。用ClosedXML只花了3分钟就做到了,而且非常容易。 - Quan

6

我强烈推荐使用ClosedXML - 我第一次使用它并最初在几小时内完成了“从Excel导入”功能,使用标准的Open XML 2.0 SDK - 现在我只需要不到15分钟就可以重新编写它,并且使用此工具仅需10分钟即可完成Excel导出。


3
你可以将该电子表格文档另存为其他文件名,然后打开它进行编辑。
string sourceFile = "C:\Users\***.xlsx";
string destFile = "C:\Users\*****.xlsx";
System.IO.File.Copy(sourceFile, destFile, true);
using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(destFile, true))
{
  //remove some rows etc
  //save workbookpart
}

参考资料:如何:复制、删除和移动文件和文件夹 (C# 编程指南)


1
这是我针对“另存为”设计的解决方案,已经测试过可以处理包含宏和条件格式等复杂工作簿。(此方法在具有“SpreadsheetDocument”属性“文档”的包装器中):
    /// <summary>
    /// Saves as.
    /// </summary>
    /// <param name="fileName">Name of the file.</param>
    public void SaveAs(String filename)
    {
        String dir = filename.Replace(System.IO.Path.GetFileName(filename), String.Empty);
        if (!System.IO.Directory.Exists(dir))
            System.IO.Directory.CreateDirectory(dir);

        SpreadsheetDocument newDoc = SpreadsheetDocument.Create(filename, Document.DocumentType);

        //Make sure it's clear
        newDoc.DeleteParts<OpenXmlPart>(newDoc.GetPartsOfType<OpenXmlPart>());

        //Copy all parts into the new book
        foreach (OpenXmlPart part in Document.GetPartsOfType<OpenXmlPart>())
        {
            OpenXmlPart newPart = newDoc.AddPart<OpenXmlPart>(part);
        }

        //Perform 'save as'
        newDoc.WorkbookPart.Workbook.Save();
        newDoc.Close();
        this.Document.Close();

        //Open new doc
        this.Document = SpreadsheetDocument.Open(filename, true);
    }

1
我不知道这个功能是在哪个版本引入的,但我使用OpenXmlPackage.SaveAs,其中
SpreadsheetDocumentOpenXmlPackage的子类。

此函数返回新文档,因此您可以切换到复制的文档并对其进行更改:

void FromTemplate()
{
  using var template = SpreadsheetDocument.Open("Template.xlsx", isEditable: true);
  using var output = (SpreadsheetDocument)template.SaveAs(path);

  //no longer need to keep handle open
  template.Dispose();

  //apply your changes to package
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接