С помощью следующего кода, импортирую содержимое DBGrid в Excel:
var
XLApp,Sheet,Colum:Variant;
index,i:Integer;
begin
XLApp:= CreateOleObject('Excel.Application');
XLApp.Visible:=true;
XLApp.Workbooks.Add(-4167);
XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт';
Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Columns;
Colum.Columns[1].ColumnWidth:=20;
Colum.Columns[2].ColumnWidth:=20;
Colum.Columns[3].ColumnWidth:=20;
Colum.Columns[4].ColumnWidth:=20;
Colum.Columns[5].ColumnWidth:=20;
Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Rows;
Colum.Rows[2].Font.Bold:=true;
Colum.Rows[1].Font.Bold:=true;
Colum.Rows[1].Font.Color:=clBlue;
Colum.Rows[1].Font.Size:=14;
Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт'];
Sheet.Cells[1,2]:='Столбец №1';
Sheet.Cells[2,1]:='Столбец №2';
Sheet.Cells[2,2]:='Столбец №3';
Sheet.Cells[2,3]:='Столбец №4';
Sheet.Cells[2,4]:='Столбец №5';
Sheet.Cells[2,5]:='Столбец №6';
index:=3;
DataModule1.BookTable.First;
for i:=0 to DataModule1.BookTable.RecordCount-1 do
begin
Sheet.Cells[index,1]:=DataModule1.BookTable.Fields.Fields[1].AsString;
Sheet.Cells[index,2]:=DataModule1.BookTable.Fields.Fields[2].AsString;
Sheet.Cells[index,3]:=DataModule1.BookTable.Fields.Fields[3].AsString;
Sheet.Cells[index,4]:=DataModule1.BookTable.Fields.Fields[5].AsString;
Sheet.Cells[index,5]:=FormatDateTime('dddddd',
DataModule1.BookTable.Fields.Fields[6].AsDateTime);
Inc(index);
DataModule1.BookTable.Next;
end;
Constвыровняет столбец по центру.
xlCenter = $FFFFEFF4;
...
colum.Columns[2].HorizontalAlignment:=xlCenter;
Верно) Спасибо! А печать сетки задать в программе можно или только в Excel?
Все, что можно сделать в Excel, можно сделать и через OLE... Сейчас посмотрю...
Добавлено через 6 мин.
Update
Ну, скажем вот такую строку добавь:
XLApp.Workbooks[1].WorkSheets['Отчёт'].PageSetup.PrintGridLines := True;, это должно включить печать сетки.
Да, сетка печатается). И последний вопрос в этой теме, не настолько важный, но всетаки может возможно также задать в программе альбомную печать страницы, чтобы в Excel уже ничего не нужно было настраивать?
"Альбомная" - это Landscape?
// 1 = Landscape, 2 = Portrait
XLApp.Workbooks[1].WorkSheets['Отчёт'].PageSetup.Orientation := 1;
Только 1 = Portrait а 2 = Landscape.
А можно ли при нажатии одной кнопки перенести в Excel содержимое не только одной DBGrid, а сразу трех? Названия столбцов первой DBGrid общие для всех. Данные из двух других таблиц просто последовательно размещаются внизу друг за другом?
Если Гриды называются DBGrid1, DBGrid2, DBGrid3, то:
var gridIndex: Integer;Все просто на самом деле...
// ...
for gridIndex := 1 to 3 do
begin
with (FindComponent(Format('DBGrid%d', [gridIndex])) as TDbGrid).DataSource.DataSet do
begin
First;
while not Eof do
begin
Sheet.Cells[index,1]:=Fields.Fields[0].AsString;
Sheet.Cells[index,2]:=Fields.Fields[1].AsString;
Sheet.Cells[index,3]:=Fields.Fields[2].AsString;
Sheet.Cells[index,4]:=Fields.Fields[4].AsString;
Sheet.Cells[index,5]:=FormatDateTime('dddddd', Fields.Fields[6].AsDateTime);
Inc(index);
Next;
end;
end;
end;
В DBGrid есть некоторые данные, которые при переносе в Excel почему то искажаются. Например число 55555555555555555555 выглядит в Excel так: 5,55556Е+19, а 2 числа, записанных через запятую: 1559,5888888 отображаются так: 15 595 888 888. Из-за чего происходят такие изменения? Как сделать чтобы в Excel отображались данные именно так, как они выглядят в DBGrid?
Sheet.Cells[index,1]:=''''+Fields.Fields[0].AsString;... Правда тогда дюже умное творение Майкрософта начинает орать, что "Ошибка!!! Вместо числа записали строку!!!", но тебе все же лучше знать, что записывать, или я ошибаюсь? Я отключаю в настройках Оффиса всю эту супер-умную приблуду, и нормально работаю, КАК Я ХОЧУ, а не так, как мне диктует MS.
А где находятся настройки Оффиса и как отключить предупреждение об ошибке?
Ну, конкретно это предупреждение можно вот так отключить:
XLApp:= CreateOleObject('Excel.Application');Другие возможности описаны здесь: http://msdn.microsoft.com/en-us/library/aa661412%28office.10%29.aspx
XLApp.Visible:=true;
XLApp.Workbooks.Add(-4167);
XLApp.ErrorCheckingOptions.NumberAsText := false; // <---