Saltar al contenido

¿Cómo importo desde Excel a un DataSet usando Microsoft.Office.Interop.Excel?

Esta es el arreglo más exacta que encomtrarás dar, pero mírala detenidamente y analiza si se puede adaptar a tu trabajo.

Solución:

¿Qué pasa con el uso de Excel Data Reader (anteriormente alojado aquí) un proyecto de código abierto en codeplex? Me funciona muy bien exportar datos de hojas de Excel.

El código de muestra dado en el enlace especificado:

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())

//excelReader.GetInt32(0);


//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();

ACTUALIZAR

Después de buscar, encontré este artículo: Lectura más rápida de MS Excel usando Office Interop Assemblies. El artículo solo usa Office Interop Assemblies para leer datos de una hoja de Excel determinada. El código fuente del proyecto también está ahí. Supongo que este artículo puede ser un punto de partida sobre lo que intenta lograr. Mira si eso ayuda

ACTUALIZACIÓN 2

El siguiente código toma un excel workbook y lee todos los valores encontrados, para cada excel worksheet dentro de excel workbook.

private static void TestExcel()
    
        ApplicationClass app = new ApplicationClass();
        Workbook book = null;
        Range range = null;

        try
        
            app.Visible = false;
            app.ScreenUpdating = false;
            app.DisplayAlerts = false;

            string execPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

            book = app.Workbooks.Open(@"C:data.xls", Missing.Value, Missing.Value, Missing.Value
                                              , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                                             , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                                            , Missing.Value, Missing.Value, Missing.Value);
            foreach (Worksheet sheet in book.Worksheets)
            

                Console.WriteLine(@"Values for Sheet "+sheet.Index);

                // get a range to work with
                range = sheet.get_Range("A1", Missing.Value);
                // get the end of values to the right (will stop at the first empty cell)
                range = range.get_End(XlDirection.xlToRight);
                // get the end of values toward the bottom, looking in the last column (will stop at first empty cell)
                range = range.get_End(XlDirection.xlDown);

                // get the address of the bottom, right cell
                string downAddress = range.get_Address(
                    false, false, XlReferenceStyle.xlA1,
                    Type.Missing, Type.Missing);

                // Get the range, then values from a1
                range = sheet.get_Range("A1", downAddress);
                object[,] values = (object[,]) range.Value2;

                // View the values
                Console.Write("t");
                Console.WriteLine();
                for (int i = 1; i <= values.GetLength(0); i++)
                
                    for (int j = 1; j <= values.GetLength(1); j++)
                    
                        Console.Write("0t", values[i, j]);
                    
                    Console.WriteLine();
                
            

        
        catch (Exception e)
        
            Console.WriteLine(e);
        
        finally
        
            range = null;
            if (book != null)
                book.Close(false, Missing.Value, Missing.Value);
            book = null;
            if (app != null)
                app.Quit();
            app = null;
        
    

En el código anterior, values[i, j] es el valor que necesita agregar a la dataset. i denota la fila, mientras que, j denota la columna.

¿Has visto este? De http://www.aspspider.com/resources/Resource510.aspx:

public DataTable Import(String path)

    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Workbook workBook = app.Workbooks.Open(path, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0);

    Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.ActiveSheet;

    int index = 0;
    object rowIndex = 2;

    DataTable dt = new DataTable();
    dt.Columns.Add("FirstName");
    dt.Columns.Add("LastName");
    dt.Columns.Add("Mobile");
    dt.Columns.Add("Landline");
    dt.Columns.Add("Email");
    dt.Columns.Add("ID");

    DataRow row;

    while (((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 1]).Value2 != null)
    

        row = dt.NewRow();
        row[0] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 1]).Value2);
        row[1] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 2]).Value2);
        row[2] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 3]).Value2);
        row[3] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 4]).Value2);
        row[4] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 5]).Value2);
        index++;

        rowIndex = 2 + index;
        dt.Rows.Add(row);
    
    app.Workbooks.Close();
    return dt;

object[,] valueArray = (object[,])excelRange.get_Value(XlRangeValueDataType.xlRangeValueDefault);

//Get the column names
for (int k = 0; k < valueArray.GetLength(1); )

    //add columns to the data table.
    dt.Columns.Add((string)valueArray[1,++k]);


//Load data into data table
object[] singleDValue = new object[valueArray.GetLength(1)];
//value array first row contains column names. so loop starts from 1 instead of 0
for (int i = 1; i < valueArray.GetLength(0); i++)

    Console.WriteLine(valueArray.GetLength(0) + ":" + valueArray.GetLength(1));
    for (int k = 0; k < valueArray.GetLength(1); )
    
        singleDValue[k] = valueArray[i+1, ++k];
    
    dt.LoadDataRow(singleDValue, System.Data.LoadOption.PreserveChanges);

Nos encantaría que puedieras dar recomendación a esta división si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *