Как узнать количество листов excel delphi

Обновлено: 06.07.2024

Для работы с Excel в Delphi, первым делом нужно в Uses указать модуль ComObj.

Как запустить Excel и открыть новый документ в Delphi

XL : = CreateOLEObject ( 'Excel.Application' ) ; // Создание OLE объекта

Как обратиться к отдельным ячейкам листа Excel в Delphi

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 1 , 1 ] . Value : = '30' ;

//Результатом является присвоение ячейке [1,1] первого листа значения 30. Также к ячейке

Как добавить формулу в ячейку листа Excel в Delphi

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 3 , 3 ] . Value : = '=SUM(B1:B2)' ;

Форматирование текста в ячейках Excel, производится с помощью свойств Font и Interior объекта Cell:

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 1 , 1 ] . Interior . Color : = clYellow ;

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 1 , 1 ] . Font . Color : = clRed ;

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 1 , 1 ] . Font . Name : = 'Courier' ;

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 1 , 1 ] . Font . Size : = 16 ;

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Cells [ 1 , 1 ] . Font . Bold : = True ;

Работа с прямоугольными областями ячеек, с помощью объекта Range:

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Range [ 'A1:C5' ] . Value : = 'Blue text' ;

XL . WorkBooks [ 1 ] . WorkSheets [ 1 ] . Range [ 'A1:C5' ] . Font . Color : = clBlue ;

//В результате в области A1:C5 все ячейки заполняются текстом 'Blue text'.

Как выделить группу (область) ячеек Excel в Delphi

Как установить объединение ячеек, перенос по словам, и горизонтальное или вертикальное выравнивание Excel в Delphi

Как задать границы ячеек Excel в Delphi

Как выровнять столбцы Excel по ширине, в зависимости от содержания

Как удалить столбец Excel в Delphi

Как задать формат ячеек Excel в Delphi

XL . columns [ 1 ] . NumberFormat : = '@' ; // текстовый формат

XL . columns [ 1 ] . NumberFormat : = 'm/d/yyyy' ; // формат дата

XL . columns [ 1 ] . NumberFormat = '0.00%' // формат процентный

Поиск по сайту

Okolokompa в Яндекс Дзен

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Мы рассмотрели в разд. 6.4.2 основные операции, связанные с книгами. Теперь перейдем к операциям с листами книги. Коллекция листов содержится в свойстве Worksheets объекта книги. Эта коллекция по своим свойствам подобна рассмотренной ранее коллекции Workbooks. К листу можно обращаться по индексу или по имени. Например, следующие операторы при работе с серверами СОМ открывают и активизируют первый лист книги, представленной объектом Excel Workbook 1, передают указатель на этот лист в переменную Excel Worksheet 1 и активизируют лист, т.е. выдвигают его на первый план в окне Excel:

При работе с серверами автоматизации OLE аналогичные операторы выглядят так:

Свойство Worksheets имеется также в объекте сервера. Это свойство относится к активной книге. Так что следующие операторы при работе с серверами СОМ производят операции с активной книгой, открывая и активизируя в ней лист, имя которого (например, "Лист1") задано в окне редактирования Editl:

При работе с серверами автоматизации OLE аналогичные операторы выглядят так:

Если лист с заданным именем отсутствует в книге, будет генерироваться исключение. Так что если имеется подобная опасность, это исключение надо перехватить, например, следующим образом:

Worksheets[Editl.Text] as ExcelWorksheet; ExcelWorksheetl.Activate(LOCALE_USER_DEFAULT); except

Добавить новый лист в книгу можно методом Add объекта Worksheets:

Параметры Before или After - это объект листа, перед которым или после которого осуществляется вставка. Обычно достаточно задать только один из этих параметров, а другой сделать равным EmptyParam. Если оба параметра равны EmptyParam, то новые листы вставляются перед текущим активным листом. Параметр Count указывает число вставляемых листов. Если этот параметр равен EmptyParam, то вставляется один лист. Параметр Туре__ определяет тип вставки. При значении EmptyParam вставляется новый пустой лист.

Например, следующий код при работе с серверами СОМ вставляет один новый лист перед активным листом активной книги и передает указатель на него в переменную ExcelWorksheetl:

А следующий код вставляет два новых листа после третьего листа активной книги:

При работе с серверами автоматизации OLE аналогичные операторы выглядят так:

Имя вставленного или любого имеющегося листа можно изменить с помощью свойства Name. Например:

ExcelWorksheetl.Name := 'Счет-фактура'; Удалить лист из книги можно методом Delete:

Напечатать лист можно методом Printout, не отличающимся от аналогичного метода, описанного ранее для книги. Например, печать текущей страницы при работе с серверами СОМ может быть оформлена так:

При работе с серверами автоматизации OLE получается попроще:

Предварительный просмотр листа перед печатью можно осуществить методом PrintPreview:

Параметр EnableChanges указывает возможность внесения изменений при просмотре. Например, следующий оператор обеспечивает при работе с серверами СОМ предварительный просмотр активного листа книги:

Репутация: нет
Всего: 1

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

Добавлено @ 12:41
там аж 2 варианта:

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

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

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: 2
Всего: 329

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

Репутация: нет
Всего: 1

мне нужно для нужной книги для нужного листа узнать кол-во строк
например вот так:

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

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

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

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

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

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

если не прокатит,то делай стандартным способом:

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

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

ура, это сработало, но к сожалению работает только если строки идут подподряд и между ними нету пропуска

а если вот так
ф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(вкл и пустую), как подсчитать количество, если есть пропуски?

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: нет
Всего: 1

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

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

вторым способом попробывал пишет

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

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: нет
Всего: 1

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

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

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

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

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

ошибка именно на этой строке:
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

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

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: нет
Всего: 1

ура получилось. просто нужно активировать книгу
Excel.WorkBooks[1].Activate;
тогда все работает нормально
Albinos_x - спасибо, выручил!
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

честно говоря по твоему коду ничего не понятно.


зачем открывать две книги. связь-то у тебя только со второй. ну да ладно. может код не весь.

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

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

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: 15
Всего: 108

отсюда кстати и ошибка вылезала.

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

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

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 1

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

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

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: нет

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

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

Код

unit Unit1;

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

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

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

Репутация: 15
Всего: 108

1. Следовало бы создать отдельную тему.
2. константа - xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:

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

Репутация: нет
Всего: нет


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

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

Репутация: 15
Всего: 108

"Кто владеет информацией, тот владеет миром"
Уинстон Черчилль

Репутация: нет
Всего: 2

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

[ Время генерации скрипта: 0.2020 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Работа с EXCEL из Delphi.


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

- Подключить и правильно отключить интерфейс Excel;
- Как изменить размер, цвет и тип шрифта;
- Как выделить, объединить, заполнить и размножить диапазон ячеек;
- Как повернуть и отцентрировать текст;
- Как нарисовать границы ячеек;
- Как ввести формулу в ячейку и многое другое.

Работать будем через модуль ComObj, для этого в uses необходимо добавить модуль ComObj и модуль Excel_TLB (для MS Excel 2007).

Uses ……, ComObj, Excel_TLB;

Модуль Excel_TLB содержит необходимые константы для работы с Excel, его можно не подключать, но тогда придется в ручную прописывать значения всех используемых констант из этого модуля. Значения констант можно найти внутри модуля или в интернете, но для разных версий MS Excel они разные.
Внимание. Модуль Excel_TLB в других версиях MS Excel может называться по другому. Перед подключением модуля Excel_TLB, необходимо импортировать библиотеку Excel. Для этого выберите Component->Import Component->Import a Type Library-> находим MS Excel и следуем инструкциям.


В разделе описания переменных мы должны описать переменную типа Variant или OleVariant для подключения интерфейса Excel. Я описал переменную excel.

Form1: TForm1;
excel : variant; // Переменная в которой создаётся объект EXCEL

Создание документа

Внимание. Всегда когда создаете объект интерфейса, заключайте процедуру создания в модуль обработки ошибок:
try
создаем интерфейс;
формируем отчет;
освобождаем интерфейс;
Except
обрабатываем ошибки;
освобождаем интерфейс;
end;

Далее идет краткий справочник по основным функциям работы с EXCEL

// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;

// создаем новый документ рабочую книгу
excel.WorkBooks.Add;

// Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
excel.Visible := true;

//задаем тип формул в формате R1C1
excel.Application.ReferenceStyle := xlR1C1;

// задаем тип формул в формате A1
excel.Application.ReferenceStyle := xlA1;

// задаем ширину первой и второй колонки
excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;

// Выравнивам первый ряд по центру по вертикали
excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;

// Выравнивам первый ряд по центру по горизонтали
excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;

// Выравнивам в ячейке по левому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;

// Выравнивам в ячейке по правому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;

// Поворачиваем слова под углом 90 градусов для второго ряда
excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;

//рисуем границы выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии

//рисуем границы выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;

//рисуем границы выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;

//рисуем границы выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;

//рисуем границы выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;

//рисуем границы выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;

//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
excel.DisplayAlerts := False;

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;
end;
end;

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

Например так:
//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
sheet:=Unassigned; //интерфейс листа если он был создан
WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
excel := Unassigned;//интерфейс самого предложения если он был создан


Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.

Работа с EXCEL из Delphi.

Работа с EXCEL из Delphi.

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
excel: variant; // Переменная в которой создаётся объект EXCEL
MyData: variant; // Переменная в которой формируется таблица умножения
i,j:integer;
implementation

//объявляем вариантный массив
MyData := VarArrayCreate([1,9,1,9],varVariant);
for I := 1 to 9 do
for J := 1 to 9 do
MyData[i,j]:=i*j;

Читайте также: