2011-03-05 25 views
12

Tengo una hoja de cálculo de Excel 2007 que edito con OpenXML SDK 2. Elimino algunas filas, etc. Me gustaría saber cómo guardar ese Spreadsheetdocument en otro nombre de archivo.openxml spreadsheat save-as

Respuesta

12

Que yo sepa, no existe una forma de cambiar el nombre del archivo, pero dado que una forma de editar el archivo es utilizar secuencias, puede dar fácilmente el nombre del archivo que desea cuando escribe los contenidos de una secuencia:

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

Hay otras maneras de cambiar el nombre, así como al devolver el archivo a un usuario en una aplicación web ASP.NET MVC, pero depende de lo que está tratando de hacer.

+0

Este código no parece estar bien. ¿Necesita 'stream.Seek (0, SeekOrigin.Begin)' antes de pasarlo a la llamada 'SpreadsheetDocument.Open'? De lo contrario, la llamada abierta recibirá una transmisión vacía ya que está al final de la transmisión. –

+0

Es de suponer que hay una llamada interna para buscar 0, ya que el código funciona para mí como está. –

8

Tenga una mirada en esta biblioteca ClosedXML que se basa en OpenXML; simplifica muchas operaciones de documentos y le proporciona el método SaveAs. Aquí hay un ejemplo de lo que puede hacer.

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

Quería seguir usando OpenXML, pero probé ClosedXML después de 2 horas de intentar descubrir cómo abrir una plantilla de Excel existente, completar información y llevarla al navegador. Lo hice solo en 3 minutos con ClosedXML. Fue extremadamente fácil, tengo que decirlo. – Quan

4

Recomiendo ClosedXML - sólo lo utilizó por primera vez y en un principio que he hecho una funcionalidad "Importar desde Excel" en pocas horas usando Open XML estándar 2.0 SDK - He reescritura que en menos de 15 minutos y también he hecho la exportación para sobresalir en 10 minutos usando esta herramienta.

1

aquí está mi solución para un guardar como, probado con libro complicado que tiene macros y el formato condicional, etc. (este método es en una envoltura que tiene una propiedad SpreadsheetDocument "Documento"):

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