![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить конец документа? [D6]
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.