0 / 0 / 0 Регистрация: 15.05.2013 Сообщений: 12 |
|
1 |
|
Получение количества использованных строк в эксель26.05.2013, 19:28. Показов 3222. Ответов 5
Есть таблица в 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 |
|||
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 являются:
- Cells — ячейки
- Columns — столбцы
- Name — название листа
- Range — диапазон ячеек
- Rows — сроки
- StandartHeight — высота строк «по умолчанию»
- StandartWidth — ширина столбцов «по умолчанию»
- UsedRange — задействованный диапазон ячеек
- 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;