[英]Java Equivalent of C#'s Action Type in terms of efficiency. Java 8 or Pre-Java 8?
[英]Efficiency. DataTable or Worksheet? Using interop C#
我正在处理一个项目,我正在寻找效率,我有一个DataTable,我可以在 excel 文件中转换它,我可以使用 Interop 进行处理。 我在这个项目中寻找的是添加父亲拥有的所有价值观。 例如,红细胞中的值的父亲是“ COSC-1218-SIT41SCH ”。 我必须用数千行来做到这一点......
因此,当我尝试在DataTable或Worksheet 上进行迭代时,我必须等待 10-25 分钟,这对我来说已经很多了。 有没有另一种方法来获得这些值? 有什么推荐吗? 如果你想看代码,我可以发布它。
这是我的代码
for (int j = 1; j <= usedRange.Rows.Count; j++)
{
for (int i = 1; i <= usedRange.Columns.Count; i++)
{
if (Convert.ToString(usedRange.Cells[j, i].Value) == "Peso Total")
{
colPT = i;
}
if (Convert.ToString(usedRange.Cells[j, i].Value) == "Peso Unitario")
{
colPU = i;
filaPU = j;
}
if (Convert.ToString(usedRange.Cells[j, i].Value) == "Cantidad Total")
{
colCantidadTotal = i;
}
if (j > 1)
{
System.Diagnostics.Debug.WriteLine(" Obteniendo nivel actual ... ");
//almaceno en lact el nivel de la celda actual
lact = Convert.ToInt32(usedRange.Cells[j,posNivel2].Value());
System.Diagnostics.Debug.WriteLine(" Nivel actual obtenido, es: " + lact);
}
//almaceno el valor de la celda actual en valCel
valCel = Convert.ToString(usedRange.Cells[j, i].Value);
//Obtengo la dirección de la celda actual, por ejemplo Q7
dirCelda = CellAddress(Worksheet, j, i);
System.Diagnostics.Debug.WriteLine("******* Exportando a Excel, el valor actual de la celda es: | info pruebas ValCell contiene -> " + valCel + " y la dirección es: " + rng.Address + " la j fila es: " + j + " y la i columna es: " + i + " -------- " + dirCelda + " el límite de columnas es : " + usedRange.Columns.Count + " y de filas es: " + usedRange.Rows.Count);
xz = Convert.ToString(usedRange.Cells[j+1,posNivel2].Value);
System.Diagnostics.Debug.WriteLine(" Probaaaaaaaaando, posnivel es: " + posNivel2 + " y xz contiene: " + xz);
//bucle Peso Total, j diferente a 1 para no acceder a la cabecera y no sobrepasar las filas con j+1
if (j!=1 && j + 1 < usedRange.Rows.Count)
{
System.Diagnostics.Debug.WriteLine(" === CheckPnt 0: ");
if (Convert.ToInt32(usedRange.Cells[j + 1,posNivel2].Value) < usedRange.Rows.Count)
{
//Obtengo el nivel de la siguiente fila
levelmas = Convert.ToInt32(usedRange.Cells[j + 1,posNivel2].Value);
System.Diagnostics.Debug.WriteLine(" === CheckPnt 1, levelactual es: " + lact + " levelmas:" + levelmas + " J es:" + j + " y RowCounts es " + usedRange.Rows.Count);
}
//si el nivel actual más 1 es igual al nivel de la fila siguiente y no se supera el límite de filas
if ((lact + 1) == levelmas && j + 1 < usedRange.Rows.Count)
{
System.Diagnostics.Debug.WriteLine(" === CheckPnt 2: ");
dirCelda = CellAddress(Worksheet, j, i);
formulaPadre = "=(";
int iterador = j + 1;
bool encontr = false;
//se crea iterador y se recorren las filas hasta que se encuentre una del mismo nivel
while (iterador < usedRange.Rows.Count && !encontr)
{
System.Diagnostics.Debug.WriteLine(" === Bucle While");
//si la siguiente fila tiene un nivel más que el padre se añade la celda
if ((lact + 1) == Convert.ToInt32(usedRange.Cells[iterador,posNivel2].Value))
{
System.Diagnostics.Debug.WriteLine(" === CheckPnt 3: ");
//si quiero quitar el primer + evaluar si es el primero
formulaPadre = formulaPadre + "+" + CellAddress(Worksheet, iterador, colPT); // getCellNamev2(iterador, colPT);
}
//si se encuentra una fila con el mismo nivel se para y se añade el paréntesis final
if ((lact + 1) > Convert.ToInt32(usedRange.Cells[iterador,posNivel2].Value) || iterador + 1 == RowsCount)
{
formulaPadre = formulaPadre + ")";
encontr = true;
//si encontrado encontes almaceno la fórmula en la columna peso total y reinicio fórmula
//colPT es columna Peso Total
System.Diagnostics.Debug.WriteLine(" Fin hijos se añade el último paréntesis y la fórmula es: " + formulaPadre);
usedRange.Cells[j, colPT] = formulaPadre;
System.Diagnostics.Debug.WriteLine("Cells de Fórmula Padre contine: " + Cells[j,colPT].ToString());
formulaPadre = "";
}
iterador++;
}
}
else
{
//Si no es padre se múltiplica cantidad x Peso Unitario
System.Diagnostics.Debug.WriteLine(" NO es padre, aplico la otra fórmula");
//celdaPesoTotal = getCellNamev2(j, i);
celdaCantidad = CellAddress(Worksheet, j, colCantidadTotal); //getCellNamev2(j, colCantidadTotal);
celdaPesoUnitario = CellAddress(Worksheet, j, colPU); //getCellNamev2(filaPU, colPU);
formulaHijo = "=" + celdaCantidad + "*" + celdaPesoUnitario;
System.Diagnostics.Debug.WriteLine(" -__--__-----> La fórmula del Peso Total para el level 2 es: " + formulaHijo);
usedRange.Cells[j, colPT] = formulaHijo;
}
}
}
}
您可以简单地为每一列创建一个 List<> 并遍历列表,然后简单地检查您的列表元素 x 是否与您想要选择的 nivel2 的值在同一索引处具有您想要的值。
您可以将您的 DataTable 转换为类似的列表
List<string> list = dtusers.AsEnumerable()
.Select(r=> r.Field<string>("ColumnName"))
.ToList();
但是还有很多其他的可能性可以将 DataTable 转换为列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.