Delphi создание отчета в excel

Обновлено: 05.07.2024

Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью. Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.

Очень хорошие статьи. Разобрался во всём с первого раза ))) Понравилась схема в mind42 )))
Автору остаётся сказать только спасибо!

не за что, Иван. Всегда рад помочь)

Странно. Если Excel запущен, то должна создаваться вторая копия приложения без исключений. Код в студию :)

Насчет процедуры CheckExcelRun. Если программа запускается из под Delphi и Excel не запущен, то выскакивает ошибка: Операция GetActiveOleObject недоступна. Если програма запускается не из под Delphi то все в порядке. Наверное эту проблему имел ввиду Алекс. Как решение можно при отладке программы когда возникает исключение нажимать F9.

По сабжу пока не работал, но скорее всего либо перменная FileName уже объявлена, либо тип TFileName из модуля SysUtils, где-то переопределен.

Помогите Вопрос! Я использую шаблоны в своей программе! Можно ли из Дельфи изменть путь Save as. Что бы при слхранений пользавателем путь сохранения был изменен? Спасибо

А можно ли проверить, что не просто запущен Excel, а уже имеется открытая конкретная книга.
Например, хочу создать в Excel (усли уже создана, то открыть) книгу table.xls

Канает в любой версии Delphi, даже в XE.

begin
result:=CheckExcelRun;
if not result then
if AutoRun then
begin
RunExcel;
result:=CheckExcelRun;
end;
if result then MyExcel.WorkBooks.Add;
end;

Или так :-)
begin
result:=CheckExcelRun;
if (not result) and (AutoRun) then
begin
RunExcel;
result:=CheckExcelRun;
end;
if result then MyExcel.WorkBooks.Add;
end;

Ну так отладчик же понятно говорит, что переменная Rez повторно объявлена. Ищите где повторное объявление. Может где в глобальных переменных повторились

function isExcelInstalled:boolean;
var
ClassID: TCLSID;
begin
Result := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;

Понятнее и короче.

Народ , а нельзя вбить какую нить формулу в excel и чтобы результат вычисления выводился в проге в Дельфи? просто я только разбираюсь в дельфи и не знаю как это через дельфи сделать..

Это будет проще сделать в делфи, и на много облегчит программу.

MsExcel : Variant;
_Sheet : TStringList;
i, x : integer;
CCR_Ver, lLastRow, Name_Sheet, path : String;

MsExcel.Workbooks.Open[XLS_File.FileName, 0, True];

// видимость Excel
MsExcel.Visible := False;
// Закрытие открытой книги
MsExcel.WorkBooks[MsExcel.WorkBooks.Count].Close(false);
// Закрытие Excel
MsExcel.quit;
// Перераспределение памяти
inherited;
close; // Закрытие формы frm_CCR_mos
end;

Влад, здравствуйте.
Я могу с Вами как либо связаться и задать пару вопросов?

GS, спасибо большое. Не возражаете, если я, по мере наличия свободного времени, опубликую в блоге отдельным постом эти примеры (Естественно с указанием настоящего автора примеров). Думаю, что такой пост может пригодиться многим.

GS! Подскажите, где взять библиотеку XLSReadWrite?

Буду только рад :)

Ребят, вы даже представить себе не можете, насколько это полезная информация)))
Спасибо!

подскажите плиз как сделать следующее с помощью компонентов XLSReadWrite
1. открыть книгу
2. сделать поиск построчно в столбце например T при этом нужен поиск с частичным совпадением текста.
3. организовать поиск по многим книгам за 1 проход.

текущий пример как сделано сейчас прилагаю. Открытие книги и поиск в ней выполняются за 9 секунд в среднем в двух книгах за 18. хотелось бы уменьшить данное время на сколько это возможно.

заранее спасибо всем откликнувшимся.

Вопрос поднимался выше, не ответили:
Не компилит функция Save, «FileName:TFileName», пишет:
1. если не определяем параметры функции SaveWorkSheet, пишет что не хватает актуальных параметров
2. ставлю параметры, (индекс), пишет что не соответствие типов String/Integer,

Vlad огромное спасибо за статью
Просьба есть: нельзя ли перезалить модуль.. как тут уже писали он не скачивается по ссылке :(

При объявлении переменой типа OleVariant, у самой переменой нету никаких методов/классов. После нажатия точки вылазит только (*,

Хотя сами методы компилятор видит. WorkBooks, Sheet, Range, Cells и т.п.

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

кто-то может передать экземпляр сломанной ссылке

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

Работа с Excel из Delphi
есть функция, которая считывает из TStringGrid в файл Excel и сохраняет. нужно, чтобы считывало.

Работа с Excel в Delphi.
Еще раз здравствуйте, уже весь день ломаю голову над такой штукой: я работаю с xlm файлом, я из.

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


Работа с Excel (формулы) в Delphi
Добрый день! Нужна ваша помощь знатоки! ) Есть шаблон документа, я его заполняю и делаю.

Решение

для авто-подбора ширины столбца ? И как обвести выводимую таблицу ? Достаточно открыть MS Excel, запустить запись макроса, создать на листе обрамление для некоторой области ячеек. Затем, выполнить для какого-нибудь столбца автоподбор ширины и прервать запись макроса. После этого, в главном меню MS Excel 2003 выбираем: Сервис - Макрос. - Редактор Visual Basic - Откроется редактор VBA. В нём находим модуль с кодом макроса и изучаем какие команды использовались для тех действий на листе, которые мы сделали. Такие же команды надо вызывать в коде Delphi.
---
Вот пример, как запустить и подключиться к MS Excel, создать рабочую книгу и на первом листе этой книги оформить диапазон - с линовкой, и выравниваем ширины ячеек.
Для начала, в MS Excel записываем макрос и смотрим его код:
Теперь пишем код на Delphi и применяем в нём те же методы, которые были употреблены в макросе.
Окончательный код в Delphi получился таким:
Это полностью работающий код. На приложенном скриншоте показан результат работы программы.

Спасибо большое за развернутый ответ !

Добавлено через 31 минуту
Хотел бы узнать, а как обрамить рамкой ячейки автоматически (кол-во столбцов статическое, а вот строк не постоянное)?

Хотел бы узнать, а как обрамить рамкой ячейки автоматически (кол-во столбцов статическое, а вот строк не постоянное)? Здесь разные способы можно применить.
Наверное, лучше всего подсчитывать количество строк во время их записи на лист Excel. Пускай, например, нам известно, что левая верхняя ячейка, начиная с которой идёт запись на лист Excel, имеет координаты: номер строки = 5, номер столбца = 3. Всего столбцов в таблице: 10.
Тогда определить диапазон можно так:

Ещё можно использовать объекты, которые можно получить через свойства UsedRange и CurrentRegion. Но чтобы воспользоваться этими объектами и получить верный результат, нужно соблюсти некоторые условия.

Способ с применением UsedRange.
Если известно, что после записи таблицы на лист Excel, ниже таблицы нет ни одной используемой ячейки, то можно воспользоваться объектом UsedRange. UsedRange - это объект, представляющий диапазон, который охватывает все используемые ячейки на листе. Если в ячейку записано значение, формула или изменено её форматирование (шрифт, выравнивание, обрамление) - то такая ячейка является используемой.

Здесь:
UsedRange.Row - номер верхней строки в используемом диапазоне.
UsedRange.Rows.Count - общее количество строк в используемом диапазоне.

Способ с применением CurrentRange.
Под пустой ячейкой будем понимать ячейку, в которой не записано значение. В такой ячейке может быть записана формула или может быть изменено оформление.
Пускай нам известна координата хотябы одной ячейки внутри таблицы. И если известно, что непосредственно к таблице по её краям (сверху, снизу и по бокам) не примыкают какие-нибудь непустые ячейки и в таблице нет полностью пустых строк и полностью пустых столбцов. Тогда можно применить способ с CurrentRegion.




Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью. Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.

Для полноты картины нужно еще описать способ быстрого форматирования ячеек и показать скорость работы XLSReadWrite
Я для своих задач использую XML SpreadSheet. С радостью пересел бы на что-то иное.

Bogdan , вынеси на форуме просьбу о создании подобного раздела. Если Влад одобрит, то создаст. Можно пообсуждать конечно, в плане даже проверенных, рабочих дистрибутивов, общих вопросов, того-же FireMonkey и т.д. У меня есть пара дистрибутивов, но все руки не доходили, вечерком сегодня попробую, если инстол пройдет нормально, обязательно отпишусь с сылками от куда их брал.

Влад, надеюсь до конца дня скачаешь и отпишешься, ну или хотябы завтра, а скорость у тебя, относительно моей вообще в 3 раза выше ) думаю до завтра точно осилишь оставшиеся 20 % )

// Да прибудет с тобой сила, Влад!

Алекс, это переменная типа Variant

Чтение данных из Excel

ExcelApp.Workbooks.Open(edFile.Text); почему ругается наэту функцию?

Доброго времени суток. Подскажите как записать данные в разные столбики с разными именами

Я работаю с БД FireBird и экспортирую из рекордсета. и если там попадаются русские буквы, то он не пишет в ячейку вообще ничего

Спасибо за информацию. Вы очень мне помогли.

Рекомендуемая библиотека XLSReadWrite стоит 295 евро. Я как-то не готов пока к такой покупке.
Посоветуйте более доступные аналоги пожалуйста.

Как прочитать из документа EXCEL колонку, содержащую рисунок со штрих кодом, чтобы он прочитался как 13 цифр

Здравствуйте, Владислав. Честно говоря, я-не программист, но уж очень хочется для себя постичь эту тему. Много времени провожу в Вашем блоге, но пока получается стряпать только методом копи-паста. На данный момент работаю над программой, объединяющей данные из 2х документов типа Exele. Задача состоит в том чтоб открыть 2 документа, стартовать с определенной ячейки второго документа, получив ее значение, искать его в первом документе. Оба состоят из длинного списка на одном листе. Т.к. только начинаю программировать, выбрал способ по одной ячейке- скорость не особо важна. Но вот незадача- получив значение из второго документа, не пойму как активировать первый и искать в … Подробнее »

Работа с 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;

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