Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отчет в Excel, Передача данных из DBGrid в Excel 
:(
    Опции темы
Demo
  Дата 10.10.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Здравствуйте, уважаемые программисты!
У меня возникла необходимость данные из DBGrid (которые формируются  при помощи запроса) передать в Excel.
Пишу следующий код, Excel загружается, имя листу присваивается, но почему-то в ячейки вместо данных из Грида вставляются данные, которые были копированы ранее (притом неважно где, в Ворде, блокноте и т.д.).
Помогите, пожалуйста разобраться!
Подскажите, где у меня ошибка?

Код

var i1,i2,i3,i:integer;    bm:TBookmark;       
begin
  DBGrid1.DataSource.DataSet.DisableControls;
   bm:=DBGrid1.DataSource.DataSet.GetBookmark;
   DBGrid1.DataSource.DataSet.First;

  excelApplication:=CreateOleObject('Excel.Application');
  ExcelApplication.visible:=true;
  ExcelApplication.workBooks.add;
  ExcelApplication.workBooks[1].WorkSheets[1].Name:='Отчет';
  ExcelApplication.cells[1,1].value:='Заголовок';

  ExcelApplication.Columns[1].ColumnWidth:=13;
  
  DBGrid1.DataSource.DataSet.Next;
  ExcelApplication.WorkBooks[1].WorkSheets['Отчет'].Paste;

    DBGrid1.DataSource.DataSet.GotoBookmark(bm);
   DBGrid1.DataSource.DataSet.FreeBookmark(bm);
   DBGrid1.DataSource.DataSet.EnableControls;
   Screen.Cursor:=crDefault;

   Application.Restore;

end;


Заранее спасибо!
PM MAIL   Вверх
Genyaa
Дата 10.10.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Усердный
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.9.2006
Где: Москва

Репутация: нет
Всего: 11



  DBGrid1.DataSource.DataSet.Next;
  ExcelApplication.WorkBooks[1].WorkSheets['Отчет'].Paste;

Я не знаток DBGrid, но по сути в Excel метод Paste вставляет данные из ClipBoard (скопированные ранее по Copy или <Ctrl+C>). Что собственно и происходит, как Вы говорите.

По логике вещей, нужно либо сначала скопировать нужные данные из DBGrid в ClipBoard (чего как раз я и не наблюдаю в Вашем коде) и потом использовать Paste, либо использовать другие методы переноса данных (непосредственное присвоение значений ячейкам, например).
--------------------
Всякое решение плодит новые проблемы.
PM WWW   Вверх
Demo
Дата 11.10.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Данных в DBGride слишком много, поэтому присваивать значения ячейкам нецелесообразно.
А как можно скопировать данные из Грида? Но нужны не все поля из DBGrida, а выборочные!
Помогите, пожалуйста!!!
PM MAIL   Вверх
Demo
Дата 11.10.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Итак, данные из DBGrida я скопировала. Добавила следующий код:

Код

Memo1:= TMemo.Create(Self);
  Memo1.Visible := false;
  Memo1.Parent :=Form1;
  Memo1.Clear;
  sline := '';

    // добавила информацию для имен колонок
  for col := 0 to DBGrid1.FieldCount-1 do 
    sline := sline + DBGrid1.Fields[col].DisplayLabel + #9; 
  Memo1.Lines.Add(sline);

  // получение данных из Memo
  for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do 
  begin 
    sline := ''; 
    for col := 0 to DBGrid1.FieldCount-1 do 
      sline := sline + DBGrid1.Fields[col].AsString + #9; 
    Memo1.Lines.Add(sline);
    DBGrid1.DataSource.DataSet.Next; 
  end;

   Memo1.SelectAll;
   Memo1.CopyToClipboard;
 ExcelApplication.WorkBooks[1].WorkSheets['Отчет'].Paste;


  Здесь я данные отправляю сначала в Memo, а затем в Excel. Memo используется как промежуточный компонент. 
Но теперь другой вопрос: Как мне выбрать конкретные столбцы из DBGrid? В Excel можно, конечно, потом удалить лишние, но нужно, чтобы туда попадали только нужные данные.

И еще один вопрос: Можно при передаче данных перевернуть таблицу? Так, чтобы столбцы из DBGrid-а стали строками, а строки столбцами?
PM MAIL   Вверх
Genyaa
Дата 11.10.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Усердный
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.9.2006
Где: Москва

Репутация: нет
Всего: 11



Цитата(Demo @  11.10.2006,  10:19 Найти цитируемый пост)
  Здесь я данные отправляю сначала в Memo, а затем в Excel. Memo используется как промежуточный компонент. 
Но теперь другой вопрос: Как мне выбрать конкретные столбцы из DBGrid? 


На этапе "отправления" данных в Мемо нужно перемещать не все столбцы DBGrid, а только нужные. В цикле "отправления" данных проверяйте номера столбцов или их имена на предмет предназначения их к переносу в Excel.


Цитата(Demo @  11.10.2006,  10:19 Найти цитируемый пост)
И еще один вопрос: Можно при передаче данных перевернуть таблицу? Так, чтобы столбцы из DBGrid-а стали строками, а строки столбцами? 


Это зависит от того, в какой последовательности "отправляете данные в Мемо". Если вывернуть циклы "на изнанку" и внешним циклом поставить перебор колонок, а внутренним - перебор строк в DBGrid, то вы скопируете в Мемо уже транспонированную таблицу.

Но можно попробовать воспользоваться методом из Excel - PasteSpecial - этот метод (при верном указании параметров) позволяет сделать транспонирование скопированной таблицы на этапе вставки.
--------------------
Всякое решение плодит новые проблемы.
PM WWW   Вверх
Demo
Дата 27.11.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Цитата(Genyaa @ 11.10.2006,  10:47)
На этапе "отправления" данных в Мемо нужно перемещать не все столбцы DBGrid, а только нужные. В цикле "отправления" данных проверяйте номера столбцов или их имена на предмет предназначения их к переносу в Excel.

Подскажите, пожалуйста, как это должно выглядеть программно?! Каким образом мне это описать? Например, мне нужны столбцы 2,4,6,7,11?
PM MAIL   Вверх
mihanik
Дата 27.11.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: нет
Всего: 109



Модератор: Пожалуйста, один топик - один вопрос.

Понимаю, что вопросы связаны по смыслу, но всё же...

Добавлено @ 16:50 
Кроме того!
Это ближе к Delphi и базы данных...

Посему перемещаю...




--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Savek
Дата 27.11.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Использовать Clipboard для экспорта категорически не рекомендуется.
У пользователя там могут быть данные, которые будут утеряны smile 
PM MAIL   Вверх
Rodman
Дата 27.11.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



мож это поможет...
Код

//Пример dbgrid (DBGrid1) имеет всплывающее меню, которое позволяет две опции "Send to Excel" и "Copy"


// ЗАМЕЧАНИЕ: этот метод должен включать COMObj, Excel97 units

// ОБНОВЛЕНИЕ: если Вы используете Delphi 4, то замените xlWBatWorkSheet на 1 (один)


//-----------------------------------------------------------
// если toExcel = false, то экспортируем содержимое dbgrid в Clipboard
// если toExcel = true, то экспортируем содержимое dbgrid в Microsoft Excel
procedure ExportDBGrid(toExcel: Boolean);
var
bm: TBookmark;
col, row: Integer;
sline: String;
mem: TMemo;
ExcelApp: Variant;
begin
Screen.Cursor := crHourglass;
DBGrid1.DataSource.DataSet.DisableControls;
bm := DBGrid1.DataSource.DataSet.GetBookmark;
DBGrid1.DataSource.DataSet.First;

// создаём объект Excel
if toExcel then
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'Grid Data';
end;

// Сперва отправляем данные в memo
// работает быстрее, чем отправлять их напрямую в Excel
mem := TMemo.Create(Self);
mem.Visible := false;
mem.Parent := MainForm;
mem.Clear;
sline := '';

// добавляем информацию для имён колонок
for col := 0 to DBGrid1.FieldCount-1 do
sline := sline + DBGrid1.Fields[col].DisplayLabel + #9;
mem.Lines.Add(sline);

// получаем данные из memo
for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
sline := '';
for col := 0 to DBGrid1.FieldCount-1 do
sline := sline + DBGrid1.Fields[col].AsString + #9;
mem.Lines.Add(sline);
DBGrid1.DataSource.DataSet.Next;
end;

// копируем данные в clipboard
mem.SelectAll;
mem.CopyToClipboard;

// если необходимо, то отправляем их в Excel
// если нет, то они уже в буфере обмена
if toExcel then
begin
ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste;
ExcelApp.Visible := true;
end;

FreeAndNil(ExcelApp);
DBGrid1.DataSource.DataSet.GotoBookmark(bm);
DBGrid1.DataSource.DataSet.FreeBookmark(bm);
DBGrid1.DataSource.DataSet.EnableControls;
Screen.Cursor := crDefault;
end; 


Добавлено @ 17:10 
и тут почитай
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Akella
Дата 28.11.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



я уверен, что вопрос из этой темы http://forum.vingrad.ru/delphi-activex-com-corba-ole.html
Там это уже обсуждалось сотни раз

Добавлено @ 10:02 
Demo, и ещё, DBGrid тут не причём, т.к. DBGrid всего лишь отображает данные из TDataSet`а, с DataSet`ом и работай.

Добавлено @ 10:04 
Demo, вот, смотри, шикарная тема: http://forum.vingrad.ru/topic-84634.html

Это сообщение отредактировал(а) Akella - 28.11.2006, 10:03
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.