IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Особенности импорта данных в Exel - ?
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


С помощью следующего кода, импортирую содержимое 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;

Но при печати данные в разных столбцах ничем не разграничены и сливаются. Можно ли как-нибудь в программе заранее задать чтобы все печаталось с сеткой, или данные в некоторых столбцах выровнять по центру. Добавляю в код:
colum.Columns[2].HorizontalAlignment:=tacenter;
Но почему то после этого все данные прижимаются к левой границе ячеек. Подскажите, можно ли для решения проблемы внести изменения в этот код, или воспользоваться каким-нибудь другим вариантом?

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Добавляю в код:
colum.Columns[2].HorizontalAlignment:=tacenter;
Но почему то после этого все данные прижимаются к левой границе ячеек.
Собственно, почему taCenter? У Экселя свои константы для выравнивания.
Const
xlCenter = $FFFFEFF4;
...
colum.Columns[2].HorizontalAlignment:=xlCenter;
выровняет столбец по центру.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Верно) Спасибо! А печать сетки задать в программе можно или только в Excel?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Все, что можно сделать в Excel, можно сделать и через OLE... Сейчас посмотрю...

Добавлено через 6 мин.
Update
Ну, скажем вот такую строку добавь:
  XLApp.Workbooks[1].WorkSheets['Отчёт'].PageSetup.PrintGridLines := True;
, это должно включить печать сетки.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Да, сетка печатается). И последний вопрос в этой теме, не настолько важный, но всетаки может возможно также задать в программе альбомную печать страницы, чтобы в Excel уже ничего не нужно было настраивать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






"Альбомная" - это Landscape?
// 1 = Landscape, 2 = Portrait
XLApp.Workbooks[1].WorkSheets['Отчёт'].PageSetup.Orientation := 1;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


good.gif Только 1 = Portrait а 2 = Landscape.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


А можно ли при нажатии одной кнопки перенести в Excel содержимое не только одной DBGrid, а сразу трех? Названия столбцов первой DBGrid общие для всех. Данные из двух других таблиц просто последовательно размещаются внизу друг за другом?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Если Гриды называются 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 общие для всех
Это не столь важно. Важно, чтобы названия полей в DataSource у всех этих DBGrid-ов были общими. Вот если они разные - то придется действовать по технологии Copy+Paste...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


В DBGrid есть некоторые данные, которые при переносе в Excel почему то искажаются. Например число 55555555555555555555 выглядит в Excel так: 5,55556Е+19, а 2 числа, записанных через запятую: 1559,5888888 отображаются так: 15 595 888 888. Из-за чего происходят такие изменения? Как сделать чтобы в Excel отображались данные именно так, как они выглядят в DBGrid?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
Из-за чего происходят такие изменения? Как сделать чтобы в Excel отображались данные именно так, как они выглядят в DBGrid?
Установить клеткам формат Text, а не Number (что устанавливается по умолчанию). Добавь апостроф перед строкой, которую передаешь в Excel:
Sheet.Cells[index,1]:=''''+Fields.Fields[0].AsString;
... Правда тогда дюже умное творение Майкрософта начинает орать, что "Ошибка!!! Вместо числа записали строку!!!", но тебе все же лучше знать, что записывать, или я ошибаюсь? Я отключаю в настройках Оффиса всю эту супер-умную приблуду, и нормально работаю, КАК Я ХОЧУ, а не так, как мне диктует MS.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


А где находятся настройки Оффиса и как отключить предупреждение об ошибке?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Ну, конкретно это предупреждение можно вот так отключить:
  XLApp:= CreateOleObject('Excel.Application');
XLApp.Visible:=true;
XLApp.Workbooks.Add(-4167);
XLApp.ErrorCheckingOptions.NumberAsText := false; // <---
Другие возможности описаны здесь: MSDN -> ErrorCheckingOptions Object
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 18:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name