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.

Регион ячеек таблицы 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 слово ‘Привет’ :

Загрузка данных из 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.

Delphi stringgrid в excel

procedure TfMainForm.N2Click(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
try
if OpenDlg.Execute then begin
Application.CreateForm(TfShowValues, fShowValues);
fShowValues.Caption := OpenDlg.FileName;

NomFich := OpenDlg.FileName;
IIndex := 1;
XLApp.Connect;

// ��������� ���� Excel
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
// ��� ����, ����� ����� ������� ����� (WorkSheet), �� ���� ����� �����
// � �������, �� ������������ ��������� �������� ������

// ���������� ����� ������� � TStringGrid
fShowValues.GenericStringGrid.ColCount := Y;
// ��������� Variant ���������� ����� � Delphi Variant Matrix
RangeMatrix := XLApp.Range[‘A1’,XLApp.Cells.Item[X,Y]].Value;
// ��������� Excel � ������������� �� �������
XLApp.Quit;
XLApp.Disconnect;
// ���� ��� ���������� TStringGrid
K := 1;
repeat
for R := 1 to Y do
fShowValues.GenericStringGrid.Cells[(R — 1),(K — 1)] := RangeMatrix[K,R];
Inc(K,1);
fShowValues.GenericStringGrid.RowCount := K + 1;
until
K > X;
// ����������� Delphi Variant Matrix
RangeMatrix := Unassigned;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
if OpenDialog1.Execute then
NomFich :=OpenDialog1.FileName;
IIndex := 1;
XLApp.Connect;
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
X := XLApp.ActiveCell.Row;
Y := XLApp.ActiveCell.Column;
StringGrid1.ColCount := Y;
RangeMatrix := XLApp.Range[‘A1’,XLApp.Cells.Item[X,Y]].Value;
XLApp.Quit;
XLApp.Disconnect;
K := 1;
repeat
for R := 1 to Y do
StringGrid1.Cells[(R — 1),(K — 1)] := RangeMatrix[K,R];
Inc(K,1);
StringGrid1.RowCount := K + 1;
until
K > X;
RangeMatrix := Unassigned;
end;

[Error] Unit1.pas(45): Not enough actual parameters
[Error] Unit1.pas(52): ‘[‘ expected but ‘;’ found

Delphi stringgrid в excel

function RefToCell(ARow, ACol: Integer ): string ;
begin
Result := Chr ( Ord ( ‘A’ ) + ACol — 1 ) + IntToStr (ARow);
end ;

Читать еще:  Как в excel прибавить к дате месяцы

function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string ): Boolean ;
const
xlWBATWorksheet = — 4167 ;
var
Row, Col: Integer ;
GridPrevFile: string ;
XLApp, Sheet, Data: OLEVariant;
i, j: Integer ;
begin
// Prepare Data
Data := VarArrayCreate([ 1 , AGrid.RowCount, 1 , AGrid.ColCount], varVariant);
for i := 0 to AGrid.ColCount — 1 do
for j := 0 to AGrid.RowCount — 1 do
Data[j + 1 , i + 1 ] := AGrid.Cells[i, j];
// Create Excel-OLE Object
Result := False ;
XLApp := CreateOleObject( ‘Excel.Application’ );
try
// Hide Excel
XLApp.Visible := False ;
// Add new Workbook
XLApp.Workbooks.Add(xlWBatWorkSheet);
Sheet := XLApp.Workbooks[ 1 ].WorkSheets[ 1 ];
Sheet.Name := ASheetName;
// Fill up the sheet
Sheet.Range[RefToCell( 1 , 1 ), RefToCell(AGrid.RowCount,
AGrid.ColCount)].Value := Data;
// Save Excel Worksheet
try
XLApp.Workbooks[ 1 ].SaveAs(AFileName);
Result := True ;
except
// Error ?
end ;
finally
// Quit Excel
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False ;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end ;
end ;
end ;

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word ;
const AValue: string );
var
L: Word ;
const
<$J+>
CXlsLabel: array [ 0 .. 5 ] of Word = ( $204 , 0 , 0 , 0 , 0 , 0 );
<$J->
begin
L := Length (AValue);
CXlsLabel[ 1 ] := 8 + L;
CXlsLabel[ 2 ] := ARow;
CXlsLabel[ 3 ] := ACol;
CXlsLabel[ 5 ] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf (CXlsLabel));
XlsStream.WriteBuffer( Pointer (AValue)^, L);
end ;

function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string ): Boolean ;
const
<$J+>CXlsBof: array [ 0 .. 5 ] of Word = ( $809 , 8 , 00 , $10 , 0 , 0 ); <$J->
CXlsEof: array [ 0 .. 1 ] of Word = ( $0A , 00 );
var
FStream: TFileStream;
I, J: Integer ;
begin
Result := False ;
FStream := TFileStream.Create( PChar (AFileName), fmCreate or fmOpenWrite);
try
CXlsBof[ 4 ] := 0 ;
FStream.WriteBuffer(CXlsBof, SizeOf (CXlsBof));
for i := 0 to AGrid.ColCount — 1 do
for j := 0 to AGrid.RowCount — 1 do
XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);
FStream.WriteBuffer(CXlsEof, SizeOf (CXlsEof));
Result := True ;
finally
FStream.Free;
end ;
end ;

// Hilfsfunktion fur StringGridToExcelSheet
// Helper function for StringGridToExcelSheet
function RefToCell(RowID, ColID: Integer ): string ;
var
ACount, APos: Integer ;
begin
ACount := ColID div 26 ;
APos := ColID mod 26 ;
if APos = 0 then
begin
ACount := ACount — 1 ;
APos := 26 ;
end ;

if ACount = 0 then
Result := Chr ( Ord ( ‘A’ ) + ColID — 1 ) + IntToStr (RowID);

if ACount = 1 then
Result := ‘A’ + Chr ( Ord ( ‘A’ ) + APos — 1 ) + IntToStr (RowID);

if ACount > 1 then
Result := Chr ( Ord ( ‘A’ ) + ACount — 1 ) + Chr ( Ord ( ‘A’ ) + APos — 1 ) + IntToStr (RowID);
end ;

// StringGrid Inhalt in Excel exportieren
// Export StringGrid contents to Excel
function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string ;
ShowExcel: Boolean ): Boolean ;
const
xlWBATWorksheet = — 4167 ;
var
SheetCount, SheetColCount, SheetRowCount, BookCount: Integer ;
XLApp, Sheet, Data: OLEVariant;
I, J, N, M: Integer ;
SaveFileName: string ;
begin
//notwendige Sheetanzahl feststellen
SheetCount := (Grid.ColCount div 256 ) + 1 ;
if Grid.ColCount mod 256 = 0 then
SheetCount := SheetCount — 1 ;
//notwendige Bookanzahl feststellen
BookCount := (Grid.RowCount div 65536 ) + 1 ;
if Grid.RowCount mod 65536 = 0 then
BookCount := BookCount — 1 ;

//Create Excel-OLE Object
Result := False ;
XLApp := CreateOleObject( ‘Excel.Application’ );
try
//Excelsheet anzeigen
if ShowExcel = False then
XLApp.Visible := False
else
XLApp.Visible := True ;
//Workbook hinzufugen
for M := 1 to BookCount do
begin
XLApp.Workbooks.Add(xlWBATWorksheet);
//Sheets anlegen
for N := 1 to SheetCount — 1 do
begin
XLApp.Worksheets.Add;
end ;
end ;
//Sheet ColAnzahl feststellen
if Grid.ColCount > Работа с MS Excel

Основная функция — передача данных из DataSet в Excel

Зависимости: ComObj, QDialogs, SysUtils, Variants, DB
Автор: Daun, daun@mail.kz
Copyright: daun
Дата: 5 октября 2002 г.
********************************************** >

uses ComObj, QDialogs, SysUtils, Variants, DB;

//** Открытие Excel
procedure ExcelCreateApplication(FirstSheetName : String ; //назв-е 1ого листа
SheetCount : Integer ; //кол-во листов
ExcelVisible : Boolean ); //отображение книги

//** Перевод номера столбца в букву, напр. 1=’A’,2=’B’. 28=’AB’
//** Должно работать до ‘ZZ’
function ExcelChar(Num : Integer ): String ;

//** Оформление указанного диапазона бордерами
procedure ExcelRangeBorders(RangeBorders : Variant ; //диапазон
BOutSideSize : Byte ; //толщина снаружи
BInsideSize : Byte ; //толщина внутри
BOutSideVerticalLeft : Boolean ;
BOutSideVerticalRight : Boolean ;
BInSideVertical : Boolean ;
BOutSideHorizUp : Boolean ;
BOutSideHorizDown : Boolean ;
BInSideHoriz : Boolean );

//** Форматирование диапазона (шрифт, размер)
procedure ExcelFormatRange(RangeFormat : Variant ;
Font : String ;
Size : Byte ;
AutoFit : Boolean );
//** Вывод DataSet
procedure ExcelGetDataSet(DataSet : TDataSet;
SheetNumber : Integer ; // Номер листа
FirstRow : Integer ; // Первая строка
FirstCol : Integer ; // Первый столбец
ShowCaptions : Boolean ; // Вывод заголовков DataSet
ShowNumbers : Boolean ; // Вывод номеров (N пп)
FirstNumber : Integer ; // Первый номер
ShowBorders : Boolean ; // Вывод бордюра
StepCol : Byte ; // Шаг колонок: 0-подряд,
// 1-через одну и тд
StepRow : Byte ); // Шаг строк

//** Меняет имя листа
procedure ExcelSetSheetName(SheetNumber : Byte ; //номер листа
SheetName : String ); //имя
//** Делает Excel видимым
procedure ExcelShow;

//** Сохранение книги
procedure ExcelSaveWorkBook(Name: String );

//** Открытие Ворда
procedure CreateWordAppl(WordVisible : Boolean );

//** Отображение Ворда
procedure MakeWordVisible;

//** Набор текста
procedure WordTypeText(s : String );

//** Новый параграф
procedure NewParag(Bold : Boolean ;
Italic : Boolean ;
ULine : Boolean ;
Alignment : Integer ;
FontSize : Integer );

var
Excel,Sheet,Range,Columns : Variant ;

MSWord, Selection : Variant ;

procedure ExcelCreateApplication(FirstSheetName : String ;
SheetCount : Integer ;
ExcelVisible : Boolean );
begin
try
Excel := CreateOleObject( ‘Excel.Application’ );
Excel.Application.EnableEvents := False ;
Excel.DisplayAlerts := False ;
Excel.SheetsInNewWorkbook := SheetCount;
Excel.Visible := ExcelVisible;
Excel.WorkBooks.Add;
Sheet := Excel.WorkBooks[ 1 ].Sheets[ 1 ];
Sheet.Name := FirstSheetName;
except
Exception.Create( ‘Error.’ );
Excel := UnAssigned;
end ;
end ;

Читать еще:  Высота ячейки в excel по содержимому

function ExcelChar(Num : Integer ): String ;
var
S : String ;
I : Integer ;
begin
I := Trunc (Num / 26 );
if Num > 26 then S := Chr (I + 64 ) + Chr (Num — (I * 26 ) + 64 )
else S := Chr (Num + 64 );
Result := S;
end ;

procedure ExcelRangeBorders(RangeBorders : Variant ;
BOutSideSize : Byte ;
BInsideSize : Byte ;
BOutSideVerticalLeft : Boolean ;
BOutSideVerticalRight : Boolean ;
BInSideVertical : Boolean ;
BOutSideHorizUp : Boolean ;
BOutSideHorizDown : Boolean ;
BInSideHoriz : Boolean );
begin
if BOutSideVerticalLeft then
begin
RangeBorders.Borders[ 7 ].LineStyle := 1 ;
RangeBorders.Borders[ 7 ].Weight := BOutSideSize;
RangeBorders.Borders[ 7 ].ColorIndex := — 4105 ;
end ;
if BOutSideHorizUp then
begin
RangeBorders.Borders[ 8 ].LineStyle := 1 ;
RangeBorders.Borders[ 8 ].Weight := BOutSideSize;
RangeBorders.Borders[ 8 ].ColorIndex := — 4105 ;
end ;
if BOutSideHorizDown then
begin
RangeBorders.Borders[ 9 ].LineStyle := 1 ;
RangeBorders.Borders[ 9 ].Weight := BOutSideSize;
RangeBorders.Borders[ 9 ].ColorIndex := — 4105 ;
end ;
if BOutSideVerticalRight then
begin
RangeBorders.Borders[ 10 ].LineStyle := 1 ;
RangeBorders.Borders[ 10 ].Weight := BOutSideSize;
RangeBorders.Borders[ 10 ].ColorIndex := — 4105 ;
end ;
if BInSideVertical then
begin
RangeBorders.Borders[ 11 ].LineStyle := 1 ;
RangeBorders.Borders[ 11 ].Weight := BInSideSize;
RangeBorders.Borders[ 11 ].ColorIndex := — 4105 ;
end ;
if BInsideHoriz then begin
RangeBorders.Borders[ 12 ].LineStyle := 1 ;
RangeBorders.Borders[ 12 ].Weight := BInSideSize;
RangeBorders.Borders[ 12 ].ColorIndex := — 4105 ;
end ;
end ;

procedure ExcelFormatRange(RangeFormat : Variant ;
Font : String ;
Size : Byte ;
AutoFit : Boolean );
begin
RangeFormat.Font.Name := ‘Arial’ ;
RangeFormat.Font.Size := 7 ;
if AutoFit then RangeFormat.Columns.AutoFit;
end ;

procedure ExcelSetSheetName(SheetNumber : Byte ;
SheetName : String );
begin
try
Sheet:=Excel.WorkBooks[ 1 ].Sheets[SheetNumber];
Sheet.Name := SheetName;
except
Exception.Create( ‘Error.’ );
Exit ;
end ;
end ;

procedure ExcelShow;
begin
Excel.Visible := True ;
Excel := UnAssigned;
end ;

procedure ExcelGetDataSet(DataSet : TDataSet;
SheetNumber : Integer ;
FirstRow : Integer ;
FirstCol : Integer ;
ShowCaptions : Boolean ;
ShowNumbers : Boolean ;
FirstNumber : Integer ;
ShowBorders : Boolean ;
StepCol : Byte ;
StepRow : Byte );
var
Column : Integer ;
Row : Integer ;
I : Integer ;
begin
if (ShowCaptions) and (FirstRow ftfloat
then Sheet.Cells[Row, Column] := Trim (Fields[i].DisplayText)
else Sheet.Cells[Row, Column] := Fields[i].Value;
Inc (Column, StepCol);
end ;
end ;
Inc (Row, StepRow);
Inc (FirstNumber);
;
end ;

if ShowBorders then
begin
if ShowCaptions then Dec (FirstRow);
if ShowNumbers then FirstCol := FirstCol — 1 ;
Range := Sheet.Range[ExcelChar(FirstCol) + IntToStr (FirstRow) +
‘:’ + ExcelChar(Column- 1 )+ IntToStr (Row — 1 )];
if (Row — FirstRow) < 2
then ExcelRangeBorders(Range, 3 , 2 , True , True ,
True , True , True , False )
else ExcelRangeBorders(Range, 3 , 2 , True , True ,
True , True , True , True );
ExcelFormatRange(Range, ‘Arial’ , 7 , True );
end ;

finally
EnableControls;
end ;
finally
end ;
end ;

Сохранение и загрузка, импорт и экспорт

Экспорт TStringGrid в Excel

Содержание материала

function RefToCell(ARow, ACol: Integer): string ;

Result := Chr(Ord( ‘A’ ) + ACol — 1 ) + IntToStr(ARow);

function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string ): Boolean;

Row, Col: Integer;

XLApp, Sheet, Data: OLEVariant;

Data := VarArrayCreate([ 1 , AGrid.RowCount, 1 , AGrid.ColCount], varVariant);

for i := 0 to AGrid.ColCount — 1 do

for j := 0 to AGrid.RowCount — 1 do

Data[j + 1 , i + 1 ] := AGrid.Cells[i, j];

// Create Excel-OLE Object

XLApp := CreateOleObject( ‘Excel.Application’ );

// Add new Workbook

Sheet := XLApp.Workbooks[ 1 ].WorkSheets[ 1 ];

Sheet. Name := ASheetName;

// Fill up the sheet

Sheet.Range[RefToCell( 1 , 1 ), RefToCell(AGrid.RowCount,

// Save Excel Worksheet

XLApp.Workbooks[ 1 ].SaveAs(AFileName);

if not VarIsEmpty(XLApp) then

procedure TForm1.Button1Click(Sender: TObject);

if SaveAsExcelFile(stringGrid1, ‘My Stringgrid Data’ , ‘c:MyExcelFile.xls’ ) then

ShowMessage( ‘StringGrid saved!’ );

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;

const AValue: string );

CXlsLabel: array [ 0 .. 5 ] of Word = ( $204 , 0 , 0 , 0 , 0 , 0 );

CXlsLabel[ 1 ] := 8 + L;

CXlsLabel[ 2 ] := ARow;

CXlsLabel[ 3 ] := ACol;

CXlsLabel[ 5 ] := L;

function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string ): Boolean;

<$J+>CXlsBof: array [ 0 .. 5 ] of Word = ( $809 , 8 , 00 , $10 , 0 , 0 );

CXlsEof: array [ 0 .. 1 ] of Word = ( $0A , 00 );

FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);

for i := 0 to AGrid.ColCount — 1 do

for j := 0 to AGrid.RowCount — 1 do

XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);

procedure TForm1.Button2Click(Sender: TObject);

if SaveAsExcelFile(StringGrid1, ‘c:MyExcelFile.xls’ ) then

ShowMessage( ‘StringGrid saved!’ );

// Hilfsfunktion fur StringGridToExcelSheet

// Helper function for StringGridToExcelSheet

function RefToCell(RowID, ColID: Integer): string ;

ACount, APos: Integer;

ACount := ColID div 26 ;

APos := ColID mod 26 ;

if APos = 0 then

ACount := ACount — 1 ;

if ACount = 0 then

Result := Chr(Ord( ‘A’ ) + ColID — 1 ) + IntToStr(RowID);

if ACount = 1 then

Result := ‘A’ + Chr(Ord( ‘A’ ) + APos — 1 ) + IntToStr(RowID);

if ACount > 1 then

Result := Chr(Ord( ‘A’ ) + ACount — 1 ) + Chr(Ord( ‘A’ ) + APos — 1 ) + IntToStr(RowID);

// StringGrid Inhalt in Excel exportieren

// Export StringGrid contents to Excel

function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string ;

ShowExcel: Boolean): Boolean;

SheetCount, SheetColCount, SheetRowCount, BookCount: Integer;

XLApp, Sheet, Data: OLEVariant;

I, J, N, M: Integer;

//notwendige Sheetanzahl feststellen

SheetCount := (Grid.ColCount div 256 ) + 1 ;

if Grid.ColCount mod 256 = 0 then

SheetCount := SheetCount — 1 ;

//notwendige Bookanzahl feststellen

BookCount := (Grid.RowCount div 65536 ) + 1 ;

if Grid.RowCount mod 65536 = 0 then

BookCount := BookCount — 1 ;

//Create Excel-OLE Object

XLApp := CreateOleObject( ‘Excel.Application’ );

if ShowExcel = False then

for M := 1 to BookCount do

for N := 1 to SheetCount — 1 do

//Sheet ColAnzahl feststellen

Добавить комментарий

Не использовать не нормативную лексику.

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

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

Похожие статьи

Ссылка на основную публикацию
Похожие публикации
Adblock
detector