Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить конец документа? [D6]


Страницы:   1 2

V l a d i m i r ©   (2004-08-12 11:40:00) 

Доброго всем дня! Уже вторую неделю ломаю голову над этим вопросом… Собственно, как получить информацию из документа я знаю. Например, я делаю это следующим образом: информация хранится в первом листе документа Excel, и доступ к ячейкам в упрощенном виде можно показать на следующем примере: размещаю на форме компонент типа TexcelApplication (Name: XLApp, свойство ConnectKind: ckNewInstance):

procedure TForm1.Button1Click(Sender: TObject);
var
 WorkBook, Sheet: Variant;
 FileLocate: WideString;
 Info: String;
Begin
XLApp.Connect;
FileLocate := 'C:\1.xls';

//Открываю файл Excel
XLApp.WorkBooks.Open(FileLocate, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,EmptyParam,0);

//Открываю книгу и обращаюсь к первому листу
WorkBook := XLApp.WorkBooks.Item[1];
Sheet:=XLApp.Application.Worksheets.Item[1];

//Читаю вторую строку и второй столбец, т.е ячейку, содержащую любую информацию
Info:=Sheet.Cells[2,2];

ShowMessage(Info);

End;


Таким образом, в первом листе документа заполнена только ячейка со вторым столбцом и второй строкой. Следовательно, конец документа – вторая строка… Как можно определить, конец документа? То есть получить последнюю строку, после которой документ пуст?


46_55_41_44   (2004-08-13 13:14:00) [1]

http://www.kornjakov.ru/stat.htm


Skyle   (2004-08-13 12:56:00) [2]


> все ячейки до бесконечности

Если я не ошибаюсь не до бесконечности, а до 65 535.


V l a d i m i r   (2004-08-13 12:42:00) [3]

Нет, поиск первой пустой строки не подходит, т.к. между отдельными статьями есть пустые строки. Это не выход. Единственное, что я вижу реальным - это проверка на наличие в ячейке числа. Но не буду же я проверять, например во втором столбце, все ячейки до бесконечности? Поэтому необходимо знать, где же конец документа: номер последней строки!


Skyle   (2004-08-13 08:41:00) [4]


>  [20] menart ©   (13.08.04 08:37)

???
А это здесь при чём?
Что должен сказать воспитанный компилятор на
var V : Variant;
begin
 V.DoSomeMethod;

Праально, сказать, чтобы тот, кто это придумал, шёл читать книжки, что и было продемонстрировано.


menart   (2004-08-13 08:37:00) [5]


> V l a d i m i r   (12.08.04 23:00) [17]
> Не-а, не получилось. Во-первых, на app:=CreateOleObject('Excel.Application');
> компилятор ругается, а если сделать app.CreateOleObject('Excel.Application');,
> то проходит, но при нажатии на кнопку получаю сообщение:
> «Variant does not reference an automation object». В общем,
> замучался я уже с этим вопросом… L((. А надо, НАДО найти
> ответ. Уж очень это важно


uses ComObj


Skyle   (2004-08-13 07:45:00) [6]


> app.CreateOleObject('Excel.Application');

Сам-то понял, что сказал?

Когда мне требовалось найти конец данных я просто в цикле ходил и искал первую пустую строку, как предлагается в
>  [18] REP ©   (13.08.04 07:41)
.
Но у меня структура данных это позволяла.

Неужели всё, что тут было предложено, мимо кассы?


REP   (2004-08-13 07:41:00) [7]

V l a d i m i r   (12.08.04 23:00) [17]
А могут быть пустые ячейки в этих столбцах? Если просто пробежаться до первой пустой ячейки(ячеек)?


V l a d i m i r   (2004-08-12 23:00:00) [8]

Не-а, не получилось. Во-первых, на app:=CreateOleObject('Excel.Application');компилятор ругается, а если сделать app.CreateOleObject('Excel.Application');, то проходит, но при нажатии на кнопку получаю сообщение: «Variant does not reference an automation object». В общем, замучался я уже с этим вопросом… L((. А надо, НАДО найти ответ. Уж очень это важно.

Принцип работы программы заключается в следующем: пользователь указывает через кнопку Обзор файл, в котором располагается необходимая информация (отчет о доходах и расходах), которая загружается в БД. Дело в том, что доходы и расходы располагаются всегда в одних и тех же столбцах, однако объем отчета может изменяться (в сторону увеличения/уменьшения строк). Вот поэтому, чтобы загрузка была динамической, мне необходимо получить последнюю строку в документе, чтобы знать, где окончание отчета. Вот!


YurikGL   (2004-08-12 21:49:00) [9]

Хоть получилось?


YurikGL   (2004-08-12 20:24:00) [10]

procedure TForm1.Button1Click(Sender: TObject);
var
  App : Variant;
begin
try
app := CreateOleObject('Excel.Application');
 App.Visible := True;
 App.WorkBooks.Add;
 App.activesheet.range['b1','b5'].formula:='a';
 App.ActiveSheet.Range['c1','d3'].formula:='b';
 App.ActiveSheet.Range['a1','a3'].formula:='b';
 app.ActiveCell.SpecialCells(xlLastCell,EmptyParam).select;
finally
 App:=Unassigned;
end;
end;


V l a d i m i r   (2004-08-12 19:52:00) [11]

Дело в том, что в Excel'ом документе содержится информация, которая загоняется в БД. Я не буду залезать в дебри работы моего приложения, но смысл в том, что объем этой информации в документе может изменяться и мне необходимо всякий раз знать последнюю строку "забитой" части документа.

В справке по VB в MS Excel я нашел следующее:

Worksheets("Sheet1").Activate
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate


Этот макрос выделяет последнюю ячейку в excel'ом листе. А как этот макрос использовать в Delphi?


YurikGL   (2004-08-12 19:42:00) [12]


> V l a d i m i r   (12.08.04 17:33) [12]

Тогда уж спроси, как определить номер текущей строки


V l a d i m i r   (2004-08-12 17:33:00) [13]


> shc  


А как определить номер (нужен именно НОМЕР) последней строки?


shc   (2004-08-12 14:42:00) [14]

ActiveCell.SpecialCells(xlLastCell).Select
Переходит на последнюю ячейку (перед использованием нужно сохранить )


V l a d i m i r   (2004-08-12 13:21:00) [15]

ОК, спасибо за помощь... Попробую поискать в справке по VBA для excel! Надеюсь, повезет.


nasty   (2004-08-12 13:16:00) [16]

to [V l a d i m i r, 4]
статьи - в MSDN или в справке по VBA для excel (более доступно)


nasty   (2004-08-12 13:14:00) [17]

вполне объяснимо.
потому что в данном случае количество строк в используемом диапазоне = 1 (только вторая строка)
если в первой строке листа забить какое-нибудь значение - usedrange.rows.count будет отсчитываться от начала листа.
можно использовать range.offset для определения смещения даипазона


V l a d i m i r   (2004-08-12 13:02:00) [18]


> nasty ©

ShowMessage(Sheet.UsedRange.Rows.Count) выводит стабилно только единичку... а "забита" ячейка[2,2]. Попробовал "забить" ячейку где-нибудь подальше, но все равно выводит единичку :(((


nasty   (2004-08-12 12:50:00) [19]

to [V l a d i m i r]
это что-ли?
Sheet.UsedRange.Rows.Count


Ega23   (2004-08-12 12:46:00) [20]

Подскажите хотя бы, какие статьи прочитать можно на эту тему, плз...

Я могу только одно посоветовать - узнать, как это делает сам Excel.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо