Как узнать количество листов excel delphi
Для работы с 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
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.
Репутация: 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
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 включён ]
В этой статье я познакомлю вас как работать с 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 таблицы умножения с подробными комментариями.
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;
Читайте также: