C#如何改进Excel单元格的循环填充

本文关键字:循环 填充 单元格 Excel 何改进 | 更新日期: 2023-09-27 18:28:55

我主要解析文本文件中的大量文本,然后将其填充到excel中。

//populate into worksheet
for (int x = 0; x < rawLine.Length; x++)
{
    string[] tempLine = rawLine[x].Split(';');
    for (int y = 0; y < tempLine.Length; y++)
    {
        DateTime hour = Convert.ToDateTime(tempLine[6]);                            
        xlWorkSheet.Cells[y + 2, 1] = tempLine[0];
        xlWorkSheet.Cells[y + 2, 2] = tempLine[1];
        xlWorkSheet.Cells[y + 2, 3] = tempLine[2];
        xlWorkSheet.Cells[y + 2, 4] = tempLine[3];
        xlWorkSheet.Cells[y + 2, 5] = tempLine[4];
        xlWorkSheet.Cells[y + 2, 6] = tempLine[5];
        xlWorkSheet.Cells[y + 2, 7] = tempLine[6];
        xlWorkSheet.Cells[y + 2, 8] = tempLine[7];
        xlWorkSheet.Cells[y + 2, 9] = tempLine[8];
        xlWorkSheet.Cells[y + 2, 10] = tempLine[9];
        xlWorkSheet.Cells[y + 2, 11] = tempLine[10];
        xlWorkSheet.Cells[y + 2, 12] = hour.Hour;
        xlWorkSheet.Cells[y + 2, 13] = tempLine[8] == "0" ? "SAME" : tempLine[9];
    }
    Console.WriteLine("Current line = " + x + "'n");
}

目前,这段代码是有效的,但它花费的时间太长了。有没有办法加快速度?我做了一些搜索,但没有找到什么具体的。

提前谢谢。

C#如何改进Excel单元格的循环填充

这可能是一个非常小的改进,但这一行:

DateTime hour = Convert.ToDateTime(tempLine[6]);

应该移动到y循环之外,因为它不依赖于它。

除此之外,您可能应该研究某种方法来同时设置多个单元格——大部分时间可能都花在了往返Excel上。(看起来这是@Gusman在评论中的建议)。

@莫希特的答案也很好,因为它更短、更简单。

您可以尝试:

//populate into worksheet
DateTime hour;
string[] tempLine;
StringBuilder output = new StringBuilder();
for (int x = 0; x < rawLine.Length; x++)
{
    tempLine = rawLine[x].Split(';');    
    for (int y = 0; y < tempLine.Length; y++)
    {
        hour = Convert.ToDateTime(tempLine[6]);                            
        xlWorkSheet.Cells[y + 2, 1] = tempLine[0];
        xlWorkSheet.Cells[y + 2, 2] = tempLine[1];
        xlWorkSheet.Cells[y + 2, 3] = tempLine[2];
        xlWorkSheet.Cells[y + 2, 4] = tempLine[3];
        xlWorkSheet.Cells[y + 2, 5] = tempLine[4];
        xlWorkSheet.Cells[y + 2, 6] = tempLine[5];
        xlWorkSheet.Cells[y + 2, 7] = tempLine[6];
        xlWorkSheet.Cells[y + 2, 8] = tempLine[7];
        xlWorkSheet.Cells[y + 2, 9] = tempLine[8];
        xlWorkSheet.Cells[y + 2, 10] = tempLine[9];
        xlWorkSheet.Cells[y + 2, 11] = tempLine[10];
        xlWorkSheet.Cells[y + 2, 12] = hour.Hour;
        xlWorkSheet.Cells[y + 2, 13] = tempLine[8] == "0" ? "SAME" : tempLine[9];
    }    
    output.AppendLine("Current line = " + x);
}
Console.WriteLine(output.ToString());

可能只是为了改进循环,您可以这样写。这不会提高性能,但看起来会更干净。

for (int x = 0; x < rawLine.Length; x++)
{
    string[] tempLine = rawLine[x].Split(';');
    for (int y = 0; y < tempLine.Length; y++)
    {
        DateTime hour = Convert.ToDateTime(tempLine[6]);
        for(int z=0; z<11; z++)
        {
            xlWorkSheet.Cells[y + 2, (z+1)] = tempLine[z];
        }
        xlWorkSheet.Cells[y + 2, 12] = hour.Hour;
        xlWorkSheet.Cells[y + 2, 13] = tempLine[8] == "0" ? "SAME" : tempLine[9];
    }
    Console.WriteLine("Current line = " + x + "'n");
}