C# - Convertir una lista de filas de Excel en un rango

Tengo un programa C# que estoy creando como un programa de paresing. Una sección del código tira en una lista de filas en un archivo Excel que no tienen un valor particular en una columna en particular. Entonces iba a usar un bucle de anteceso para buclear a través de cada una de esas filas y eliminarlas, sin embargo, está tomando bastante tiempo para recorrer cada una de esas filas. Y hay múltiples pestañas que necesito para ejecutar esto.

Así que mi pensamiento estaba convirtiendo la lista de filas de Excel en un rango y luego simplemente borrar ese rango. ¿Es posible convertir esa lista de filas en un rango de Excel? A continuación está el fragmento de código:

                XLWorkbook wb = new XLWorkbook(Path.Combine(Destination, fName) + ".xlsx");
                IXLWorksheet ws = wb.Worksheet(SheetName);

                var range = ws.RangeUsed();
                var table = range.AsTable();

                var cell = table.HeadersRow().CellsUsed(c => c.Value.ToString() == ColName).FirstOrDefault();

                //Gets the column letter for use in next section
                string colLetter = cell.WorksheetColumn().ColumnLetter();

                //Create list of rows that DO NOT contain the inv number being searched
                //This is the list I would like to convert to a range to speed up the delete          
                List deleterows = ws
                    .Column(colLetter)
                    .CellsUsed(c => c.Value.ToString() != i)
                    .Select(c => c.WorksheetRow()).ToList();

                //Deletes the header row so that isn't removed
                deleterows.RemoveAt(0);

                foreach (IXLRow x in deleterows)
                {
                    x.Delete();
                }

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codexcrafter


3 Respuestas:

  • Ahora mismo cada iteración comprueba el valor de la célula accediendo a esa célula en el archivo. Eso lleva mucho tiempo.

    Lea todos los datos de una hoja en un array y hacer toda la iteración en el array. Eso será una magnitud más rápida.

    Dado que desea analizar datos, sugiero que utilice ese array para cualquier otra operación que desee hacer y que sólo lo escriba de nuevo a un archivo cuando haya terminado. (Si su resultado se almacena en Excel de nuevo, asegúrese de escribir todo el array de una vez como un rango).

    Respondida el Dec 17, 2020 a las 21:57 - por geekglitcher

    Votos positivos: 0 | Votos negativos: 0

  • Para convertir la lista de filas en un rango de Excel y luego borrar ese rango, puedes hacer lo siguiente en tu código:

    csharp
    // Convertir la lista de filas en un rango
    IXLRange deleteRange = ws.Range(string.Format("{0}:{1}", deleterows.First().RowNumber(), deleterows.Last().RowNumber()));
    
    // Borrar el rango
    deleteRange.Delete(XLShiftDeletedCells.ShiftCellsUp);
    

    Con este código, estás creando un rango que cubre todas las filas que deseas eliminar y luego simplemente lo borras de una sola vez.

    Este enfoque debería ser más eficiente que borrar cada fila individualmente en un bucle.

    Respondida el Dec 18, 2020 a las 21:59 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, es posible convertir una lista de filas de Excel en un rango. Puedes utilizar el método IXLWorksheet.Rows(IXLRange range) para crear un nuevo rango a partir de un rango existente.

    Para convertir tu lista de filas en un rango, puedes utilizar el siguiente código:

    csharp
    var range = ws.Rows(deleterows);
    

    Esto creará un nuevo rango llamado range que contiene las filas especificadas en deleterows.

    A continuación, puedes eliminar el rango utilizando el método IXLRange.Delete().

    csharp
    range.Delete();
    

    Esto eliminará todas las filas del rango, lo que debería ser mucho más rápido que eliminarlas una a una.

    Ten en cuenta que también puedes utilizar el método IXLWorksheet.DeleteRows(IXLRange range) para eliminar filas de una hoja de cálculo. Sin embargo, este método no devuelve un rango, por lo que no podrás utilizarlo para eliminar filas de una lista existente de filas.

    Respondida el Dec 18, 2020 a las 22:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0