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

Версия для печати

Конференция: Конференция iXBT.com (http://forum.ixbt.com/) Форум: Программирование (http://forum.ixbt.com/?id=26) URL: http://forum.ixbt.com/topic.cgi?id=26:19780 Время GMT +03. Даты в формате dd.mm.yyyy.
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;
begin
try
try
ExcelApplication1.Connect;
except
Error (‘Excel не інстальовано, це фатально’, false, false);
end;

ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Open(ExtractFilePath(Application.EXEName)+ ‘some.xls’,0,false,5,”,”,true, xlWindows,”,false,true,1,true,1));
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.WorkSheets[1] As _Worksheet);

ExcelWorkSheet1.Activate;
ExcelWorkSheet1.Visible[0] := 1;

except
on E: Exception do
begin
Error(‘Помилка’ + E.Message, false, false);
ExcelApplication1.Disconnect;
end;
end;
end;

procedure SaveToExcel;
var
i,j: integer;
begin
for i:=0 to StringGrid1.RowCount
for j:=0 to StringGrid1.ColCount
ExcelWorkSheet1.Cells.Item[i+1, j+1]:=Cells[i,j];
end;

Но лучше так не делать
Лучше для этого скинуть данные например в csv файл, или воспользоваться ADO – но тут не забудь D5
попатчить двумя ADOupdate для D5 Enterprise иначе глючить будет.

Добавление от 30.12.2002 14:12:

Предпоследняя строчка кода конешна же StringGrid1.Cells[i,j]

Добавление от 30.12.2002 14:13:

A error () – моя процедура в проге была, я часть кода с проги взял своей старой.

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

Причем тут буфер? точно ты тут не по теме.

Добавление от 31.12.2002 02:23:

delphi 5,6,7
excel 97,2000,xp с соответствующей версией делфи.

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
что такое _- ODBC ?

Добавление от 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
IIndex := 1;
ymax := len_ali+1;// количество строк в стринггриде
xmax := StringGrid1.ColCount-1;
xmin := 1;
ymin := 1;

TabGrid := VarArrayCreate([xmin,ymax,ymin,xmax],VarOleStr);
d := ymin;
repeat
for f := xmin to xmax do
TabGrid[d,f] := StringGrid1.Cells[f,d];
Inc(d,1);
until d > (ymax);

Источник: forum.ixbt.com

Загрузка данных из Excel в Delphi StringGrid или массив

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

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

В общем виде все сводится к подключению программы к файлу Excel, получению необходимого диапазона ячеек и присвоении вашему массиву значения заданного диапазона ячеек.

const
xlCellTypeLastCell = $0000000B;
var
ExcelApp, ExcelSheet: OLEVariant;
MyMass: Variant;
x, y: Integer;
begin
// создание OLE-объекта Excel
ExcelApp := CreateOleObject( ‘Excel.Application’ );

// открытие книги Excel
ExcelApp.Workbooks.Open( ‘C:my_excel.xls’ );

// открытие листа книги
ExcelSheet := ExcelApp.Workbooks[1].WorkSheets[1];

// выделение последней задействованной ячейки на листе
ExcelSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate;

// получение значений размера выбранного диапазона
x := ExcelApp.ActiveCell.Row;
y := ExcelApp.ActiveCell.Column;

// присвоение массиву диапазона ячеек на листе
MyMass := ExcelApp.Range[‘A1’, ExcelApp.Cells.Item[X, Y]].Value;

// закрытие книги и очистка переменных
ExcelApp.Quit;
ExcelApp := Unassigned;
ExcelSheet := Unassigned;
end ;

* Метод 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:
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 — ячейки будут перемещаться только при отпускании «бегунка»
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 — ячейки будут перемещаться только при отпускании «бегунка»
Font Шрифт отображения содержимого ячеек

Что бы управлять программно под свойствами свойства 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