2016-03-30 19 views
0

"名前"、 "性別"、 "部門"という列を持つ "mySheet"というExcelシートがあります。C#でOffice.Interop.Excelを使用してExcelで特定の列のフィルタリングされた値を取得する

「D」という名前の生徒の名前を取得したいと思います。

Excel.Sheets ExcelSheets = excelWorkBook.Sheets; 
Excel.Worksheet excelWorkSheet = ExcelSheets.get_Item(1); 
Excel.Range excelRange = excelWorkSheet.UsedRange; 
excelRange.AutoFilter(3, "D", Excel.XlAutoFilterOperator.xlAnd, Type.Missing, Type.Missing); 
Excel.Range firstColumn = excelRange.Columns[1]; 
System.Array myvalues = (System.Array)firstColumn.Cells.Value; 
strarrCreateExcel = myvalues.OfType<object>().Select(o => o.ToString()).ToArray(); 
strarrCreateDB = strarrCreateExcel; 
+0

あなたは何か試しましたが、何があなたのアプローチに間違っていますか? – mason

答えて

0

次のコードを試してみてください。:続き

は私のコードです

 private void AutoFilterNames() 
    { 
     xl.Application xlApp = new xl.Application(); 
     xl.Workbooks xlWbks = xlApp.Workbooks; 
     xl.Workbook xlWbk = xlWbks.Open(@"C:\Temp\Book1.xlsx"); 

     xl.Sheets xlSheets = xlWbk.Sheets; 
     xl.Worksheet xlWorkSheet = xlSheets.get_Item(1); 
     xl.Range xlUsedRange = xlWorkSheet.UsedRange; 
     xlUsedRange.AutoFilter(3, "D", xl.XlAutoFilterOperator.xlAnd, Type.Missing, Type.Missing); 

     xl.Range filteredRange = xlUsedRange.SpecialCells(xl.XlCellType.xlCellTypeVisible); 
     var names = new List<string>(); 

     for (int areaId = 2; areaId <= filteredRange.Areas.Count; areaId++) 
     { 
      xl.Range areaRange = filteredRange.Areas[areaId]; 
      object[,] areaValues = areaRange.Value; 
      names.Add(areaValues[1, 1].ToString()); 
     } 

     var namesToArray = names.ToArray(); 
    } 

注:Excelオブジェクトを解放することを忘れないでください。あなたは私の問題を解決するためのコード上で使用here

+0

私はfilteredRange.Areas.Count = 2のみを取得しています..それはなぜですか? フィルタ後に完全なリストが必要です:( – Bh00shan

+0

count = 2を取得すると、フィルタの後に2行しか表示されません。 – ehh

0
xl.Application xlApp = new xl.Application(); 
    xl.Workbooks xlWbks = xlApp.Workbooks; 
    xl.Workbook xlWbk = xlWbks.Open(@"C:\Temp\Book1.xlsx"); 

    xl.Sheets xlSheets = xlWbk.Sheets; 
    xl.Worksheet xlWorkSheet = xlSheets.get_Item(1); 
    xl.Range xlUsedRange = xlWorkSheet.UsedRange; 
    xlUsedRange.AutoFilter(3, "D", xl.XlAutoFilterOperator.xlAnd, Type.Missing, Type.Missing); 

    xl.Range filteredRange = xlUsedRange.SpecialCells(xl.XlCellType.xlCellTypeVisible); 
    var strarrCreateExcel = new List<string>(); 
    foreach (Excel.Range area in filteredRange.Areas) 
     { 
      foreach (Excel.Range row in area.Rows) 
      { 
       if (!strarrCreateExcel.Contains(((Excel.Range)row.Cells[1, 1]).Text)) 
        strarrCreateExcel.Add(((Excel.Range)row.Cells[1, 1]).Text); 
      } 
     } 

から助けを得ることができます。

関連する問題