Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Как определить конец документа?   Найти похожие ветки 

 
V l a d i m i r   (2004-08-12 11:40) [0]

Доброго всем дня! Уже вторую неделю ломаю голову над этим вопросом… Собственно, как получить информацию из документа я знаю. Например, я делаю это следующим образом: информация хранится в первом листе документа 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;


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


 
Ega23 ©   (2004-08-12 11:43) [1]

А может-ли это сделать сам Excel?


 
nasty ©   (2004-08-12 11:49) [2]

ну это же так просто -)
Sheet.UsedRange


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


> nasty ©  


> Sheet.UsedRange


... я неточно поставил вопрос... Мне нужно получить НОМЕР последней строки, после которой документ пуст.


 
V l a d i m i r   (2004-08-12 12:45) [4]

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


 
Ega23 ©   (2004-08-12 12:46) [5]

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

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


 
nasty ©   (2004-08-12 12:50) [6]

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


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


> nasty ©

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


 
nasty ©   (2004-08-12 13:14) [8]

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


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

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


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

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


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

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


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


> shc  


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


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


> 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 19:52) [14]

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

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

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


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


 
YurikGL ©   (2004-08-12 20:24) [15]

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;


 
YurikGL ©   (2004-08-12 21:49) [16]

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


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

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

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


 
REP ©   (2004-08-13 07:41) [18]

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


 
Skyle ©   (2004-08-13 07:45) [19]


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

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

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

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


 
menart ©   (2004-08-13 08:37) [20]


> 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 08:41) [21]


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

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

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


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

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


 
Skyle ©   (2004-08-13 12:56) [23]


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

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


 
46_55_41_44 ©   (2004-08-13 13:14) [24]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.027 c
3-1091538379
DBUser
2004-08-03 17:06
2004.08.29
Как вернуть значение в хранимой процедуре


1-1092222804
Voland777
2004-08-11 15:13
2004.08.29
Как ее остановить???


14-1092289956
Кириешки
2004-08-12 09:52
2004.08.29
Чем отличается CloseProcess от Terminate Process?


1-1092581140
Белый волк
2004-08-15 18:45
2004.08.29
Допустимые символы


3-1091444847
Sectey
2004-08-02 15:07
2004.08.29
Расположение бизнес логики приложения.