¿Necesitas comprimir varios ficheros en una carpeta .ZIP para (por ejemplo) , enviarlos por correo?
En primer lugar, necesitas añadir vjslib.dll a las referencias de tu proyecto. Puedes hacerlo desde la solapa .NET del diálogo de referencias, o navegando a la carpeta ( C:\WINDOWS\Microsoft.NET\Framework\ o similar).
Actualización 15/11/12 : Si tienes problemas añadiendo la referencia, quizás necesites instalar el "Microsoft J# Redistributable Package" Puedes descargarlo de aquí
Una vez hayas añadido la referencia, podrás usar las clases de J# desde tu programa C#:
using java.util.zip;
using java.io;
Bien, pues suponiendo que tienes un array con los nombres de fichero a comprimir...
string[] ficheros_adjuntos = { "c:\\fich1.txt", "c:\\fich2.txt", "c:\\fich.txt" };
... y quieres crear una carpeta ZIP que los contenga ...
string nombre_fichero_salida = "c:\\fichero.zip";
El código sería similar a esto...
// Creamos un nuevo fichero zip
FileOutputStream streamSalida = new FileOutputStream( nombre_fichero_salida, false);
ZipOutputStream zipStream = new ZipOutputStream(streamSalida);
foreach (string fichero in ficheros_adjuntos)
{
sbyte[] contenido = new sbyte[1024];
int bytesLeidos = 0;
// Añadimos una entrada al fichero .zip Hay una entrada .zip por cada fichero que añadimos
ZipEntry ze = new ZipEntry(fichero.Replace ("c:\\" , ""));
zipStream.putNextEntry(ze);
// Volcamos el contenido del fichero de entrada al stream de compresión
FileInputStream fichero_entrada = new FileInputStream(fichero);
while ((bytesLeidos = fichero_entrada.read(contenido)) >= 0)
{
zipStream.write(contenido, 0 , bytesLeidos);
}
// Cerramos la entrada del fichero .zip y el fichero de entrada
zipStream.closeEntry();
fichero_entrada.close();
}
// Cerramos el stream y el fichero de salida
zipStream.close();
streamSalida.close();
Saludos.
jueves, 21 de octubre de 2010
viernes, 8 de octubre de 2010
Exportando e importando datos a Excel 2010 con C#
- Introducción.
A veces, la forma más elegante de presentar un listado a un usuario es generando una hoja de Excel con los datos. También puede ser útil leer datos de un libro de Excel, para procesarlos desde una aplicación C#.
Ambas tareas son una auténtica chorrada usando ADO: sólo hay que abrir el fichero de Excel como si fuera una base de datos cualquiera.
- Conexión
string plantilla = "TEMP\\prueba.xlsx";
string cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+plantilla+";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";
OleDbConnection con = new OleDbConnection(cadenaConexion);
con.Open();
El fichero "plantilla" puede o no existir. En este ejemplo vamos a crear uno nuevo.
Tienes más ejemplos de cadenas de conexión en http://www.connectionstrings.com/
- Definiendo una tabla.
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = @"create table [Hoja1] (F1 char(255), F2 char(255), F3 char(255))";
cmd.ExecuteNonQuery();
Esta orden creará un fichero llamado "prueba.xlsx" , y dentro una hoja llamada "Hoja1". En la primera fila de la hoja, aparecerán los nombres de campo F1, F2 y F3
- Insertando datos.
cmd.CommandText = @"insert into [Hoja1$] (F1, F2, F3) values (1, 2, 3)";
cmd.ExecuteNonQuery();
Los datos se insertarán en la primera fila libre tras la cabecera.
- Actualizando datos.
Como ya te habrás imaginado, actualizar datos es tan sencillo como ...
cmd.CommandText = @"update [Hoja1$] set F2 = '4' where F1 = '1'";
cmd.ExecuteNonQuery();
- Leyendo datos.
cmd.CommandText = "select * from [Hoja1$] order by F1";
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
// hacemos cosas con los datos
}
dr.Close();
- Para terminar.
Cerramos la conexión...
con.Close();
Si estás exportando datos, probablemente querrás abrir el fichero de Excel para que el usuario no tenga que buscarlo y abrirlo él.
System.Diagnostics.Process p = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(plantilla);
info.UseShellExecute = true;
p.StartInfo = info;
while(!p.Start());
Espero que te sea útil :)
A veces, la forma más elegante de presentar un listado a un usuario es generando una hoja de Excel con los datos. También puede ser útil leer datos de un libro de Excel, para procesarlos desde una aplicación C#.
Ambas tareas son una auténtica chorrada usando ADO: sólo hay que abrir el fichero de Excel como si fuera una base de datos cualquiera.
- Conexión
string plantilla = "TEMP\\prueba.xlsx";
string cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+plantilla+";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";
OleDbConnection con = new OleDbConnection(cadenaConexion);
con.Open();
El fichero "plantilla" puede o no existir. En este ejemplo vamos a crear uno nuevo.
Tienes más ejemplos de cadenas de conexión en http://www.connectionstrings.com/
- Definiendo una tabla.
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = @"create table [Hoja1] (F1 char(255), F2 char(255), F3 char(255))";
cmd.ExecuteNonQuery();
Esta orden creará un fichero llamado "prueba.xlsx" , y dentro una hoja llamada "Hoja1". En la primera fila de la hoja, aparecerán los nombres de campo F1, F2 y F3
- Insertando datos.
cmd.CommandText = @"insert into [Hoja1$] (F1, F2, F3) values (1, 2, 3)";
cmd.ExecuteNonQuery();
Los datos se insertarán en la primera fila libre tras la cabecera.
- Actualizando datos.
Como ya te habrás imaginado, actualizar datos es tan sencillo como ...
cmd.CommandText = @"update [Hoja1$] set F2 = '4' where F1 = '1'";
cmd.ExecuteNonQuery();
- Leyendo datos.
cmd.CommandText = "select * from [Hoja1$] order by F1";
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
// hacemos cosas con los datos
}
dr.Close();
- Para terminar.
Cerramos la conexión...
con.Close();
Si estás exportando datos, probablemente querrás abrir el fichero de Excel para que el usuario no tenga que buscarlo y abrirlo él.
System.Diagnostics.Process p = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(plantilla);
info.UseShellExecute = true;
p.StartInfo = info;
while(!p.Start());
Espero que te sea útil :)
Suscribirse a:
Entradas (Atom)