Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
效率。数据表还是工作表?使用互操作C#_C#_Excel_Datatable_Interop - Fatal编程技术网

效率。数据表还是工作表?使用互操作C#

效率。数据表还是工作表?使用互操作C#,c#,excel,datatable,interop,C#,Excel,Datatable,Interop,我在做一个项目,我在寻找效率,我有一个数据表,我可以转换成excel文件,我可以使用Interop处理。我在这个项目中寻找的是添加父亲拥有的所有价值。例如,红细胞数值之父是“COSC-1218-SIT41SCH”。我必须用几千行来做这个 所以,当我尝试在数据表或工作表上进行迭代时,我必须等待10-25分钟,这对我来说太多了。有没有其他方法可以获得这些值?有什么建议吗? 如果你想看代码,我可以发布 这是我的密码 for (int j = 1; j <= usedRange.Rows.Cou

我在做一个项目,我在寻找效率,我有一个数据表,我可以转换成excel文件,我可以使用Interop处理。我在这个项目中寻找的是添加父亲拥有的所有价值。例如,红细胞数值之父是“COSC-1218-SIT41SCH”。我必须用几千行来做这个

所以,当我尝试在数据表或工作表上进行迭代时,我必须等待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;
                        }
                    }
                }
            }
for(int j=1;j Convert.ToInt32(usedRange.Cells[iterador,posNivel2].Value)| | iterador+1==rowsunt)
{
formulaPadre=formulaPadre+”;
encontr=真;
//这是一份关于比索总额和汇率的报告
//colPT es columna比索总计
系统。诊断。调试。
usedRange.Cells[j,colPT]=公式;
System.Diagnostics.Debug.WriteLine(“Cells de Fórmula Padre contine:“+Cells[j,colPT].ToString());
formulaPadre=“”;
}
iterador++;
}
}
其他的
{
//我不是一位牧师,他是一位多面手
系统、诊断、调试、写入线(“无es padre、aplico la otra fórmula”);
//celdapesotal=getCellNamev2(j,i);
celdaCantidad=CellAddress(工作表,j,colCantidadTotal);//getCellNamev2(j,colCantidadTotal);
celdaPesoUnitario=CellAddress(工作表,j,colPU);//getCellNamev2(filaPU,colPU);
formulaHijo=“=”+celdaCantidad+“*”+celdaPesoUnitario;
系统、诊断、调试、写入线(“-”————————————————>La fórmula del Peso第2级总参数es:“+formulaHijo”);
usedRange.Cells[j,colPT]=formulaHijo;
}
}
}
}

您可以简单地为每列创建一个列表,并在列表中迭代,然后简单地检查您要选择的值为nivel2的列表元素x是否在同一索引中具有所需的值

您可以将DataTable转换为具有以下内容的列表

List<string> list = dtusers.AsEnumerable()
                           .Select(r=> r.Field<string>("ColumnName"))
                           .ToList();
List List=dtusers.AsEnumerable()
.Select(r=>r.Field(“ColumnName”))
.ToList();

但是也有很多其他的方法可以将DataTable转换为列表。

您可以简单地为每一列创建一个列表,并通过列表进行迭代,然后简单地检查您想要选择的值为nivel2的列表元素x是否在同一索引处具有所需的值

您可以将DataTable转换为具有以下内容的列表

List<string> list = dtusers.AsEnumerable()
                           .Select(r=> r.Field<string>("ColumnName"))
                           .ToList();
List List=dtusers.AsEnumerable()
.Select(r=>r.Field(“ColumnName”))
.ToList();

但是也有很多其他的方法可以将数据表转换为列表。

显示您的代码。我最初的建议是读取excel文件并将其转换为对象列表(),然后迭代对象列表。当您需要更新excel时,请使用范围而不是每个单元格。@rjs123431谢谢您的回答。使用代码进行后期编辑。我要看看ExcelDataReader!显示您的代码。我最初的建议是读取excel文件并将其转换为对象列表(),然后迭代对象列表。当您需要更新excel时,请使用范围而不是每个单元格。@rjs123431谢谢您的回答。使用代码进行后期编辑。我要看看ExcelDataReader!这可能是个好主意!但是,这个想法是将值放在excel单元格中,那么,一个好主意是否适用于数据表、excel工作表和列表?让我了解您的最终目标。您有一个具有如上所示列的数据表,您只想在excel工作表中插入值,例如在nivel2、nivel1和nivel0中有一个值,并在nivel1和nivel0中只有一个值但在nivel2中没有值的行中排序?这可能是一个好主意!但是,这个想法是将值放在excel单元格中,那么,一个好主意是否适用于数据表、excel工作表和列表?让我了解您的最终目标。您有一个具有如上所示列的数据表,您只想在excel工作表中插入值,例如,在nivel2、nivel1和nivel0中有值,并对nivel1和nivel0中只有值但在nivel2中没有值的行进行排序?