c# - poner - numerar celdas en excel con condiciones
Método eficiente para enumerar celdas en un libro de Excel usando c# (4)
¿Cuál es la forma más eficiente de enumerar cada celda en cada hoja en un libro de trabajo?
El método siguiente parece funcionar razonablemente para un libro de trabajo con ~ 130,000 celdas. En mi máquina, tomó ~ 26 segundos abrir el archivo y ~ 5 segundos para enumerar las celdas. Sin embargo, no soy experto en Excel y quería validar este fragmento de código con la comunidad en general.
DateTime timer = DateTime.Now;
Microsoft.Office.Interop.Excel.Application excelApplication = new Microsoft.Office.Interop.Excel.Application();
try
{
exampleFile = new FileInfo(Path.Combine(System.Environment.CurrentDirectory, "Large.xlsx"));
excelApplication.Workbooks.Open(exampleFile.FullName, false, false, missing, missing, missing, true, missing, missing, true, missing, missing, missing, missing, missing);
Console.WriteLine(string.Format("Took {0} seconds to open file", (DateTime.Now - timer).Seconds.ToString()));
timer = DateTime.Now;
foreach(Workbook workbook in excelApplication.Workbooks)
{
foreach(Worksheet sheet in workbook.Sheets)
{
int i = 0, iRowMax, iColMax;
string data = String.Empty;
Object[,] rangeData = (System.Object[,]) sheet.UsedRange.Cells.get_Value(missing);
if (rangeData != null)
{
iRowMax = rangeData.GetUpperBound(0);
iColMax = rangeData.GetUpperBound(1);
for (int iRow = 1; iRow < iRowMax; iRow++)
{
for(int iCol = 1; iCol < iColMax; iCol++)
{
data = rangeData[iRow, iCol] != null ? rangeData[iRow, iCol].ToString() : string.Empty;
if (i % 100 == 0)
{
Console.WriteLine(String.Format("Processed {0} cells.", i));
}
i++;
}
}
}
}
workbook.Close(false, missing, missing);
}
Console.WriteLine(string.Format("Took {0} seconds to parse file", (DateTime.Now - timer).Seconds.ToString()));
}
finally
{
excelApplication.Workbooks.Close();
excelApplication.Quit();
}
Editar :
Merece la pena mencionar que quiero usar PIA e interoperabilidad para acceder a las propiedades de los libros de Excel que no están expuestos por las API que trabajan directamente con el archivo de Excel.
Creo que esta es la forma más eficiente, ¿cómo hacerlo con PIA? Tal vez little bitbit más rápido utilizando "foreach" insinuado de "para", pero no cambiará dramáticamente.
Si su principal objetivo es la eficiencia, debería trabajar directamente con archivos de Excel, sin la aplicación de Excel.
Excel PIA Interop es realmente lento cuando estás haciendo cosas celda por celda.
Debe seleccionar el rango que desea extraer, como lo hizo con la propiedad Worksheet.UsedRange
y luego leer el valor de todo el rango en un solo paso, invocando get_Value()
(o simplemente leyendo la propiedad Value
o Value2
, I no recuerdo cuál) en él.
Esto producirá un object[,]
, es decir, una matriz bidimensional, que se puede enumerar fácilmente y se puede leer rápidamente.
EDITAR : Acabo de leer su código real y me di cuenta de que realmente hace lo que propuse. Lástima de mí por no leer la pregunta correctamente antes de responder. En ese caso, no puedes hacerlo mucho más rápido. Excel PIA Interop es lento. Si necesita una solución más rápida, deberá migrar jExcelApi de Java a C # (algo que no es muy difícil de hacer) o usar algún componente comercial. Sugiero evitar la interfaz OLEDB a toda costa, para mantener la cordura.
Consejo no relacionado, pero útil: ¿Deberías usar el ?? operador. Es realmente útil. En lugar de
data = rangeData[iRow, iCol] != null ? rangeData[iRow, iCol].ToString() : string.Empty;
solo podrías escribir
data = Convert.ToString(rangeData[iRow, iCol]) ?? string.Empty;
En ese caso, incluso String.Empty no es necesario ya que Convert.ToString (object) convierte null
en una cadena vacía de todos modos.
Hay una implementación de código abierto de un lector y escritor de Excel llamado Koogra . Le permite leer en el archivo de Excel y modificarlo usando un código administrado puro. Esto probablemente sería mucho más rápido que el código que está usando ahora.
Para obtener más información sobre Para cada enumerador de bucles (Foreach ADO.NET Schema Rowset Enumerator usando Excel Sheets) y el servicio de integración de programación (SSIS) usando C # .Net y VB .Net, visite el siguiente enlace: http: //www.sqllion. com / 2009/06 / programming-foreach-loop-container-% e2% 80% 93-enumerating-excel-sheets /