2010-09-30 9 views
5

Tengo el siguiente código para abrir el archivo de plantilla de Excel y guardarlo como archivo .xlsx y obtengo el siguiente error cuando intento abrir el nuevo archivo. Por favor ayuda a resolver esto.Open XML SDK - Guardar un archivo de plantilla (.xltx a .xlsx)

Excel no puede abrir el archivo 'sa123.xlsx' porque el formato de archivo o la extensión no son válidos. Verifique que el archivo no se haya dañado y que la extensión del archivo coincida con el formato del archivo.

 string templateName = "C:\\temp\\sa123.xltx"; 
     byte[] docAsArray = File.ReadAllBytes(templateName); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      stream.Write(docAsArray, 0, docAsArray.Length); // THIS performs doc copy 
      File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray());  
     } 

Respuesta

7

Para hacer esto, necesitará usar el Open XML SDK 2.0. A continuación se muestra un fragmento de código que trabajó para mí cuando lo probé:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\sa123.xltx"); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true)) 
    { 
     // Change from template type to workbook type 
     spreadsheetDoc.ChangeDocumentType(SpreadsheetDocumentType.Workbook); 
    } 
    File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray()); 
} 

Lo que esto hace es el código que se necesita el archivo de plantilla y lo abre en un objeto SpreadsheetDocument. El tipo de este objeto es Template, pero como lo quiere como Workbook llama al método ChangeDocumentType para cambiarlo de Template a Workbook. Esto funcionará dado que el XML subyacente es el mismo entre un archivo .xltx y uno .xlsx y fue simplemente el tipo que le estaba causando un problema.

+0

Gracias. Eso ayuda. –

1

Excel ve la extensión .xlsx y trata de abrirlo como un archivo de hoja de cálculo. Pero no lo es. Es un archivo de plantilla. Cuando tiene una plantilla abierta en Excel y la guarda como un archivo .xlsx, la convierte al formato de la hoja de cálculo. Lo que estás haciendo es lo mismo que cambiar la extensión en el nombre del archivo. Pruébalo en Windows Explorer y obtendrás el mismo resultado.

Creo que deberías poder lograr lo que deseas usando el Excel Object Model. No he usado esto sin embargo.

+0

Cualquier idea de qué debería hacer para ocultar/guardar en el formato de hoja de trabajo en el código anterior. –

+0

@SA. He editado por respuesta para incluir una respuesta a su pregunta. – YWE

+0

Su primer párrafo es una buena explicación del problema, pero recomendar a alguien que use la interoperabilidad de Excel para resolver este problema es excesivo. –

Cuestiones relacionadas