2010-10-14 2 views
0

Я пытаюсь написать приложение, которое откроет электронную таблицу Excel, чтобы найти рабочий лист с правильным именем и выполнить итерацию по строкам, пока не найду ячейку в столбце 0, которая содержит текст «Дата окончания », а затем прочитайте до тех пор, пока я не найду первую пустую ячейку (колонка 0 также). Я зацикливаюсь на том, как перебирать строки.Поиск и извлечение данных из Excel

Вот что я до сих пор:

public static void LoadFromFile(FileInfo fi) 
{ 
    Application ExcelObj = new Application(); 

    if (ExcelObj != null) 
    { 
     Workbook wb = ExcelObj.Workbooks.Open(fi.FullName, 
      Type.Missing, true, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing); 

     Sheets sheets = wb.Worksheets; 

     foreach (Worksheet ws in sheets) 
     { 
      if (ws.Name == "Raw Data") 
       LoadFromWorkSheet(ws); 
     } 

     wb.Close(false, Type.Missing, Type.Missing); 
    } 
} 

public static void LoadFromWorkSheet(Worksheet ws) 
{ 
    int start = 0; 
    int end = 0; 

    // Iterate through all rows at column 0 and find the cell with "Cont Date" 
} 

Видимо, вы не можете

foreach(Row row in worksheet.Rows) 
{ 

} 

EDIT ::

То, что я сделал это:

for (int r = 0; r < 65536; r++) 
{ 
    string value = ws.Cells[r, 0].Value; 
} 

Что дает мне следующий exce ption при попытке прочитать значение ячейки:

Exception from HRESULT: 0x800A03EC 
+1

Нет, это должно быть ws.Cells [r, 1]. Столбцы начинаются с 1 –

ответ

2

Вы можете использовать свойство Cells и поскольку столбцы начинаются с 1, я думаю, что вы имели в виду колонку 1:

int contDateRow=0; 
int firstBlankRowAfterContDate=0; 

for (int row=1;row<=woksheet.Rows.Count;++row) 
    if (worksheet.Cells[row,1].Value=="Cont Date") 
    { 
    contDateRow=row; 
    break; 
    } 

if (contDateRow!=0) 
{ 
    for (int row=contDateRow;row<=woksheet.Rows.Count;++row) 
    if (worksheet.Cells[row,1].Value=="") 
    { 
     firstBlankRowAfterContDate=row; 
     break; 
    } 
} 

// Do something with contDateRow and firstBlankRowAfterContDate... 
+0

См. Редактирование в OP относительно исключения, которое я получаю: –

1

Окей ... A несколько вещей ...

Прежде всего, сделайте себе «Range» для работы. Для ваших целей, попробуйте следующее:

Microsoft.Office.Interop.Excel range = worksheet.get_Range("A1"); 

Теперь, когда у вас есть выбор, вы можете найти степень каждого столбца и строки с помощью функции, например, так:

private Point GetSheetBounds(Excel.Range range) 
{ 
    int maxY = range.get_End(Excel.XlDirection.xlDown).Row; 
    int maxX = range.get_End(Excel.XlDirection.xlToRight).Column; 

    return new Point(maxX, maxY); 
} 

Это покажет вам, как далеко вы должны зацикливаться, чтобы вы не шли от 0 до бесконечности. : P

Теперь вы можете сделать что-то вроде этого Переберите строк в столбцах:

for (int i = 1; i < this.GetSheetBounds(range).Y; i++) //i = 1 because Excel doesn't use zero-based indexes 
{ 
    if (range[i, 1] != null && range[i, 1].Value != null && range[i, 1].Value == "Cont Date") 
    { 
     //do whatever you need to do 
    } 
} 

Наконец, как вы используете COM, убедитесь, что вы располагаете ВСЕ вы создаете с функцией вида например:

private void ReleaseObject(object obj) 
{ 
    if (obj != null) 
    { 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
     obj = null; 
     GC.Collect(); 
    } 
} 
Смежные вопросы