Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Как узнать, закончились ли строки в excel файле?


Автор: sgentstuff 10.7.2006, 09:52
как организовать цикл до конца строк? 

Автор: Albinos_x 10.7.2006, 11:09
http://forum.vingrad.ru/index.php?showtopic=84634&view=all 

Автор: sgentstuff 10.7.2006, 11:30
там про word есть но про excel я не нашел 

Автор: Albinos_x 10.7.2006, 12:35
плохо смотрел... smile

Добавлено @ 12:41 
там аж 2 варианта:
Цитата(Albinos_x @  21.2.2006,  16:22 Найти цитируемый пост)
 Точно также как и с WordApplication, решил я разобраться с компанентой ExcelApplication... Ну что ж приступим:

Немного теории
...


Цитата(Albinos_x @  21.2.2006,  16:46 Найти цитируемый пост)
...Количество строк и столбцов

Тут тоже существует несколько вариантов:

1.
код Pascal/Delphi    
...    
ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;    
// количество строк и столбцов    
Caption:='Строк: '+inttostr(ExcelApplication1.ActiveCell.Row)+' Столбцов: '+ inttostr(ExcelApplication1.ActiveCell.Column);    
...    

2. 
код Pascal/Delphi    
...    
// Количество столбцов    
caption:=inttostr(ExcelWorksheet1.UsedRange[0].Columns.Count );    
...    

Со строками по аналогии
...


Добавлено @ 12:42 
и пример ещё к тому же есть... 

Автор: Akella 11.7.2006, 08:46
Код

Var
 WorkSheet : _WorkSheet; //  определяем WorkSheet
 iLastRow:integer;
...

        WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
        // Получаем значение последней строки
        iLastRow:=(ex1.ActiveCell.Row)-1;



поищи по форуму, я выкладывал примеры работы с Excel`ем 

Автор: sgentstuff 11.7.2006, 13:27
мне нужно для нужной книги для нужного листа узнать кол-во строк
например вот так:

Код

max_rows:=Excel.WorkBooks[p+1].WorkSheets[1].UsedRange[1].Columns.Count;


но так не работает!
 

Автор: Albinos_x 11.7.2006, 15:29
В чём это выражается? 

Автор: sgentstuff 11.7.2006, 17:51

Я не испоьзую компоненту, а просто через ОЛЕ, как правильно записать получение количества строк?

Код

var
Excel:Variant;
max_rows:integer;
begin
max_rows:=Excel.WorkBooks[p+1].WorkSheets[1].UsedRange[1].Columns.Count;
end;

на эту запись он выдает такую ошибку:
EOleSysError with message 'Ivalid number of parameters' 

Автор: Albinos_x 12.7.2006, 11:40
попробуй вот так:
Код

var    
Excel:Variant;    
max_rows:integer;    
begin    
max_rows:=Excel.WorkBooks[p+1].WorkSheets[1].UsedRange[0].Columns.Count;    
end;


Что за 
[p+1]

Автор: sgentstuff 12.7.2006, 12:10
с 
Код

UsedRange[0]

тоже самое
p+1  - это просто номер книги, в других местах с  p+1 все нормально, можешь у себя проверить как этот код работает, но только без компоненты ExcelAplication

 

Автор: Albinos_x 12.7.2006, 14:03
попробуй так:
Код
...
WorkSheet:=Excel.WorkBooks[p+1].WorkSheets[1];
max_rows:=WorkSheet.Cells.CurrentRegion.Rows.Count;
...


если не прокатит,то делай стандартным способом:
Код
...
    WorkSheet:=Excel.WorkBooks[p+1].WorkSheets[1];
    WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;    
    max_rows := XLApp.ActiveCell.Row;
...


WorkSheet : OleVariant;

у последнего только один недостаток: если на странице стоит защита, то будет вылетать ошибка...

 

Автор: sgentstuff 13.7.2006, 05:56
ура, это сработало, но к сожалению работает только если строки идут подподряд и между ними нету пропуска
Код

WorkSheet:=Excel.WorkBooks[p+1].WorkSheets[1];    
max_rows:=WorkSheet.Cells.CurrentRegion.Rows.Count;


а если вот так
ф1 ф2 ф3 ф4 ф5 ф6
ф1 ф2 ф3 ф4 ф5 ф6
ф1 ф2 ф3 ф4 ф5 ф6

ф1 ф2 ф3 ф4 ф5 ф6
ф1 ф2 ф3 ф4 ф5 ф6

то ответ будет 3 строки а не 6(вкл и пустую), как подсчитать количество, если есть пропуски? 

Автор: sgentstuff 13.7.2006, 06:52
у меня много Excel файлов, в каждом не менее 30000 строк, перед обработкой каждогго файла мне нужно узнать количество строк чтобы знать до куда запускать цикл, но попадаются и пустые строки, даже не знаю что делать, может это как-то по другому можно сделать? нужна помощь! 

Автор: Albinos_x 13.7.2006, 09:34
сделай вторым способом... 

Автор: sgentstuff 13.7.2006, 13:34
вторым способом попробывал пишет

метод Activate из класса Range завершен не верно
в чем загвоздка? 

Автор: sgentstuff 13.7.2006, 14:00
у меня excel 2000 может из-за этого? 

Автор: Albinos_x 13.7.2006, 19:10
нет не из-за этого... если посмотреть, то второй код применяется довольно давно и успешно... и если будешь искать примеры по инету, то почти везде найдёшь именно второй способ...

а ошибка возможно в строчках позже... 

на какой строчке ошибка вылезает? 

Автор: sgentstuff 14.7.2006, 05:35
ошибка именно на этой строке:
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; 

Автор: Albinos_x 14.7.2006, 08:28
код в студию... 

Автор: sgentstuff 14.7.2006, 09:43
var
Код

i:integer;
begin
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('D:\excel\hi');
Excel.Workbooks.Open('D:\excel\hi2');
Excel.Visible := true;

for i:=1 to 4 do
begin
WorkSheet:=Excel.WorkBooks[1].WorkSheets[1];
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
{$O-}
 max_rows := Excel.ActiveCell.Row;
{$O+}
end;


эта ошибка вылетает если открыты две книги как ы этом примере, если же открыть только одну книгу то все нормально, считает как надо, у меня в программе открыто несколько книг, что делать?



 

Автор: sgentstuff 14.7.2006, 10:47
ура получилось. просто нужно активировать книгу
Excel.WorkBooks[1].Activate;
тогда все работает нормально
Albinos_x - спасибо, выручил! 

Автор: Albinos_x 14.7.2006, 13:43
честно говоря по твоему коду ничего не понятно....

к примеру:
Код
...
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('D:\excel\hi');
Excel.Workbooks.Open('D:\excel\hi2');
Excel.Visible := true;
...

зачем открывать две книги... связь-то у тебя только со второй... ну да ладно... может код не весь...
Код
...
WorkSheet:=Excel.WorkBooks[1].WorkSheets[1];
...

зато здесь мы возвращаемся к первой книге... тогда зачем вторая (?)...

и далее не понятно зачем в цикле четыре раза вычеслять количество строк на одном и том же листе?... 

Автор: Albinos_x 14.7.2006, 14:03
отсюда кстати и ошибка вылезала...

работал со второй книгой...

а число строк на листе пытался получить из первой книги...  

Автор: sgentstuff 14.7.2006, 14:47
отсюда кстати и ошибка вылезала...
работал со второй книгой...
а число строк на листе пытался получить из первой книги...  


ЭТО ТОЧНО, теперь все понятно! 

Автор: Albinos_x 14.7.2006, 15:07
Удачи! smile  

Автор: oleg153 2.3.2007, 22:59
Господа!
Подскажите пожалуйста, все что можно прочитать я перечитал и рад что у всех работает.
Но я потратил сутки но не смог добится номера последней заполненной строки на листе Excel.

Перепробовал все, но и в delphi7 и delphi 2006 (studio) одна и таже проблемма :
компилятор наотрез не понимает xlCellTypeLastCell.
И там и там ошибка Undeclired Identifire 'xlCellTypeLastCell'. И все. Процесс умирает.

Я не понимаю в чем дело, ЧТО я не так пишу ???
Вот мой код , в таком виде он не работает:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    Memo1: TMemo;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;

{$R *.dfm}

{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject);
var BookName1: string;
var j: integer;
begin
 // Выбираем файл базы.
 if OpenDialog1.Execute then
  begin
   BookName1:= OpenDialog1.FileName; // имя книги с полным путем
   //Запускаем Excel
   try
    //Ищем запущеный экземпляр Excel, если он не найден, вызывается исключение
    Excel := GetActiveOleObject('Excel.Application');
    //Проверяем что открыта нужная книга
    for j:=1 to Excel.Workbooks.Count do
     begin
      if Excel.Workbooks.Item[j].FullName=BookName1 then break;
     end;
    // Выбираем WorkBook
    WorkBook := Excel.WorkBooks.Item[j];
   except
    //Запускаем Excel
    Excel := CreateOleObject('Excel.Application');
    //Открываем нужную книгу
    WorkBook := Excel.WorkBooks.Open(BookName1);
   end;
  Excel.Visible:=True;
  end
  else
   begin
    SysUtils.Beep;
    ShowMessage('Не могу открыть Excel!');
    Exit;
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if not VarIsEmpty(Excel) then
  begin
   Excel.Quit;
   Excel := Unassigned;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var X,Y:integer;
begin
  WorkSheet:=WorkBook.WorkSheets[1];
  WorkSheet.Activate;
  WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
  X := Excel.ActiveCell.Row;
  Y := Excel.ActiveCell.Column;
  Memo1.Lines.Add('Строк: '+ inttostr(x));
  Memo1.Lines.Add('Столбцов : '+inttostr(y));
end;

end.



Случайно наткнулся по яндексу на пример где отдельно обьявлялся этот параметр
таким образом
Код

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;

const 
  xlCellTypeLastCell = $0000000B;  // ВОТ ТАКИМ ОБРАЗОМ.

{$R *.dfm}


{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject); ..................


Тогда ошибка пропала и все заработало.
Получается что если не используем компоненту ExcelApp то это нужно ОБЯЗАТЕЛЬНО делать ?
тогда почему об этом никто не упоминает ???

Автор: Albinos_x 2.3.2007, 23:43
1. Следовало бы создать отдельную тему.
2. константа - xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:
Код
...
WorkSheet.Cells.SpecialCells($B, EmptyParam).Activate; // или WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate;
...

4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут...), в справке по VB можно посмотреть значение любой из этих констант...

Автор: RosemaN 7.11.2007, 00:52
Цитата(Albinos_x @ 2.3.2007,  23:43)
1. Следовало бы создать отдельную тему.
2. константа - xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:
Код
...
WorkSheet.Cells.SpecialCells($B, EmptyParam).Activate; // или WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate;
...

4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут...), в справке по VB можно посмотреть значение любой из этих констант...

1. в таком варианте пишет "could not convert variant of type OleStr into type Double".
Код

 Excel.WorkBooks[1].Activate; // активация рабочей книги 1
  WorkSheet:=Excel.WorkBooks[1].WorkSheets[1]; //активация листа 1 рабочей книги 1
  WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate; // эту строчку я не совсем понял. Что она активирует?
  max_rows := Excel.ActiveCell.Row; // записывает в переменную номер ячейки (последней непустой?) 

2. думал что переменная max_rows должна быть типа int, ошибка, описанная выше...  smile 
3. где можно взять справочник по этим всем функциям и свойствам?

Автор: Albinos_x 7.11.2007, 22:32
код в студию

Автор: kuzduk 10.4.2020, 13:23
Код

XL := CreateOleObject('Excel.Application');
XL.Workbooks.Open(ExcelFilePath);

//Первый вариант:
UsedRowCount := iSheet.UsedRange.Rows.Count;  //Если у тебя заняты первые десять строк то вернёт 10. Однако если идут первые две строки пустые, а потом 10 занятых, то один хрен вернёт 10, ибо возвращает количество занятых строк.
UsedColCount := iSheet.UsedRange.Columns.Count;
FirstUsedRow := iSheet.UsedRange.Row; //Номер первой строки в которой прописана ячейка
FirstUsedCol := iSheet.UsedRange.Column; //Номер первой колонки в которой прописана ячейка
LastUsedRow  := FirstUsedRow + UsedRowCount - 1;
LastUsedCol  := FirstUsedCol + UsedColCount - 1;
     

//Второй вариант: через активацию последней непустой ячейки
//const xlCellTypeLastCell = $0000000B;
iSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; //Если лист пуст(ни одна ячейка не прописана), то строка вызывает ошибку
LastUsedRow := XL.ActiveCell.Row;
LastUsedCol := XL.ActiveCell.Column;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)