Foros del Web » Programación para mayores de 30 ;) » .NET »

C# Escribir varios excel automaticamente

Estas en el tema de C# Escribir varios excel automaticamente en el foro de .NET en Foros del Web. Hola Foreros Alguien sabe como demonios se especifica el nombre de archivo cuando se esta usando interoperabilidad al crear un excel desde cero en c#?? ...
  #1 (permalink)  
Antiguo 29/09/2009, 15:58
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 7 meses
Puntos: 5
C# Escribir varios excel automaticamente

Hola Foreros

Alguien sabe como demonios se especifica el nombre de archivo cuando se esta usando interoperabilidad al crear un excel desde cero en c#??

me explico.
Tengo una serie de datos (dinamicamente obtenidos), par alos cuales por cada cierto numero de registros debo generar un excel en una carpeta x del disco...
la estructura es la siguiente

foreach (DataRow drAgrupamiento in dttAgrupamientos.Rows)
{
string sClave = drAgrupamiento["clave"]..... bla bla
Datatable datos = clasedata.ObtenerDatosAgrupa(sClave);
grabar_datos_en_excel(datos)
}

por supuesto no son las lineas de codigo que tengo escritas, si no que solamente un ejemplo....

pues bien.. el proceso de obtencion de datos es simple, y no reviste mayor problema. El real problema, es que he intentado con varias formas el generar un excel desde el codigo, pero no consigo dar con la funcionalidad para asignar un nombre al archivo en excel creado en memoria...

estoy probando la siguiente soliucion, que se basa en tener excel instalado en el equipo.

Excel.Application oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng;

oXL = new Excel.Application();
oXL.Visible = true;
//Get a new workbook.
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value) );
oSheet = (Excel._Worksheet)oWB.ActiveSheet;

el problema con este codigo, es que levanta la aplicacion excel al usuario, lo cual no debe suceder, sino que todo el proceso debe crear los archivos en un segundo plano, ya que incluso, los nonbres de archivo existen en un datatable, y son pasados como parametro al proceso de creacion.

intente poner oXL.Visible = false;, pero esto solo oculta la hoja que sigue estando presente en memoria, y por supuesto no se graba.

he recorrido todas las opciones del objeto oXL, (save, DefaultFilePath, Workbooks, etc) pero no encuentro como grabar el excel con el nombre de archivo automaticamente sin que el usuario tenga que ver la hoja generada.

tambien probe la opcion de generar xml, pero no me sirve de mucho, ya que tengo que calcular cosas dentro de ciertos rangos, e inclusive dar formato

no se si fui muy claro, si alguien tiene alguna pista de que estoy haciendo mal, le agradezco de antemano.

Saludos
Plch
  #2 (permalink)  
Antiguo 29/09/2009, 16:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 6 meses
Puntos: 2658
Respuesta: C# Escribir varios excel automaticamente

Código c#.net:
Ver original
  1. oXL.Workbooks(oWB.Name).SaveAs("nombrearchivo.xls");

Y antes de eliminar las instancias de objetos de Excel:

Código c#.net:
Ver original
  1. System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);

Puede haber alguna diferencia, porque está tomado de vb.net...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 30/09/2009, 06:58
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: C# Escribir varios excel automaticamente

Excelente respuesta estimado... funciono perfectamente bien

un alcance. Lo de System.Runtime.InteropServices.Marshal.ReleaseComO bject(oXL); , es para eliminar las instancias de los objetos creados? porque esto no lo realiza automaticamente el GC?
Saludos
plch
  #4 (permalink)  
Antiguo 30/09/2009, 08:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 6 meses
Puntos: 2658
Respuesta: C# Escribir varios excel automaticamente

Cita:
porque esto no lo realiza automaticamente el GC?
Lamentablemente no. El GC tiene control sobre todo lo que existe en el ámbito de la aplicación, pero no tiene dominio sobre lo que existe fuera de ese ambiente, como es el caso de los objetos COM.
En la aplicación se crea un objeto Excel que se "engancha" a una instancia de Excel que se crea por una llamada al sistema operativo (la famosa interoperatibilidad). Tu puedes destruir el objeto en la aplicación, pero el enlace sigue ocupado hasta que se le indique, con otra llamada, que se ha liberado. Si no lo haces, la próxima petición generará otra instancia porque el sistema "supone" que la primera todavía está siendo usada.
Esto es lógico, por cuanto lo que hay fuera de la memoria definida para la aplicación es ámbito del sistema operativo, y es el GC del S.O. quien debe liberarlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 30/09/2009, 08:38
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 7 meses
Puntos: 5
Respuesta: C# Escribir varios excel automaticamente

clarisima explicacion estimado.

Un ultimo alcance, y es que para poder eliminar este objeto de la memoria fuera de la aplicacion, se debe hacer en el siguiente orden..

Código:
//instancio el objeto
oXL = new Excel.Application();

// Lo usamos...
oXL.Visible = false;
oXL.... algo mas...                 

// terminamos de usar el objeto
oXL.Quit();

//invocamos el famoso marshal
System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);

// eliminamos la instancia
oXL = null;
Con esto nos aseguramos que el objeto no queda en la memoria ocupando espacio, lo cual seria fatal si ejecutaramos este proceso repetidas veces

Un saludos y gracias por la cooperacion
PLCH
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:48.