openxml spreadsheat另存为

时间:2011-03-05 10:16:53

标签: c# excel openxml-sdk

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

6 个答案:

答案 0 :(得分:14)

据我所知,没有内置的方法来更改文件名,但由于编辑文件的一种方法是使用流,因此在写出流内容时可以轻松地给出所需文件的名称: / p>

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应用程序中的用户,但这取决于您要执行的操作。

答案 1 :(得分:9)

查看此库 ClosedXML ,该库基于 OpenXML ;它简化了大量文档操作,并为您提供了 SaveAs 方法。 以下是您可以做的一个示例。

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

答案 2 :(得分:4)

我强烈推荐使用ClosedXML - 这是第一次使用它,最初我使用标准的Open XML 2.0 SDK在几个小时内完成了“从excel导入”功能 - 我在不到15分钟的时间内重写了它我使用这个工具在10分钟内完成了excel的导出。

答案 3 :(得分:1)

这是我的保存解决方案,使用具有宏和条件格式等的复杂工作簿进行测试(此方法位于包含SpreadsheetDocument属性“Document”的包装中):

    /// <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);
    }

答案 4 :(得分:0)

您可以将该Spreadsheet文档保存到另一个文件名,然后将其打开以进行编辑。

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
}

参考文献:How to: Copy, Delete, and Move Files and Folders (C# Programming Guide)

答案 5 :(得分:0)

我不知道此功能的引入版本,但是我使用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
}