在C#中使用Microsoft.Office.Interop.Excel有没有一种方法可以从一行中收集数据,而不必循环通过该行的每个单元格?

4si2a6ki  于 2023-03-20  发布在  C#
关注(0)|答案(1)|浏览(136)

我尝试从excel工作表的每一行收集数据,并将其转换为逗号分隔的字符串,以便使用字典进行比较。
我正在寻找一种方法来收集每一行的数据,而不必遍历每一行的每个单元格,以降低时间复杂性。
是否有办法达到类似以下的效果?

Dictionary<string, int> cwData = new Dictionary<string, int>();
string key = "";
foreach (Range row in cwRange)
{
                
    key = string.Join(",", row.Value);
    cwData.Add(key, row.Row);
    print(key);

}
hgc7kmma

hgc7kmma1#

如果是我,我会使用您正在使用的工具的强大功能来为我完成连接。
这是一个相当简单的示例,需要多做一些工作...

static void ConcatenateRange()
{ 
    var xlApplication = new Microsoft.Office.Interop.Excel.Application();
    var xlWorkbook = xlApplication.Workbooks.Open("C:\\temp\\Data.xlsx");

    try
    {
        var xlWorksheets = xlWorkbook.Worksheets;
        var xlWorksheet = (Worksheet)xlWorksheets.Item[1];

        var lastCell = (Range)xlWorksheet.UsedRange.SpecialCells(XlCellType.xlCellTypeLastCell).Offset[1, 1];
        lastCell.Formula = "=TEXTJOIN(\",\",TRUE,A1:O15)";

        var concatenatedString = lastCell.Value;

        Console.WriteLine(concatenatedString);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        xlWorkbook.Saved = true;

        xlWorkbook.Close();
        xlApplication.Quit();
    }

    Console.ReadLine();
}

......但基本上,它会打开一个工作簿,找到您正在使用的工作表的最后一个单元格,将最后一个单元格偏移1行1列(显然,这是假设整个工作表都没有使用),然后抛出一个TEXTJOIN公式来完成这项工作,而不必循环。
这是工作表...

...这是结果(在控制台输出中)...

最后一点是,它将工作簿的保存状态设置为true,然后简单地关闭它,这样可以确保不进行任何更改。

相关问题