Saltar al contenido

Cómo leer un archivo de Excel en C# sin usar las bibliotecas de Microsoft.Office.Interop.Excel

Bienvenido a nuestra web, en este lugar hallarás la solucíon que necesitas.

Solución:

te lo recomiendo mucho CSharpJExcel para leer archivos Excel 97-2003 (xls) y ExcelPaquete para leer archivos de Excel 2007/2010 (formato Office Open XML, xlsx).

Ambos funcionan perfectamente. No tienen absolutamente ninguna dependencia de nada.

muestra usando CSharpJExcel:

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName));
var sheet = workbook.getSheet(0);
...
var content = sheet.getCell(colIndex, rowIndex).getContents();
...
workbook.close();

muestra usando ExcelPaquete:

using (ExcelPackage xlPackage = new ExcelPackage(existingFile))

  // get the first worksheet in the workbook
  ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
  int iCol = 2;  // the column to read

  // output the data in column 2
  for (int iRow = 1; iRow < 6; iRow++)
    Console.WriteLine("Cell(0,1).Value=2", iRow, iCol, 
      worksheet.Cell(iRow, iCol).Value);

  // output the formula in row 6
  Console.WriteLine("Cell(0,1).Formula=2", 6, iCol, 
    worksheet.Cell(6, iCol).Formula);

 // the using statement calls Dispose() which closes the package.

EDITAR:

Hay otro proyecto, ExcelDataReaderExcelDataReader, que parece tener la capacidad de manejar ambos formatos. También es fácil como los otros que he mencionado.

También hay otras bibliotecas:

  • NPOI: Puerto de la biblioteca Apache POI a .NET:
    Muy potente, gratuito y de código abierto. Además de Excel (97-2010), también admite archivos de Word y PowerPoint.

  • ExcelLibrary:
    Solo admite archivos Excel 97-2003 (xls).

  • EPPlus:
    Una extensión de ExcelPackage. Más fácil de usar (supongo).

var fileName = @"C:ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties="Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text""; ;
using (var conn = new OleDbConnection(connectionString))

    conn.Open();

    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[]  null, null, null, "TABLE" );
    using (var cmd = conn.CreateCommand())
    
        cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";

        var adapter = new OleDbDataAdapter(cmd);
        var ds = new DataSet();
        adapter.Fill(ds);
    

Insto a no usar OleDB, especialmente si se va a ejecutar en un servidor. Es probable que le cueste más a largo plazo; por ejemplo, tuvimos un trabajo de SSIS llamando a un procedimiento almacenado con OleDB leyendo un archivo de Excel en el sptoc y ¡seguimos bloqueando el cuadro de SQL! Saqué las cosas de OleDB del sproc y dejó de fallar el servidor.

Un mejor método que he encontrado es hacerlo con Office 2003 y los archivos XML, con respecto a las Consideraciones para la Automatización de Office del lado del servidor. Nota: Office 2003 es un requisito mínimo para que esto vuele:

Árbitro para leer desde Excel: http://www.roelvanlisdonk.nl/?p=924 (investigue más para encontrar otros ejemplos)

Árbitro para escribir una hoja de cálculo de Excel: http://weblogs.asp.net/jgaylord/archive/2008/08/11/use-linq-to-xml-to-generate-excel-documents.aspx

public void ReadExcelCellTest()
        
            XDocument document = XDocument.Load(@"C:BDATACars.xml");
            XNamespace workbookNameSpace = @"urn:schemas-microsoft-com:office:spreadsheet";

            // Get worksheet
            var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet")
                        where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings")
                        select w;
            List foundWoksheets = query.ToList();
            if (foundWoksheets.Count() <= 0)  throw new ApplicationException("Worksheet Settings could not be found"); 
            XElement worksheet = query.ToList()[0];

            // Get the row for "Seat"
            query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data")
                    where d.Value.Equals("Seat")
                    select d;
            List foundData = query.ToList();
            if (foundData.Count() <= 0)  throw new ApplicationException("Row 'Seat' could not be found"); 
            XElement row = query.ToList()[0].Parent.Parent;

            // Get value cell of Etl_SPIImportLocation_ImportPath setting
            XElement cell = row.Elements().ToList()[1];

            // Get the value "Leon"
            string cellValue = cell.Elements(workbookNameSpace + "Data").ToList()[0].Value;

            Console.WriteLine(cellValue);
        

Sección de Reseñas y Valoraciones

Si conservas algún recelo y capacidad de aclarar nuestro enunciado te insinuamos realizar una disquisición y con gusto lo leeremos.

¡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 *