Число строк в excel delphi

0 / 0 / 0

Регистрация: 15.05.2013

Сообщений: 12

1

Получение количества использованных строк в эксель

26.05.2013, 19:28. Показов 3222. Ответов 5


Студворк — интернет-сервис помощи студентам

Есть таблица в excel, как можно через делфи получить размерность таблицы, в частности количество строк
Что бы можно было например заполнять стринг грид через цикл, число итераций которого соответствуют числу строк в таблице excel



0



32 / 53 / 9

Регистрация: 05.12.2013

Сообщений: 261

09.04.2014, 15:58

2

sheet1.UsedRange.rows.count



1



0 / 0 / 0

Регистрация: 15.05.2013

Сообщений: 12

09.04.2014, 16:02

 [ТС]

3

Спасибо! Осталось вспомнить зачем мне это было нужно



0



32 / 53 / 9

Регистрация: 05.12.2013

Сообщений: 261

09.04.2014, 20:38

4

Ну как наткнулся — так ответил)



1



kuzduk

79 / 10 / 0

Регистрация: 21.09.2011

Сообщений: 77

10.04.2020, 13:16

5

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;



0



HyperZen

10.04.2020, 16:40


    Получение количества использованных строк в эксель

Не по теме:

Я думаю топик-стартер за 7 лет уже нашел ответ…



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.04.2020, 16:40

6

Пишу такой код:

   xAppl := CreateOleObject('Excel.Application');
   xAppl.WorkBooks.Open('C:Loratable.xls');

   lastRow := xAppl.ActiveCell.Row;

и в последней строке lastRow всегда равно единице. Как сделать, чтобы было известно всё кол — во строк?

Здравствуйте, Lizka, Вы писали:

L>Пишу такой код:

L> xAppl := CreateOleObject(‘Excel.Application’);
L> xAppl.WorkBooks.Open(‘C:Loratable.xls’);

L> lastRow := xAppl.ActiveCell.Row;

L>и в последней строке lastRow всегда равно единице. Как сделать, чтобы было известно всё кол — во стро
есть такая вещь:
worksheets(1).UsedRange.Rows.Count
посмотри хелп, могу подсказать только то что если у тебя заняты первые десять строк то вернет 10, а если идут первые две строки пустые а потом 10 занятых то один хрен вернёт 10, ибо возвращает количество занятых строк.

Как я понял у тебя будет таблица, следовательноо тебя это волновать не должно, но решил на всякий случай сказать, а то мало ди что.

Здравствуйте, RIPer, Вы писали:

RIP>Здравствуйте, Lizka, Вы писали:


L>>Пишу такой код:

L>> xAppl := CreateOleObject(‘Excel.Application’);
L>> xAppl.WorkBooks.Open(‘C:Loratable.xls’);

L>> lastRow := xAppl.ActiveCell.Row;

L>>и в последней строке lastRow всегда равно единице. Как сделать, чтобы было известно всё кол — во стро

Да, и по моему это вопрос не по дельфи а по VBA, если мой ответ тебе не пригодился то советую поменять тему, т.к. некоторые могут и не смотреть.

Здравствуйте, Lizka, Вы писали:

L>RIPer, СПАСИБО ОГРОМНОЕ!!!

Я рад что помог, но можно было и оценочку поставить

 
GetIt
 
(2004-03-24 01:11)
[0]

Как узнать количество строк в Excel из Delphi ?
помажите..


 
KSergey ©
 
(2004-03-24 07:19)
[1]

Количество заполненных строк видимо имеется в виду? Пробежать по ним, выбрать заполненные. Или до первой незаполненной — если разрыва не предвидится…


 
BanderLog ©
 
(2004-03-24 07:23)
[2]

Есть специальная функция, которая выделяет ячейку границы заполненности, но как она называется не помню, надо порыться в хелпах.


 
Думкин ©
 
(2004-03-24 07:38)
[3]

ActiveSheet.UsedRange.Rows.Count


 
GetIt
 
(2004-03-24 23:14)
[4]

Да, почти так….
Сам отвечу, для тех кому интересно… наткнулся тут…

Получение данных из Excel
Это можно сделать с помощью следующей процедуры :

  procedure TForm1.BitBtnFromExcelOnClick(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
NomFich := ‘C:MyDirectoryNameOfFile.xls’;
IIndex := 1;
XLApp.Connect;
// Открываем файл Excel
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
// Чтобы знать размер листа (WorkSheet), т.е. количество строк и количество
// столбцов, мы активируем его последнюю непустую ячейку
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
// Получаем значение последней строки
X := XLApp.ActiveCell.Row;
// Получаем значение последней колонки
Y := XLApp.ActiveCell.Column;
// Определяем количество колонок в TStringGrid
 GenericStringGrid.ColCount := Y;
// Сопоставляем матрицу WorkSheet с нашей Delphi матрицей
 RangeMatrix := XLApp.Range[«A1»,XLApp.Cells.Item[X,Y]].Value;
// Выходим из Excel и отсоединяемся от сервера
 XLApp.Quit;
 XLApp.Disconnect;
//  Определяем цикл для заполнения TStringGrid
 K := 1;
 repeat
   for R := 1 to Y do
     GenericStringGrid.Cells[(R — 1),(K — 1)] := RangeMatrix[K,R];
   Inc(K,1);
   GenericStringGrid.RowCount := K + 1;
 until
  K > X;
// Unassign the Delphi Variant Matrix
  RangeMatrix := Unassigned;
end;


 
BanderLog ©
 
(2004-03-25 06:43)
[5]

Да, да, именно оно, а где нашёл не подскажешь, а то все перерыл, а где видел это — не помню. :)

// Чтобы знать размер листа (WorkSheet), т.е. количество строк и количество
// столбцов, мы активируем его последнюю непустую ячейку
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
// Получаем значение последней строки
X := XLApp.ActiveCell.Row;
// Получаем значение последней колонки
Y := XLApp.ActiveCell.Column;


 
Думкин ©
 
(2004-03-25 07:13)
[6]

UsedRange
Returns a Range object that represents the used range on the specified worksheet. Read-only.

Почему — > Да, почти так…. ?


 
GetIt
 
(2004-03-26 08:15)
[7]

2 BanderLog:

Не, не найду… но вот все, что там было….


Обмен данными с Excel.
Автор: Fernando Silva

В Delphi 5, для обмена данными между Вашим приложением и Excel можно использовать компонент TExcelApplication, доступный на Servers Page в Component Palette.

Совместимость: Delphi (5.x или выше)

На форме находится TStringGrid, заполненный некоторыми данными и две кнопки, с названиями To Excel и From Excel. Так же на форме находится компонент TExcelApplication со свойством Name, содержащим XLApp и свойством ConnectKind, содержащим ckNewInstance.

Когда нам необходимо работать с Excel, то обычно мы открываем ExcelApplication, затем открываем WorkBook и в конце используем WorkSheet.

Итак, несомненный интерес представляет для нас листы (WorkSheets) в книге (WorkBook). Давайте посмотрим как всё это работает.

Посылка данных в Excel

Это можно сделать с помощью следующей процедуры :

procedure TForm1.BitBtnToExcelOnClick(Sender: TObject);
var
WorkBk : _WorkBook; //  определяем WorkBook
WorkSheet : _WorkSheet; //  определяем WorkSheet
I, J, K, R, C : Integer;
IIndex : OleVariant;
TabGrid : Variant;
begin
if GenericStringGrid.Cells[0,1] <> "" then
 begin
  IIndex := 1;
  R := GenericStringGrid.RowCount;
  C := GenericStringGrid.ColCount;
  // Создаём массив-матрицу
  TabGrid := VarArrayCreate([0,(R - 1),0,(C - 1)],VarOleStr);
  I := 0;
  //  Определяем цикл для заполнения массива-матрицы
  repeat
  for J := 0 to (C - 1) do
    TabGrid[I,J] := GenericStringGrid.Cells[J,I];
   Inc(I,1);
  until
   I > (R - 1);

  // Соединяемся с сервером TExcelApplication
  XLApp.Connect;
   // Добавляем WorkBooks в ExcelApplication
  XLApp.WorkBooks.Add(xlWBatWorkSheet,0);
  // Выбираем первую WorkBook
  WorkBk := XLApp.WorkBooks.Item[IIndex];
  // Определяем первый WorkSheet
  WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
  // Сопоставляем Delphi массив-матрицу с матрицей в WorkSheet
  Worksheet.Range["A1",Worksheet.Cells.Item[R,C]].Value := TabGrid;
  // Заполняем свойства WorkSheet
  WorkSheet.Name := "Customers";
  Worksheet.Columns.Font.Bold := True;
  Worksheet.Columns.HorizontalAlignment := xlRight;
  WorkSheet.Columns.ColumnWidth := 14;
  // Заполняем всю первую колонку
  WorkSheet.Range["A" + IntToStr(1),"A" + IntToStr(R)].Font.Color := clBlue;
  WorkSheet.Range["A" + IntToStr(1),"A" + IntToStr(R)].HorizontalAlignment := xlHAlignLeft;
  WorkSheet.Range["A" + IntToStr(1),"A" + IntToStr(R)].ColumnWidth := 31;
  // Показываем Excel
  XLApp.Visible[0] := True;
  // Разрываем связь с сервером
  XLApp.Disconnect;
  // Unassign the Delphi Variant Matrix
  TabGrid := Unassigned;
 end;
end;

Получение данных из Excel

Это можно сделать с помощью следующей процедуры :

  procedure TForm1.BitBtnFromExcelOnClick(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
NomFich := ‘C:MyDirectoryNameOfFile.xls’;
IIndex := 1;
XLApp.Connect;
// Открываем файл Excel
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
// Чтобы знать размер листа (WorkSheet), т.е. количество строк и количество
// столбцов, мы активируем его последнюю непустую ячейку
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
// Получаем значение последней строки
X := XLApp.ActiveCell.Row;
// Получаем значение последней колонки
Y := XLApp.ActiveCell.Column;
// Определяем количество колонок в TStringGrid
 GenericStringGrid.ColCount := Y;
// Сопоставляем матрицу WorkSheet с нашей Delphi матрицей
 RangeMatrix := XLApp.Range["A1",XLApp.Cells.Item[X,Y]].Value;
// Выходим из Excel и отсоединяемся от сервера
 XLApp.Quit;
 XLApp.Disconnect;
//  Определяем цикл для заполнения TStringGrid
 K := 1;
 repeat
   for R := 1 to Y do
     GenericStringGrid.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
   Inc(K,1);
   GenericStringGrid.RowCount := K + 1;
 until
  K > X;
// Unassign the Delphi Variant Matrix
  RangeMatrix := Unassigned;
end;

2 Думкин:
Без обид.. просто так выразился… :)


уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня мы рассмотри свойства объекта WorkSheet.

Основными свойствами, которые Вы с большой вероятностью будете использовать в своей работе с Excel в Delphi являются:

  1. Cells — ячейки
  2. Columns — столбцы
  3. Name — название листа
  4. Range — диапазон ячеек
  5. Rows — сроки
  6. StandartHeight — высота строк «по умолчанию»
  7. StandartWidth — ширина столбцов «по умолчанию»
  8. UsedRange — задействованный диапазон ячеек
  9. Comments — комментарии

Всего у листа рабочей книги Excel насчитывается 54 различных свойств, но, как показвает практика, для использования Excel в Dephi достаточно 9-15 различных свойств листа, чтобы получить необходимый результат, обеспечивающий удобство и наглядность представляемых данных.

Рассмотрим применение указанных выше свойств листа Worksheet при работе с Excel в Delphi.

1. Свойство Cells

Возвращает объект диапазона, который представляет собой все ячейки на листе (а не только клетки, которые используются в настоящее время)

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Cells

Однако использование свойства Cells возможно (и более практично) в другом виде. Вы можете указать сразу за словом Cells номера столбца и строки и, таким образом, получить доступ к конкретной ячейке листа. Например, забегая немного вперед, посмотрим, как можно удалить формулы из ячейки:

MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3].ClearContents

Выполнив такую операцию Вы удалите из ячейки С5 формулу (или любое другое содержимое). Как можно заметить, в отличие от работы с таблицами StringGrid Delphi, здесь вначале указывается номер строки, а затем номер столбца (у String Grid напротив — сначала указывается номер столбца, а затем номер строки).

Аналогичным образом Вы можете записать в ячейку данные:

MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3]:='Пример текста'

Ну, а чтобы показать использование этого свойства на примере, давайте напишем простенькую процедуру копирования таблицы StringGrid в любую область листа Worksheet Excel.

procedure WriteTable(FirstCol, FirstRow:integer; Grid: TStringGrid);
var col,row:integer;
begin
  try
    for col := 0 to Grid.ColCount - 1 do
      for row := 0 to Grid.RowCount - 1 do
        MyExcel.ActiveWorkBook.ActiveSheet.Cells[FirstRow+row+1, FirstCol+col+1]:=Grid.Cells[col, row];
  except
    raise Exception.Create('Запись таблицы завершилась ошибкой')
  end;
end;

Здесь в качестве параметров процедуры необходимо задать: номера первого столбца (FirstCol) и первой строки (FirstRow) на листе Excel, начиная с которых необходимо копировать данные из таблицы StringGrid (Grid). Заметьте, что вызов свойств Cells у StringGrid и WorkSheet происходит по-разному (см. индексы ячейки).

Естественно, что представленная процедура может с легкостью применяться при копировании небольших таблиц. Однако при импорте больших объемов данных в Excel эта процедура будет очень сильно тормозить работы основной программы. Более скоростной способ импорта данных из Excel в Delphi и наоборот мы рассмотрим позже, при рассмотрении объекта Range.

2. Свойство Columns

Возвращает объект диапазона, который представляет собой все столбцы на активном листе. Если активный документ не является листом (а, например, диаграммой), то вызов свойства Columns приводит к исключительной ситуации.

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Columns

Это свойство удобно использовать при редактировании столбцов данных. Например вот так:

MyExcel.ActiveWorkBook.ActiveSheet.Columns[1].Font.Bold

Вы сможете изменить шрифт в столбце А на полужирный. Также Вы можете изменять внешний вид столбцов, перерисовывать границы ячеек и т.д.

3. Свойство Name

С этим свойством мы уже сталкивались. Свойство Name возвращает имя рабочего листа книги.

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Name:='Новое название листа'

Так мы изменили имя текущего активного листа Excel. Кроме этого, свойство Name удобо использовать при поиске необходимого листа.

4. Свойство Range

Возвращает объект, представляющий собой одну ячейку или диапазон ячеек.

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Range['A1']:='Hello World'

Так, мы получили доступ к ячейке А1 и записали в неё текст. А следующий фрагмент кода демонстрирует быстрый способ экспорта данных из листа Excel в Delphi:

var Numbers : Variant;
    data: string;
    i: integer;
begin
...
  Numbers:=MyExcel.ActiveSheet.Range[Num+IntToStr(FirstRows), Num+IntToStr(Rows)].Value;
  for i:=1 to MyExcel.ActiveSheet.UsedRange.Rows.Count do
    data:=Numbers[i,1]
...
end;

Так, мы за одно обращение к листу считали столбец данных и в дальнейшем, не используя напрямую объект WorkSheet, обработали все данные в вариантном массиве Numbers. Этот способ чтения данных с листа Excel является наиболее скоростным из всех известных мне в настоящее время. Если знаете способ более скоростной — буду очень рад, если поделитесь им.

5. Свойство Rows

Это свойство аналогично свойству Columns, но в отличие от него, возвращает объект, представляющий собой строку листа. С помощью этого свойства Вы также можете изменять внешний вид ячеек листа, изменять шрифт и т.д.

6. Свойства StandartHeight и StandartWidth

Эти свойства позволяют получить значения высоты и ширины ячеек листа «по умолчанию». Свойство доступно только для чтения, т.е. вызов:

MyExcel.ActiveWorkBook.ActiveSheet.StandartHeight:=14

Приведет к исключительной ситуации. Вы можете использовать это свойство, например, когда необходимо гарантировано установить значения высоты и ширины строк в значения «по умолчанию»

7. Свойство UsedRange

Возвращает диапазон занятых ячеек листа. Свойство очень удобно использовать, когда необходимо узнать количество занятых строк и столбцов на листе:

Rows:=MyExcel.ActiveSheet.UsedRange.Rows.Count;

Columns:=MyExcel.ActiveSheet.UsedRange.Columns.Count;

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

Это свойство возвращает коллекцию комментариев на листе.

Например:

MyExcel.ActiveSheet.Comments[2].Delete

удалит второй комментарий из коллекции, а:

MyExcel.ActiveSheet.Range("e5").AddComment('Текст комментария')

добавит в ячейку е5 новый комментарий.

Итак, резюмируем. Сегодня мы узнали: как записать данные в ячейку листа Excel, как прочитать данные из диапазона ячеек, как скопировать таблицу из Delphi в Excel, как быстро экспортировать данные из Excel в Delphi.

В следующий раз займемся работой с ячейками листа, а именно научимся копировать таблицы из Delphi в Excel один-к-одному с сохранением всех цветов, границ ячеек и т.д., а также, попробуем строить диаграммы, которые опять же очень часто требуются при разработке бизнес-приложений.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

I use cxGrid and I want import a excel file to cxgrid. I wrote this code a function.

But, its wrong, because cxGrid dont know RowCount and ColCount.
I would like know, what can I use, what is similar?
Help me!
Thank you!

function Xls_To_cxGrid(AGrid: TcxGrid; AXLSFile: string): Boolean;

const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Open(AXLSFile);
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    x := XLApp.ActiveCell.Row;
    y := XLApp.ActiveCell.Column;

      AGrid.RowCount := x;
      AGrid.ColCount := y;

    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    RangeMatrix := Unassigned;

  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

Понравилась статья? Поделить с друзьями:
  • Число строк в excel 2003
  • Число страниц в брошюре word
  • Число столбцов на рабочем листе excel равно
  • Число столбцов в массиве excel
  • Число столбцов в excel 2010