Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.053 c
3-1091776227
Piero
2004-08-06 11:10
2004.08.29
Как добавить столбец в таблицу


14-1091985919
AlexG
2004-08-08 21:25
2004.08.29
Говорят, технология ActiveX устарела


11-1079974942
Delphi5.01
2004-03-22 20:02
2004.08.29
_NewControl (Aparent, MyControl ,?????,true,?????)


3-1091451475
Andy
2004-08-02 16:57
2004.08.29
Update в ADO


3-1091517554
NorthMan
2004-08-03 11:19
2004.08.29
AdoStoredProc





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский