Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.171.180] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Приветствую.
Необходимо реализовать сравнение ячеек из листов из 2-х книг Excel (одна книга генерируется программой, другая - эталонная, лежит на диске). В каждой книге по 18 листов. Сейчас у меня такой код: 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-ти листов, чтобы потом передать его на обработку для сравнения? И второй вопрос: как сравнивать ячейки листов между собой? Спасибо. |
Сообщ.
#2
,
|
|
|
Цитата SunDevil @ Вопрос: как получить массив всех 18-ти листов Worksheets.Count Цитата SunDevil @ как сравнивать ячейки листов между собой Worksheets(i).Cells(j, k).Value = Worksheets(i).Cells(j, k).Value (vb.net) |
Сообщ.
#3
,
|
|
|
Цитата coder @ Worksheets.Count Я имел ввиду немного другое. Уже реализовал так: 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 { } Осталось теперь сравнение покурить... |
Сообщ.
#4
,
|
|
|
Цитата SunDevil @ Осталось теперь сравнение покурить... Какие проблемы? |
Сообщ.
#5
,
|
|
|
coder
Пока не соображу, как диапазон определить: Cells(j, k). |
Сообщ.
#6
,
|
|
|
Цитата SunDevil @ Пока не соображу, как диапазон определить: Cells(j, k). У Worksheet есть UsedRange и можно обращаться как UsedRange.Rows.Count, UsedRange.Columns.Count UsedRange - это используемый диапазон. |
Сообщ.
#7
,
|
|
|
coder
Спасибо. Сейчас покурю эту темку. |
Сообщ.
#8
,
|
|
|
Что-то где-то хрень:
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 дают какое-то странное количество строк и столбцов. У меня их гораздо больше. Хм... |
Сообщ.
#9
,
|
|
|
UsedRange всегда дал правильные диапазоны.
|
Сообщ.
#10
,
|
|
|
Колонок он выдал верное число. Сейчас перепроверил. А вот рядов - нет. Он дает 5, а в книге их 36.
|
Сообщ.
#11
,
|
|
|
И ещё тут нужно учитывать то, что в начале рядов тоже можеть быть не использованные строки, попробуй проверить с помощью UsedRange.Row
|
Сообщ.
#12
,
|
|
|
Не понял про эту UsedRange.Row. Для чего она нужна?
|
Сообщ.
#13
,
|
|
|
Она определяет начальную строку используемого диапазона:
for (int j = wk[i].UsedRange.Row; j < wk[i].UsedRange.Row + wk[i].UsedRange.Rows.Count; j++) |
Сообщ.
#14
,
|
|
|
coder
Она была равна 1. |
Сообщ.
#15
,
|
|
|
Можеш поделиться файлом?
Я хотел поэкспериментировать его. |