2010-03-16 49 views
5

Tengo una hoja de cálculo de Excel que se colocará en una unidad de red compartida. Es necesario que acceda a mi aplicación Winforms C# 3.0 (muchos usuarios podrían estar usando la aplicación y accediendo a esta hoja de cálculo al mismo tiempo). Hay una gran cantidad de datos en una hoja de trabajo. Estos datos se dividen en áreas que he nombrado como rangos. Necesito poder acceder a estos rangos de forma individual, devolver cada rango como un conjunto de datos y luego vincularlo a una grilla.Convertir el rango de Excel a ADO.NET DataSet o DataTable, etc.

He encontrado ejemplos que usan OLE y los he puesto a trabajar. Sin embargo, he visto algunas advertencias sobre el uso de este método, además en el trabajo hemos estado utilizando Microsoft.Office.Interop.Excel como el estándar hasta ahora. Realmente no quiero alejarme de esto a menos que sea necesario. Nuestros usuarios usarán Office 2003 hasta donde yo sé.

puedo conseguir el rango que necesito con el siguiente código:

MyDataRange = (Microsoft.Office.Interop.Excel.Range) 
    MyWorkSheet.get_Range("MyExcelRange", Type.Missing); 

La forma OLE era agradable ya que tomaría mi primera fila y convertir los en columnas. Mis rangos (12 en total) son en su mayoría diferentes entre sí en número de columnas. No sabía si esta información afectaría cualquier recomendación.

¿Hay alguna forma de usar Interop y obtener el rango devuelto en un conjunto de datos?

Respuesta

2

no sé acerca de una función incorporada, pero no debería ser difícil de escribir por sí mismo. Pseudocódigo:

DataTable MakeTableFromRange(Range range) 
{ 
    table = new DataTable 
    for every column in range 
    { 
     add new column to table 
    } 
    for every row in range 
    { 
     add new datarow to table 
     for every column in range 
     { 
     table.cells[column, row].value = range[column, row].value 
     } 
    } 
    return table 
} 
+0

Aprecio todas las respuestas. Como no pude encontrar nada incorporado, avancé y simplemente rodé por el rango y creé una tabla de datos sobre la marcha. Todas las sugerencias enumeradas aquí realmente funcionarían, es solo que no quería usar OLEDB y no puedo traer una biblioteca de terceros en este momento. Gracias por tus respuestas rápidas. Muy apreciado. – user295197

+0

Esto es un pseudo código ... –

0

Vale la pena echar un vistazo a NPOI cuando se trata de leer/escribir archivos Excel 2003 XLS. NPOI es un salvavidas.

Creo que tendrá que iterar su rango y crear DataRows para poner en su DataTable.

Esta pregunta en StackOverflow proporciona más recursos:

Create Excel (.XLS and .XLSX) file from C#

+0

voy a tener esto en cuenta para futuros proyectos. Por el momento no puedo introducir una nueva biblioteca en nuestra aplicación. – user295197

2

No sé qué tipo de datos que have.But para un conjunto de datos de Excel, como se muestra en este enlace http://www.freeimagehosting.net/image.php?f8d4ef4173.png, puede utilizar el siguiente código para cargar en la tabla de datos.

private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     {   
      DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$"); 
      dataGridView1.DataSource = sheetTable; 
     } 
     catch (Exception Ex) 
     { 
      MessageBox.Show(Ex.Message, ""); 
     } 
    }   

    private OleDbConnection returnConnection(string fileName) 
    { 
     return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); 
    } 

    private DataTable loadSingleSheet(string fileName, string sheetName) 
    {   
     DataTable sheetData = new DataTable(); 
     using (OleDbConnection conn = this.returnConnection(fileName)) 
     { 
      conn.Open(); 
      // retrieve the data using data adapter 
      OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
      sheetAdapter.Fill(sheetData); 
     }       
     return sheetData; 
    } 
+2

Aprecie el código y OLEDB definitivamente lo hace fácil, pero necesito quedarme con la interoperabilidad de Excel por el momento. – user295197

0

Este método no funciona bien cuando la misma columna en la hoja de cálculo de excel contiene texto y números. Por ejemplo, si Range("A3")=Hello y Range("A7")=5 entonces sólo lee Hola y el valor para Range("A7") es DBNULL

private void Form1_Load(object sender, EventArgs e) 
{ 
    try 
    {   
     DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$"); 
     dataGridView1.DataSource = sheetTable; 
    } 
    catch (Exception Ex) 
    { 
     MessageBox.Show(Ex.Message, ""); 
    } 
}   

private OleDbConnection returnConnection(string fileName) 
{ 
    return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); 
} 

private DataTable loadSingleSheet(string fileName, string sheetName) 
{   
    DataTable sheetData = new DataTable(); 
    using (OleDbConnection conn = this.returnConnection(fileName)) 
    { 
     conn.Open(); 
     // retrieve the data using data adapter 
     OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
     sheetAdapter.Fill(sheetData); 
    }       
    return sheetData; 
Cuestiones relacionadas