Delphi stringgrid в excel
Delphi stringgrid в excel
Очень многие документы создаются и хранятся в формате электронных таблиц Microsoft Excel. Несмотря на то, что эти таблицы обладают возможностями для автоматической обработки документа, нам, дельфистам, гораздо приятнее работать в привычной среде, что которая и обладает к тому же гораздо более развитыми возможностями. Давайте посмотрим, как получать данные из Excel. Естественно, табличные данные будем размещать в привычную нам таблицу StringGrid.
Для работы с Excel и другими программами из пакета Microsoft Office необходимо добавить в список uses модуль ComObj:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ComObj;
Далее, описываем глобальную переменную типа Variant:
var
Form1: TForm1;
Excel: Variant;
Далее, нужно создать объект Excel. Excell Application создаётся пустым, без таблиц, поэтому необходимо добавить хотя бы одну книгу. Делать это нужно в каком-либо обработчике, например обработчике нажатия кнопки, хотя можно и сразу в OnCreate Формы:
Если создаётся пустая книга, метод Add применяется без параметра – без имени файла. Естественно, можно предложить пользователю выбрать файл:
with OpenDialog1 do
if Execute then
Excel.Application.WorkBooks.Add(FileName);
Для отладки необходимо, чтобы таблица Excel была видимой, а также лучше запретить задавать вопросы о сохранении данных при закрытии:
Excel.Visible:=True; //После отладки можно закомментировать эту строку
Excel.DisplayAlerts:=False;
Сразу создайте метод закрытия объекта Excel, иначе при отладке, да и при работе пользователя в компьютере наплодится столько невидимых процессов Excel, что мама дорогая. В обработчике OnCloseQuery Формы напишите:
Естественно, будет произведён выход из Excel, и затем закроется всё приложение. Но если нам нужно после закрытия процесса Excel продолжить работу с программой, то этот код помещается в обработчик нажатия кнопки. Однако, в данном случае его недостаточно. Попробуйте, и вы убедитесь, взглянув в список процессов в Диспетчере Задач, что наш процесс Excel жив и здоров! Это произошло потому, что он остаётся связанным с переменной, его создавшей (Excel же). Для реального уничтожения процесса нужно разорвать эту связь. Дополните вышеприведённый код строкой:
и при нажатии кнопки закрытия наш Excel исчезнет из списка процессов.
Теперь нужно получить данные из Excel. В Excel столбцы именуются буквами, но мы в Delphi обращаемся к ним привычно, по порядковым номерам. Обратите внимание, что, поскольку в Delphi первым в индексе идёт индекс столбца, а в таблице Excel индекс строки, то индексы должны быть расположены на противоположных местах. В обработчике нажатия кнопки:
with StringGrid1 do
for i:=1 to RowCount-1 do
for j:=1 to ColCount-1 do
Cells[j, i]:=Excel.WorkSheets.Item[‘Лист1’].Cells[i, j];
Маленькое предупреждение: если при отладке проверять внесение данных, то перед нажатием нашей кнопки нужно завершить ввод в Excel – нажать Enter. Ведь если ячейка таблицы Excel останется в режиме редактирования, то мы получим отказ от Excel.
И ещё. Данные в Excel адресуются начиная с 1. Попытка получить содержимое фиксированных ячеек не удаётся. Поэтому фиксированные ячейки в таблице StringGrid при необходимости нужно заполнять самому, отдельно.
А получить содержимое одной ячейки можно как указав номер строки и столбца, так и непосредственно указав адрес ячейки:
var S1, S2: String;
begin
S1:=Excel.WorkSheets.Item[‘Лист1’].Cells[5, 6];
S2:=Excel.WorkSheets.Item[‘Лист1’].Range[‘F5’];
end;
В переменных S1 и S2 будет одинаковое значение.
Теперь в таблице StringGrid мы имеем данные для обработки, и делаем с ними что хотим. Затем можно перенести обработанные данные назад в таблицу Excel. Делается это совершенно аналогично, в обработчике нажатия другой кнопки:
for i:=1 to Grid.RowCount-1 do
for j:=1 to Grid.ColCount-1 do
Excel.WorkSheets.Item[‘Лист1’].Cells[i, j]:=Grid.Cells[j, i];
Если эти операции производятся с активным листом Excel, то можно сократить написание, и вместо:
Или можно создать переменную и присвоить ей значение того листа Excel, с которым производится работа:
var Sheet: Variant;
S1, S2: String;
begin
Sheet:=Excel.WorkSheets.Item[‘Лист1’];
S1:=Sheet.Cells[5, 6];
S2:=Sheet.Range[‘F5’];
end;
Только имейте в виду, что таблица может содержать не только данные непосредственно в ячейках, но и формулы. При записи данных из нашей таблицы StringGrid всё, кроме непосредственно записываемого текста, будет уничтожено!
Напоследок нужно заставить таблицу Excel сохранить обработанные данные:
Excel.ActiveWorkbook.SaveAs(‘Имя_Файла’);// Или SaveAs(‘OpenDialog1.FileName’);
Можно вывести отчёт на печеть. Вот как задана функция печати:
function PrintOut(
From: Variant; //Необязательно. Номер срааницы с которой начинается печать.
To: Variant; //Необязательно. Номер страницы по какую продолжается печать.
Copies: Variant; //Необязательно. Количество копий.
Preview: Variant; //Необязательно. Предварительный просмотр (True или False).
ActivePrinter: Variant; //Необязательно. Имя активного принтера.
PrintToFile: Variant; //Необязательно. При значении True печать будет идти в файл.
Collate: Variant //Необязательно. При значении True копии страниц объединяются.
): Workbook;
Воспользоваться этой функцией можно как методом переменной, указывающей страницу – Sheet (также Excel.ActiveWorkBook или Excel.WorkSheets):
Sheet.PrintOut(1, 1, 1, False, True);
Будет произведён вывод на печать с первой страницы по первую, одной копии, без предварительного просмотра, без указания принтера – печать идёт в файл. Предварительно будет выдан запрос на указание имени файла. Создаётся файл типа *.xps. Для его просмотра нужны специальные программы.
Естественно, в Delphi можно осуществлять также и форматирование ячеек, и другие операции с таблицей Excel. Эту информацию добавлю чуть позже. А пока на первый раз достаточно.
Работа с регионом ячеек Excel
Продолжить хочу с того факта, что операции чтения и записи данных по одной ячейке занимают довольно много времени – вы уже и сами наверное заметили. Есть способ ускорить этот процесс. Для этого нужно освоить несложные операции работы с регионом ячеек Excel.
Регион ячеек таблицы Excel также имеет тип Variant и задаётся прямоугольником, с указанием левой верхней и правой нижней ячеек:
var Range: Variant;
begin
Range:=Excel.Range[Excel.Cells[1, 1], Excel.Cells[100, 100]];
end;
В частности, регион может состоять и из одной ячейки:
Range:=Excel.Range[Excel.Cells[1, 1], Excel.Cells[1, 1]];
Эту запись проще выполнить с указанием адреса как в таблице Excel:
Также можно задать и прямоугольный регион, если вам известны имена ячеек. Вот регион 4х4:
А вот как выполнить перепись региона 100Х100 ячеек Excel в таблицу StringGrid:
var Range: Variant;
i, j: Integer;
begin
Range:=Excel.Range[Excel.Cells[1, 1], Excel.Cells[100, 100]];
with StringGrid1 do
for i:=1 to 100 do
for j:=1 to 100 do
Cells[i, j]:=Range.Cells[j, i];
end;
Вот и всё! На моём компьютере, эта операция переписи региона 100х100 ячеек Excel в таблицу StringGrid длится около 300 мсек, что на 2 порядка быстрее, чем чтение и запись по одной ячейке.
А, например, операция занесения какого-либо одного значения во все ячейки региона выполняется ещё проще. Занесём в наш вышеопределённый регион 100х100 слово ‘Привет’ :
Источник: www.delphi-manual.ru
Delphi stringgrid в excel
Версия для печати
VIzaVI , 30.12.2002 12:52 |
Имеется: Delphi 5 Enterprise Требуется: содержимое stringgrid перекинуть в Excel (9 столбцов , 50 строк) также имеется шаблон книги в который собственно и требуется перекинуть эти строки Основной вопрос : Как Это сделать с использованием компонент Delphi tExcelApplication. и другие |
Просьба :
Не отсылайте на статьи для Дельфи 4 и без использования tExcelApplication;
Самый лучший вариант достать пример
я делел так:
<
.
procedure out_form1_excel;
var
y,x :word;
ISheet: Excel97.ExcelWorksheet;
IWorkbook: Excel97.ExcelWorkbook;
begin
with form1 do
begin
IWorkbook := AddWorkbook(cur+’list.xls’);
if Assigned(IXLSApp) then
begin
try
ISheet := IWorkbook.Worksheets.Item[‘Лист1’] as Excel97.ExcelWorksheet;
ISheet.range[‘A3′,’I’+inttostr(len_ali+1+4)].Borders.Color:=’0’;
for x:=1 to 9 do
for y:= 1 to len_ali+1 do
isheet.Cells.Item[y+3,x].Value :=form2.stringgrid1.Cells[x,y];
finally
ISheet := nil;
IWorkbook := nil;
end;
end;
end;
end;
.
>
как видно это пример без использования компонетнт и тут возникают глюки
в Экселе в какито ячейках появляется всякий мусор типа даты и тому подобное .
Помогите чем можете
1. Vertex , 30.12.2002 14:11 |
Ой зря ты собираешся юзать TExcelApplication – работает это просто отвратительно, особенно на Office XP.
procedure ConnectToExcel; ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Open(ExtractFilePath(Application.EXEName)+ ‘some.xls’,0,false,5,”,”,true, xlWindows,”,false,true,1,true,1)); ExcelWorkSheet1.Activate; except procedure SaveToExcel; Но лучше так не делать Добавление от 30.12.2002 14:12: Предпоследняя строчка кода конешна же StringGrid1.Cells[i,j] Добавление от 30.12.2002 14:13: |
2. VIzaVI , 30.12.2002 14:27 |
Vertex то что программа может глячить под офис Xp я даже и не задумался ![]() то что данные скинуть в csv это можно но я то использую эклель лишь для того чтоб qreport не юзать с ним проблем еще больше . т.е. я хочу сказать что мне нужно кинуть в эксель красиво оформить и распичатать а для этого Csv не годится ![]() а за текст кода спасибо , сегодня вечером попробую сделать что либо |
3. Vertex , 30.12.2002 15:53 |
Если важно чтоб не глючило – то забудь. Excel вообще по com двадцать раз октрыл-закрыл и он раз упал. Я попробывал пришел – в дикий ужас, глюки постоянные. Разве что ставить офис с кучей сервис-паков – 97 с тремя по-моему, 2000 с двумя SP – может поможет. |
4. wise_kaa , 30.12.2002 16:05 |
Вот так:
Вроде, все время работало |
5. VIzaVI , 30.12.2002 16:34 |
wise_kaa только что проверил . ![]() вылетает с ошибкой = “OLE error 800a03ec” и даже эксель не открывает |
6. Cthutq , 30.12.2002 17:38 |
для того чтоб qreport не юзать с ним проблем еще больше . Работал с qreport (даже делал субкласс Preview) но особых проблем не имел. А Геленджик – хороший город. С новым годом! |
7. spliner , 30.12.2002 21:31 |
Это все тормозные методы. Может я и не по теме, но самый быстрый способ заполнить таблицу Экселя из Дельфей – Через буфер обмена. Создаем длинную строку PChar, кажется. Вставляем в нужные места этой строки символы табуляции и перевода строк —> в буфер. В экселе – из буфера.. Я Dll -ки Дельфийские писал и так использовал.. StringList тоже хорошо вставляеся (символы табуляции в строке для разделения по столбцам). А работа с ячейками – тааакие тормоза.. Для красоты можно исходный буфер сохранить, а потом восстановить. Но зачем? Он на то и буфер.. |
8. Vertex , 30.12.2002 23:43 |
-> spliner
Причем тут буфер? точно ты тут не по теме. |
9. Darkman , 31.12.2002 02:22 |
10. Alexil , 31.12.2002 07:02 |
VIzaVI Посмотри на www.torry.net библиотеку FlexCel – настоятельно рекомендуется всем отчетостроителям в Excel. С наступающим! |
11. jonik pegas , 31.12.2002 09:19 |
spliner прав, работа через буфер обмена-наилучшее решение, заполнять одиночные ячейки-тормоза. См www.delphikingdom.com, статьи “по волнам интеграции”, там есть пример. Еще вариант-работа непосредственно с файлом *.xls через ODBC, если не требуются сложное форматирование.
Всех с Новым Годом. |
12. VIzaVI , 31.12.2002 10:29 |
spliner буфер это тоже интресно хотя и не совсем то что я имел в виду ![]() но в самом запущенном случаи почему бы и нет благо шаблон имеется .. Добавление от 31.12.2002 10:35: FlexCel -это конечно хорошо , но самому еще лучше ! Добавление от 31.12.2002 10:39: jonik pegas Добавление от 31.12.2002 10:52: spliner |
13. Darkman , 31.12.2002 11:02 |
VIzaVI так а я о чем? ![]() |
14. VIzaVI , 31.12.2002 11:53 | ||||||||||||||||||||||||||||||||||||||||||||||||
Darkman Спасибо, я переработал немного код под свои нужды и сейчас он (код) в принцепе работает ![]() . а вот он и сам procedure TForm1.SpeedButton6Click(Sender: TObject); var i, j, k : integer; val1, val2 : string; WorkBk : _WorkBook; WorkSheet : _WorkSheet; d, f : Integer; xmax,ymax : integer; xmin,ymin : integer; IIndex : OleVariant; TabGrid : Variant; begin with form2 do begin TabGrid := VarArrayCreate([xmin,ymax,ymin,xmax],VarOleStr); Источник: forum.ixbt.com Загрузка данных из Excel в Delphi StringGrid или массивДовольно распространенная задача в программировании – загрузка данных в проект из внешнего файла. В отличие от загрузки из обычного текстового файла, загрузка из Excel, как и любого другого специального файла или подключение к базе данных, требует отдельного механизма реализации. В данной статье рассматривается один из наиболее удобных способов работы с подгружаемыми из Excel данными. Значения всех ячеек страницы Excel вносятся в двумерный массив типа Variant. Затем с этим массивом уже можно работать любыми привычными способами. В общем виде все сводится к подключению программы к файлу Excel, получению необходимого диапазона ячеек и присвоении вашему массиву значения заданного диапазона ячеек. const // открытие книги Excel // открытие листа книги // выделение последней задействованной ячейки на листе // получение значений размера выбранного диапазона // присвоение массиву диапазона ячеек на листе // закрытие книги и очистка переменных * Метод SpecialCells используется для выделения определенных ячеек на основании оценки их содержимого или других характеристик. Применяемое здесь значение параметра-константы xlCellTypeLastCell указывает методу выделить последнюю ячейку используемого диапазона, т.е. саму нижнюю правую ячейку в диапазоне, где введено хоть какое-то значение. Это позволяет копировать не все ячейки листа, а лишь диапазон, содержащий какие-либо данные. Для использования команд работы с OLE-объектами для этого кода нужно добавить библиотеку: После указанных операций данные введены в массив, из которого их можно перенести в компонент StringGrid или использовать их по своему усмотрению. Стоит заметить, что в полученном таким образом массиве данные индексы располагаются в следующем порядке: [номер строки, номер столбца]. Это видно из следующего примера вывода данных массива в компонент StringGrid. Источник: space-base.ru StringGridКомпонент delphi StringGrid предназначен для отображения данных в табличной форме, при размещении его на форме он принимает вид изображенным на рисунке 1. Из названия следует что в ячейках компонента StringGrid могут содержаться данные, типа String, и отображать графику. Таблица StringGrid может быть только для чтения и редактирования, и состоит из выделенных серым зафиксированных ячеек-заголовков (FixedCols и FixedRows) недоступных для редактирования (меняется только программно), и белых ячеек имеющие возможность редактирования благодаря свойству Options. Для доступа к ячейкам программно используется StringGrid1.Cells[i, j] где i — номер столбца, а j — номер строки. А для доступа к выделенным ячейкам используется S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; где StringGrid1.Col — номер столбца, StringGrid1.Row — номер строки, s — данные выделенной ячейки. Иногда нам необходимо загрузить данные из Excel для такой возможности необходимо добавить в uses модуль ComObj, далее описать глобальную перемененную типа Variant: Далее, нам нужно создать объект Excel. Так как Excell Application создаётся пустым то необходимо добавить хотя бы одну книгу. Делаем это все в каком нибудь обработчике например в OnCreate формы Excel:=CreateOleObject(‘Excel.Application’); Excel.Application.WorkBooks.Add(‘ИмяФайла.xls’); Теперь получаем данные из Excel. Следует обратить внимание на то, что в Delphi первым в индексе стоит номер столбца, а в Excel номер строки, то индексы должны располагаться на противоположных местах. Для получения данных из Excel в обработчике например нажатия кнопки вписываем код Свойства StringGrid
|
||||||||||||||||||||||||||||||||||||||||||||||||
Font | Шрифт отображения содержимого ячеек |
Что бы управлять программно под свойствами свойства option необходимо использовать
StringGrid1.Options:=StringGrid1.Options+[имя под свойств свойства Option]; включает
StringGrid1.Options:=StringGrid1.Options-[имя под свойств свойства Option]; Выключает
для включения сразу нескольких подсвойств необходимо использовать
StringGrid1.Options:=[список под свойств свойства Option разделенных между собой запятой];
Источник: www.h-delphi.ru
StringGrid
Компонент delphi StringGrid предназначен для отображения данных в табличной форме, при размещении его на форме он принимает вид изображенным на рисунке 1.
Из названия следует что в ячейках компонента StringGrid могут содержаться данные, типа String, и отображать графику. Таблица StringGrid может быть только для чтения и редактирования, и состоит из выделенных серым зафиксированных ячеек-заголовков (FixedCols и FixedRows) недоступных для редактирования (меняется только программно), и белых ячеек имеющие возможность редактирования благодаря свойству Options. Для доступа к ячейкам программно используется StringGrid1.Cells[i, j] где i — номер столбца, а j — номер строки.
А для доступа к выделенным ячейкам используется S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; где StringGrid1.Col — номер столбца, StringGrid1.Row — номер строки, s — данные выделенной ячейки.
Иногда нам необходимо загрузить данные из Excel для такой возможности необходимо добавить в uses модуль ComObj, далее описать глобальную перемененную типа Variant:
var Excel: Variant;
Далее, нам нужно создать объект Excel. Так как Excell Application создаётся пустым то необходимо добавить хотя бы одну книгу. Делаем это все в каком нибудь обработчике например в OnCreate формы Excel:=CreateOleObject(‘Excel.Application’); Excel.Application.WorkBooks.Add(‘ИмяФайла.xls’);
Теперь получаем данные из Excel. Следует обратить внимание на то, что в Delphi первым в индексе стоит номер столбца, а в Excel номер строки, то индексы должны располагаться на противоположных местах. Для получения данных из Excel в обработчике например нажатия кнопки вписываем код
with StringGrid1 do
for i:=1 to RowCount-1 do
for j:=1 to ColCount-1 do
Cells[j, i]:=Excel.WorkSheets.Item[‘Лист1’].Cells[i, j];
Для записи наших данных из таблицы StringGrid в Excel нужно воспользоваться другим кодом
for i:=1 to Grid.RowCount-1 do
for j:=1 to Grid.ColCount-1 do
Excel.WorkSheets.Item[‘Лист1’].Cells[i, j]:=Grid.Cells[j, i];
Ну естественно если нужно сохранить данные внесенные в таблицу Excel то дописываем
Excel.ActiveWorkbook.SaveAs(‘ИмяФайла’);
Свойства StringGrid
ColCount | количество колонок в таблице |
RowCount | количество строк в таблице |
DefaultColWidth | ширина колонок в таблице |
DefaultRowHeight | высота строк в таблице |
FixedCols | количество зафиксированных колонок слева таблицы |
FixedRows | количество зафиксированных колонок сверху таблицы |
Cells | двумерный массив. Ячеек таблицы, находящихся на пересечении столбца(col) и строки(row)соответствует элементу cells[col, row] |
GridLineWidth | ширина линии ограничивающиая ячейки таблицы |
Options | если значение элементов описанных ниже равно True, то они присутствует, если False — то нет |
goFixedVertLine | вертикальные разделительные линии между «фиксированными» ячейками |
goFixedHorzLine | горизонтальные разделительные линии между «фиксированными» ячейками |
goVertLine | вертикальные разделительные линии между «обычными» ячейками |
goHorzLine | горизонтальные разделительные линии между «обычными» ячейками |
goRangeSelect | дает возможность выделить диапазон ячеек таблицы |
goDrawFocusSelected | дает возможность закрашивания ячейки с фокусом |
goRowSizing | дает возможность менять высоту строк с помощью мыши |
goColSizing | дает возможность менять ширину столбцов с помощью мыши |
goRowMoving | дает возможность менять номер строки, т.е. перемещать её с помощью мыши |
goColMoving | дает возможность менять номер столбца, т. е. перемещать его с помощью мыши |
goEditing | дает возможность редактирования содержимого ячейки |
goTabs | при True фокус будет смещаться на следующую ячейку, при False — на следующий компонент |
goRowSelect | дает возможность выделять всю строку с «фокусированной» ячейкой |
goAlwaysShowEditor | если True содержимое ячейки при фокусе сразу будет доступно редактированию, а при False — сначала нужно щёлкнуть по ячейке мышкой |
goThumbTracking | при True перемещение полосы прокрутки мышкой будет вызываться немедленное перемещение ячеек, а при False — ячейки будут перемещаться только при отпускании «бегунка» |
Что бы управлять программно под свойствами свойства option необходимо использовать
StringGrid1.Options:=StringGrid1.Options+[имя под свойств свойства Option]; включает
StringGrid1.Options:=StringGrid1.Options-[имя под свойств свойства Option]; Выключает
для включения сразу нескольких подсвойств необходимо использовать
StringGrid1.Options:=[список под свойств свойства Option разделенных между собой запятой];
Источник: www.h-delphi.ru
Канал в Telegram
Вы здесь
Экспорт данных в Excel из Delphi
В прошлой статье (Читаем файл Excel (xls) в Delphi) был рассмотрен способ чтения данных из xls файла и его импорт в Delphi. Теперь перейдем к сохранению, т.е. к экспорту данных из Delphi. Экспорт, как и импорт, будет осуществляться через посредника, т.е. Excel. Поэтому для работы приложения потребуется установленная копия MS Excel 2003-2010 (выше не тестировал).
Добавьте на форму кнопку, диалог сохранения, и таблицу StringGrid. Для того чтоб появилась возможность редактирования таблицы StringGrid необходимо в ее свойствах включить опцию goEditing:
Визуальные приготовления для нашего примера готовы. Переходим к написанию кода.
Как и в случае чтения xls нам понадобится библиотека ComObj. Добавьте ее в uses. Ниже приведен листинг процедуры экспорта, добавьте его после ключевого слова implementation.
procedure Xls_Save(XLSFile:string; Grid:TStringGrid);
const
xlExcel9795 = $0000002B;
xlExcel8 = 56;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;
begin
//создаем объект Excel
ExlApp := CreateOleObject(‘Excel.Application’);
//делаем окно Excel невидимым
ExlApp.Visible := false;
//создаем книгу для экспорта
ExlApp.Workbooks.Add;
//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, в который будем осуществлять экспорт
Sheet := ExlApp.Workbooks[1].WorkSheets[1];
//задаем имя листу
Sheet.name:=’Данные_из_Delphi’;
//считываем кол-во столбцов и строк в StringGrid
r:=Grid.RowCount;
c:=Grid.ColCount;
//считываем значение из каждой ячейки и отправляем в таблицу Excel
for j:= 1 to r do
for i:= 1 to c do
sheet.cells[j,i]:=Grid.Cells[i-1,j-1];
//отключаем все предупреждения Excel
ExlApp.DisplayAlerts := False;
//обработка исключения при сохраннении файла
try
//формат xls 97-2003 если установлен 2003 Excel
ExlApp.Workbooks[1].saveas(XLSFile, xlExcel9795);
showmessage(‘Файл сохранил 2003-ий офис’);
except
//формат xls 97-2003 если установлен 2007-2010 Excel
ExlApp.Workbooks[1].saveas(XLSFile, xlExcel8);
showmessage(‘Файл сохранил 2007 или 2010-ый офис’);
end;
//закрываем приложение Excel
ExlApp.Quit;
//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;
end;
Алгоритм работы процедуры:
- Создаем ссылку на объект и записываем ее в переменную ExlApp := CreateOleObject(‘Excel.Application’);
- С помощью ExlApp.Workbooks.Add; создаем пустую книгу в Excel (книга скрыта командой ExlApp.Visible := false;). По умолчанию книга содержит 3 листа. Если в Add добавить параметр 1 (ExlApp.Workbooks.Add(1)), то будет создана книга с одним листом.
- Далее код похож на чтение, только в цикле мы меняем присваемые значения. Теперь копируются значения из таблицы Delphi (StringGrid) в лист Excel.
- Команда ExlApp.DisplayAlerts := False отключает все сообщения Excel. В нашем случае это отключит сообщение («Книга уже существует! Хотите ее перезаписать?») возникающее при перезаписи уже существующего файла. Если этого не сделать, то при ответе «Нет», возникнет ошибка, а так файл будет «молча» перезаписан.
- Далее следует обработка исключения. У меня установлены две версии Excel (2003 и 2010) и был обнаружен такой момент, что значения типа файла, отправляемые команде SaveAs, отличаются в этих версиях, из-за чего возникает ошибка сохранения. В конструкции TryExcept описаны варианты сохранения. Если на компьютере пользователя установлена версия Excel 2003, то будет выполнена команда ExlApp.Workbooks[1].saveas(XLSFile, xlExcel9795), где xlExcel9795 – значение типа xls файла 95-2003. Иначе, если возникла ошибка при сохранении в первом случае, то будет выполнена команда ExlApp.Workbooks[1].saveas(XLSFile, xlExcel8). В 2007-2010 значение xlExcel8 соответствует типу «Excel 97-2003 (.xls)». Важный момент: Исключение обрабатывается при запускеEXE проекта, в режиме разработки работа приложения завершится ошибкой.
- Команда ExlApp.Workbooks[1].saveas(XLSFile, ‘Значение типа выходного файла’) выполняет сохранение файла с именем XLSFile и заданным значением типа.
Вот и все. С полным листингом проекта Вы можете ознакомиться, скачав приложенный ниже архив. Так же в архиве содержится список констант типов, позволяющий по желанию расширить список экспортируемых типов доступных Excel.
Источник: www.programm-school.ru