2011-03-05 34 views
12

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

回答

12

據我所知,沒有內置的方法來改變文件名,但由於編輯文件的一種方式是使用流,你可以在寫出流的內容時輕鬆地給出所需文件的名稱:

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應用程序的用戶時,喜歡,但是這取決於你正在嘗試做的。

+0

此代碼似乎並不正確。在傳遞給SpreadsheetDocument.Open'調用之前,你需要'stream.Seek(0,SeekOrigin.Begin)'嗎?否則,公開呼叫將收到一個空的流,因爲它在流的末尾。 – 2015-10-01 03:59:56

+0

大概有一個內部呼叫尋求0,因爲代碼爲我工作原樣。 – 2015-10-05 17:59:36

8

看一看這個庫ClosedXML這是基於的OpenXML;它簡化了大量文檔操作併爲您提供了方法。 下面是你可以做的一個例子。

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

我想繼續使用OpenXML,但在嘗試瞭解如何打開現有的Excel模板,填充一些信息並將其推送到瀏覽器2小時後,我嘗試了ClosedXML。我已經用ClosedXML在3分鐘內完成了它。這是非常容易的,我不得不說。 – Quan 2017-04-10 20:56:29

4

我強烈建議ClosedXML - 只是用它的第一次,最初我做了使用標準的Open XML 2.0 SDK在幾個小時的「從Excel導入」功能 - 我重寫它在不到15分鐘,而且我已經使用這個工具在10分鐘內完成了excel的導出。

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