На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Сравнение листов Excel
    Приветствую.
    Необходимо реализовать сравнение ячеек из листов из 2-х книг Excel (одна книга генерируется программой, другая - эталонная, лежит на диске). В каждой книге по 18 листов. Сейчас у меня такой код:
    ExpandedWrap disabled
              void ExportWorksheets()
              {
                  Excel.Application XL = null;
                  Excel.Workbook WB = null;
                  Excel.Worksheet WS = null;
                  try
                  {
                      XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
                      WB = XL.ActiveWorkbook;
                      //WS = WB.Worksheets;
                      WS = (Excel.Worksheet)WB.Worksheets[1];
                  }
                  catch { }
              }

    Здесь я подключаюсь к запущенному Excel и получаю из него активную книгу и пока только один лист (последняя строка). Вопрос: как получить массив всех 18-ти листов, чтобы потом передать его на обработку для сравнения? И второй вопрос: как сравнивать ячейки листов между собой?
    Спасибо.
      Цитата SunDevil @
      Вопрос: как получить массив всех 18-ти листов

      Worksheets.Count
      Цитата SunDevil @
      как сравнивать ячейки листов между собой

      Worksheets(i).Cells(j, k).Value = Worksheets(i).Cells(j, k).Value (vb.net)
        Цитата coder @
        Worksheets.Count

        Я имел ввиду немного другое. Уже реализовал так:
        ExpandedWrap disabled
                      Excel.Application XL = null;
                      Excel.Workbook WB = null;
                      Excel.Worksheet[] WS = new Excel.Worksheet[19];
                      Excel.Sheets WSS = null;
           
                      try
                      {
                          XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
                          WB = XL.ActiveWorkbook;
                          WSS = WB.Worksheets;
                          for (int i = 1; i <= WB.Worksheets.Count; i++)
                              WS[i] = WSS.get_Item(i) as Excel.Worksheet;
                      }
                      catch { }

        Осталось теперь сравнение покурить...
          Цитата SunDevil @
          Осталось теперь сравнение покурить...

          Какие проблемы?
            coder
            Пока не соображу, как диапазон определить: Cells(j, k).
              Цитата SunDevil @
              Пока не соображу, как диапазон определить: Cells(j, k).

              У Worksheet есть UsedRange и можно обращаться как UsedRange.Rows.Count, UsedRange.Columns.Count
              UsedRange - это используемый диапазон.
                coder
                Спасибо. Сейчас покурю эту темку.
                  Что-то где-то хрень:
                  ExpandedWrap disabled
                            void CompareExcelCells()
                            {
                                bool a;
                                Excel.Worksheet[] wk = new Excel.Worksheet[19];
                                Excel.Worksheet[] wk2 = new Excel.Worksheet[19];
                                for (int i = 1; i < 19; i++)
                                {
                                    wk[i] = ExportWorksheets()[i];
                                    wk2[i] = SampleWorksheets()[i];
                     
                                    for (int j = 1; j <= wk[i].UsedRange.Rows.Count; j++)
                                        for (int k = 1; k <= wk[i].UsedRange.Columns.Count; k++)
                                            if (wk[i].Cells[j,k].ToString() == wk2[i].Cells[j,k].ToString())
                                                a = true;
                                }
                            }

                  UsedRange.Rows.Count и UsedRange.Columns.Count дают какое-то странное количество строк и столбцов. У меня их гораздо больше. Хм...
                    UsedRange всегда дал правильные диапазоны.
                      Колонок он выдал верное число. Сейчас перепроверил. А вот рядов - нет. Он дает 5, а в книге их 36.
                      Сообщение отредактировано: SunDevil -
                        И ещё тут нужно учитывать то, что в начале рядов тоже можеть быть не использованные строки, попробуй проверить с помощью UsedRange.Row
                          Не понял про эту UsedRange.Row. Для чего она нужна?
                            Она определяет начальную строку используемого диапазона:
                            ExpandedWrap disabled
                              for (int j = wk[i].UsedRange.Row; j < wk[i].UsedRange.Row + wk[i].UsedRange.Rows.Count; j++)
                              coder
                              Она была равна 1.
                                Можеш поделиться файлом?
                                Я хотел поэкспериментировать его.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0392 ]   [ 16 queries used ]   [ Generated: 3.05.24, 19:00 GMT ]