Leer archivos Excel en un servidor de 64 bits, parte I
admin | 6 Agosto 2008Problemas planteados:
- A traves de una aplicación web el usuario adjunta un archivo Excel. Leer el contenido de dicho archivo y grabarlo en un conjunto de tablas dentro de una base de datos.
- El servidor web que aloja la aplica usa el sistema Windows Server 2003 Release 2, con 64 bits. Esto impide que funcione correctamente el proveedor OLE DB, pues no existe una versión de dicho proveedor en 64 bits.
Desarrollo:
Para leer datos desde el usuario, una solución mas específica podría haber sido el uso de XML, pero en este caso los usuarios no son muy técnicos y ya tienen la información en archivos Excel.
En esta primera parte, vamos a ver como leer el archivo Excel, en ASP.NET
Paso 1: Función GetExcelDataSet
Primero, creamos una función GetExcelDataSet que tome la ruta de un archivo Excel y el nombre de area de datos a leer y devuelva un DataSet.
Para leer el archivo, usamos el proveedor ACE OLEDB 12.0, que puede leer hasta los Excel en sus versiones 2007 o inferior. (Mas información: http://www.connectionstrings.com/?carrier=excel2007)
Una vez establecida la cadena de conexión, intentamos abrir la conexión con el archivo Excel.
Luego de abrir la conexión al archivo, utilizamos una sentencia SELECT para leer los datos de un area de datos del archivo que se defina con un nombre de area específico.
Por último, la información leída del archivo es cargada dentro de un DataTable con el mismo nombre que el área y devuelta en un DataSet.
public DataSet GetExcelDataSet(string FileName, string NombreArea)
{
OleDbConnection oConn = new OleDbConnection();
DataSet oDs = new DataSet();
OleDbCommand oCmd = new OleDbCommand();
OleDbDataAdapter oDa = new OleDbDataAdapter();
// Recuperamos la cadena de conexion
string strConexion = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” + FileName + “;Extended Properties=’Excel 12.0 Xml;HDR=NO;MaxScanRows=1′”;
oConn.ConnectionString = strConexion;
// Abrimos la conexion con el archivo Excel
try
{
oConn.Open();
}
catch (Exception ex)
{
throw new Exception(”No se pudo establecer la conexión con el archivo Excel”, ex);
}
oCmd.Connection = oConn;
// Leemos la información de un area del Excel
DataTable oDt = oDs.Tables.Add(NombreArea);
oCmd.CommandText = “SELECT * FROM ” + NombreArea;
oDa.SelectCommand = oCmd;
try
{
oDa.Fill(oDt);
}
catch (Exception ex)
{
throw new Exception(”No se pudo rescatar la información del area ” + NombreArea, ex);
}
return oDs;
}
Paso 2: Formulario LeerExcel.aspx
Ahora creamos un formulario web en .NET, que contenga los siguientes controles:
- FileUpload, subir el archivo Excel,
- TextBox, escribir el nombre de area de datos
- Botón, generar la acción de leer el archivo
- GridView, mostrar los datos del Excel
El código de esta página será similar al siguiente:
<form id=”form1″ runat=”server”>
<div>
<p>Archivo <asp:FileUpload ID=”fuExcel” runat=”server” /></p>
<p>Nombre de area <asp:TextBox ID=”txtNombreArea” runat=”server”></asp:TextBox></p>
<p><asp:Button ID=”btnLeer” runat=”server” Text=”Leer” OnClick=”btnLeer_Click” /></p>
<p>Valores Leídos:</p>
<asp:GridView ID=”GridView1″ runat=”server”>
</asp:GridView>
</div>
</form>
Por último, en el codebehind de la página, tenemos el evento btnLeer_Click, que realiza las siguientes acciones:
- Grabar el archivo Excel en un directorio temporal del servidor,
- Rescatar la información del archivo con la función GetExcelDataSet, y
- Mostrar dichos datos en la GridView
protected void btnLeer_Click(object sender, EventArgs e)
{
if (fuExcel.HasFile)
{
string filename = @”D:\TEMP\” + fuExcel.FileName;
FileStream fs = new FileStream(filename, FileMode.Create);
fs.Write(fuExcel.FileBytes, 0, Convert.ToInt32(fuExcel.FileBytes.Length));
fs.Close();
DataSet dsDatos = GetExcelDataSet(filename, txtNombreArea.Text);
GridView1.DataSource = dsDatos;
GridView1.DataBind();
}
}
Hasta aquí, si estamos probando en un PC de desarrollo no hay ningún problema. Hasta que lo pasamos al servidor de producción (64 bits) y la función GetExcelDataSet no funciona… Motivo: el proveedor OLE DB no está registrado en el servidor…. Solución: Correr la función GetExcelDataSet en un entorno de 32 bits.
La solucion en detalle, en una próxima entrega.






Tengo el mismo problema con un accés, porfavor!!!! cual es
jaime | 3 Septiembre 2008Tengo el mismo problema con un accés, porfavor!!!! cual es la solución!?!?!
Gracias
Jaime: Acabo de publicar las alternativas de solución que me sirvieron
admin | 4 Septiembre 2008Jaime:
Acabo de publicar las alternativas de solución que me sirvieron con Excel.
Espero que te sirvan tambien con Access. Cuentame como te va.
De todas formas, si en algo te puedo ayuda, cuenta conmigo.
Saludos, Samuel.