2012-10-04 24 views
5

Estoy haciendo una aplicación C# simple que es editar la plantilla existente de excel 2003 (xlt) y guardar en un nuevo archivo * .xls. Es como:Guardar el archivo de Excel 2003

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open("\\my_template.xlt"); 
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[0]; 

Luego modifico algunas células que se utilizan en diversas fórmulas dentro del archivo y guarda la plantilla en un nuevo archivo:

workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal); 
workbook.Close(true, misValue, misValue); 
app.Quit(); 

worksheet = null; 
workbook = null; 
app = null; 

Así que el problema es que cuando el nuevo archivo Se ha guardado correctamente, lo abro y veo que los resultados de las fórmulas, que están usando las celdas que he editado, son como "#NOMBRE", y así sucesivamente. Cuando vuelvo a abrir el archivo, todo está bien. ¿Por que sucede?

Tal vez estoy guardando archivos de manera incorrecta y es por eso que veo errores durante su primera apertura? Este problema es real para la oficina de 2003 solamente ... como lo he admitido.

+0

Qué versión de ensamblado de interoperabilidad que están referenciando? –

+3

¿Cómo estás editando las celdas? – oberfreak

Respuesta

3

Como se ha mencionado here, cambie la enumeración de xlExcel8 en lugar de xlWorkbookNormal, y esto ahorrará en el formato correcto.

En segundo lugar, establecer los valores de referencia en null realmente no hace nada en .Net, no es como VB6, el recolector de basura es lo suficientemente inteligente como para descubrir cuando una referencia ya no se utiliza y limpiarlo.

En tercer lugar, si está utilizando .Net 4 o superior, no es necesario para suministrar valores para los argumentos opcionales del método de libro Close, por lo que este funciona igual de bien:

workbook.Close(true); 

Por último, no es necesario para emitir su hoja de cálculo como una hoja de cálculo, puede simplemente hacer esto:

Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

una reflexión final, utilice el comisario para liberar el objeto de la aplicación una vez que haya terminado, o Excel va a quedarse en su administrador de tareas para siempre (tal vez haga lo que necesita hacer dentro de un bloque de prueba, y luego haga esto en un bloque finally):

Marshal.ReleaseComObjct(app); 

Actualizado versión del método es el siguiente:

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 

try 
{ 
    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open(@"\my_template.xlt"); 
    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

    //Do stuff 

    workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat..xlExcel8); 
    workbook.Close(true); 
    app.Quit(); 
} 
finally 
{ 
    Marshal.ReleaseComObject(app); 
} 
+0

voy a probar su consejo más tarde e informar el resultado aquí, ¡gracias! – TakinosaJi

+0

No me ayudó ... – TakinosaJi

+0

Bueno 'xlExcel8' es la lista correcta para guardar libros de Excel 2003, ¿está configurando sus valores con la propiedad' Value' o 'Value2'? – JMK

Cuestiones relacionadas