簡體   English   中英

OpenXML的傳播熱量另存為

[英]openxml spreadsheat save-as

我有一個用OpenXML SDK 2編輯的Excel 2007電子表格。我刪除了一些行等。我想知道如何將SpreadsheetDocument保存到另一個文件名。

據我所知,沒有內置的更改文件名的方法,但是由於編輯文件的一種方法是使用流,因此在寫出流的內容時可以輕松地提供所需文件的名稱:

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應用程序中將文件返回給用戶時,但這取決於您要執行的操作。

看一下基於OpenXML的 ClosedXML庫; 它簡化了許多文檔操作,並提供了SaveAs方法。 這是您可以做什么的示例。

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

我強烈建議使用ClosedXML-第一次使用它,起初我使用標准的Open XML 2.0 SDK在數小時內完成了“從Excel導入”功能-我用不到15分鍾的時間重寫了它,而且使用此工具在10分鍾內即可導出到excel。

您可以將該Spreadsheetdocument保存為另一個文件名,然后將其打開以進行編輯。

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#編程指南)

這是我的另存為解決方案,已通過具有宏和條件格式等的復雜工作簿進行了測試(此方法位於具有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);
    }

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM