【问题标题】:How to iterate through Excel Worksheets only extracting data from specific columns如何迭代Excel工作表仅从特定列中提取数据
【发布时间】:2013-04-22 21:21:43
【问题描述】:

如何遍历具有多个工作表的 Excel 工作簿,仅从“C”、“E”和“F”列中提取数据?

这是我到目前为止的代码:

public static string ExtractData(string filePath)
    {
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook workBook = excelApp.Workbooks.Open(filePath);

        string data = string.Empty;

        int i = 0;
        foreach (Excel.Worksheet sheet in workBook.Worksheets)
        {
            data += "*******   Sheet " + i++.ToString() + "   ********\n";

            //foreach (Excel.Range row in sheet.UsedRange.Rows)
            //{
            //    data += row.Range["C"].Value.ToString();
            //}

            foreach (Excel.Range row in sheet.UsedRange.Rows)
            {
                foreach (Excel.Range cell in row.Columns)
                {
                    data += cell.Value + "   ";
                }
                data += "\n";
            }
        }

        excelApp.Quit();

        return data;
    }

非常感谢您的宝贵时间,感谢您提供任何帮助。

【问题讨论】:

    标签: c# excel .net-4.0 excel-interop


    【解决方案1】:

    编辑你的方法,这里应该做你正在寻找的东西:

    public static string ExtractData(string filePath)
    {
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook workBook = excelApp.Workbooks.Open(filePath);
        int[] Cols = { 3, 5, 6 }; //Columns to loop
                     //C, E, F
        string data = string.Empty;
    
        int i = 0;
        foreach (Excel.Worksheet sheet in workBook.Worksheets)
        {
            data += "*******   Sheet " + i++.ToString() + "   ********\n";
    
            foreach (Excel.Range row in sheet.UsedRange.Rows)
            {
                foreach (int c in Cols) //changed here to loop through columns
                {
                    data += sheet.Cells[row.Row, c].Value2.ToString() + "   ";
                }
                data += "\n";
            }
        }
    
        excelApp.Quit();
    
        return data;
    }
    

    我创建了一个 int 数组来指示您要读取的列,然后在每一行上我们只是循环遍历数组。

    HTH, Z

    【讨论】:

    • 谢谢。像魅力一样工作。
    【解决方案2】:

    例如,您可以使用类似的方法来获取 C 列:

    var numberOfRows = sheet.UsedRange.Columns[3, Type.Missing].Rows.Count;
    var values = sheet.Range["C1:C" + numberOfRows].Value2;
    

    numberOfRows 保存工作表中的行数(我认为它不会跳过顶部的空白行,不确定)。之后,您选择从 C1 到 CN 的范围并获取包含这些值的 Value2。请注意,值数组实际上是一个二维数组。您现在可以轻松地执行 for 循环来获取项目:

    for (int i = 1; i <= values.Length; i++){
       sb.Append(values[i, 1] + " ");
    }
    

    这可以在列彼此相邻的情况下进行优化,但上面的代码应该可以帮助您入门。

    【讨论】:

    • sheet.UsedRange.Columns[3, Type.Missing].Rows.Count; 我没有选择.Rows... 只是ToString() 知道为什么以及如何解决它吗?
    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多