2008-08-26 25 views
11

El problema: cargar una plantilla de hoja de cálculo de Excel. Usar el comando Guardar con un nombre de archivo diferente y luego salir del objeto de interoperabilidad. Esto termina guardando el archivo de plantilla original. No es el resultado que le gusta.Usando Interop con C#, Excel Guardar cambiando original. ¿Cómo negar esto?

public void saveAndExit(string filename) 
{   
    excelApplication.Save(filename); 
    excelApplication.Quit(); 
} 

archivo original abrió es c: \ prueba \ TEMPLATE.XLS El nombre del archivo que se pasa es c: \ prueba \ 7777 (fecha) .xls

¿Alguien tiene una respuesta?

(La respuesta que eligió fue el más correcto y completo aunque el wbk.Close() requiere parámetros que recibe. Gracias.)

Respuesta

8

La interoperabilidad de Excel es bastante dolorosa. Saqué un viejo proyecto que tenía, hice un poco de violín, y creo que esto es lo que estás buscando. Los otros comentaristas tienen razón, pero, al menos en mi experiencia, hay mucho más para llamar a SaveAs() de lo que esperaría si hubiera utilizado los mismos objetos (sin el envoltorio de interoperabilidad) en VBA.

Microsoft.Office.Interop.Excel.Workbook wbk = excelApplication.Workbooks[0]; //or some other way of obtaining this workbook reference, as Jason Z mentioned 
wbk.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing); 
wbk.Close(); 
excelApplication.Quit(); 

Tengo que amar a todos esos Type.Missings. Pero creo que son necesarios.

0

¿Ha probado los GuardarComo de la Hoja de trabajo?

1

En lugar de utilizar una aplicación de Excel, puede usar el objeto libro de trabajo y llamar al método SaveAs(). Puede pasar el nombre del archivo actualizado allí.

0
  1. Lo mismo ocurre en los GuardarComo
  2. Cada vez que tengo que hacer interoperabilidad puedo crear una biblioteca de clases VB.NET separada y escribir la lógica en VB. Simplemente no vale la pena hacerlo en C#
Cuestiones relacionadas