Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод данных из SQL в Excel, [?] 
V
    Опции темы
Yantarik
  Дата 13.8.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте!
Я новичок в Дельфи. 
Не подскажите как вывести из SQL в Excel данные?
Желательно с использованием ADO.

Спасибо.
PM MAIL   Вверх
pseud
Дата 13.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



а поискать слабо?
Поиск по ветке слова "Excel"

Добавлено через 1 минуту и 51 секунду
если что-то конкретное будет не получаться - спрашивай


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 13.8.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



С этого я и начала smile
Ничего толкового(=понятное для меня) не нашла.
После чего зарегистрировалась.

PM MAIL   Вверх
SergeBS
Дата 13.8.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

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



Yantarik
Идешь на delphi world, скачиваешь тамошний хелп и читаешь. Хоть что-то да поймешь, поскольку там куча разных способов.
PM MAIL   Вверх
pseud
Дата 13.8.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Цитата(Yantarik @  13.8.2007,  12:33 Найти цитируемый пост)
 и начала


итак пример (для девушки ничего не жалко)

Допустим: у тебя есть ADOQuery1 в который по запросу SQL отобраны данные и кнопка Button1.
По нажатию на кнопку пишем такой код

Код

procedure TForm1.Button1Click(Sender: TObject);
const
  xlWBATWorksheet = -4167;
  xlContinuous = 1;
var
  XLApp: Variant;
  XLWorkbook: Variant;
  XLSheet: Variant;
  XLArrayData : OLEVariant;
  XLCellBegin: Variant;
  XLCellEnd: Variant;
  XLRange: Variant;

  iColumnsCount: Integer;
  iRowsCount: Integer;
  i: Integer;
  j: Integer;
begin


  try
    XLApp := CreateOleObject('Excel.Application'); //это чтоб нас никто не видел
    XLApp.Application.EnableEvents := False;   // Отключение событий Excel для ускорения экспорта
  except
    Application.MessageBox('Приложение MS Office Excel не найдено.', PChar(Self.Caption), MB_OK + MB_ICONERROR);
    Exit;
  end;

  try
    XLApp.DisplayAlerts := False;
    Screen.Cursor := crHourGlass;
    try
      XLWorkbook := XLApp.Workbooks.Add(xlWBATWorkSheet);
      XLSheet := XLWorkbook.Sheets[1];

      iRowsCount := ADOQuery1.RecordCount + 1; // + шапка

      iColumnsCount:= ADOQuery1.FieldCount;

      XLArrayData := VarArrayCreate([1, iRowsCount, 1, iColumnsCount], varVariant);

      ADOQuery1.First;

      // шапка
      for j:= 1 to iColumnsCount do
        XLArrayData[1, j] := ADOQuery1.Fields.Fields[j - 1].DisplayLabel;

      // данные
      for i := 2 to iRowsCount do
      begin
        for j:= 1 to iColumnsCount do
          XLArrayData[i, j] := ADOQuery1.Fields.Fields[j - 1].AsString;
        ADOQuery1.Next;
      end;

      XLCellBegin := XLSheet.Cells[1, 1];
      XLCellEnd := XLSheet.Cells[iRowsCount, iColumnsCount];

      XLRange := XLSheet.Range[XLCellBegin, XLCellEnd];
      XLRange.NumberFormat := '@';

      // передача массива данных в эксцель
      XLRange.Value := XLArrayData;

      // контуры таблицы
      XLRange.Borders.LineStyle := xlContinuous;

      for i:= 1 to iColumnsCount do
        XLSheet.Columns[i].AutoFit;

      XLApp.Visible := True;
    finally
      Self.Enabled:= True;
      Screen.Cursor := crDefault;
      XLApp.DisplayAlerts:= True;
      VarClear(XLArrayData);
    end;
  except
    XLApp.Quit;
    Application.MessageBox(PChar('Ошибка экспорта в Excel.'), PChar(Self.Caption), MB_OK + MB_ICONERROR);
  end;

end;


не забываем в uses добавить ComObj

P.S. код работает супер быстро, что обеспечено за счет передачи данных через вариантный массив
единственное что может заторомозить - это вывод контуров таблицы XLRange.Borders.LineStyle := xlContinuous;
поэтому на больших объемах данных лучше не юзать (если конечно важна скорость)



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 14.8.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пока написанный выше код не использовала. 
Нашла другой. После исправления параметров на свои, мне программа выдает ошибку:
"Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности проверьте значения всех состояний OLE DB"

Как это можно проверить?


И сразу вот такой еще вопрос № 2
Не очень понимаю вот это:
Код

ADOCommandForExcel.CommandText:='insert into [Телефоны] '+
'([Телефон], [Имя], [Улица], [Дом], [Корпус], [Квартира]) '+
' values' +
'(:pPhone, :pName, :pUl, :pHouse, :pKorp, :pFlat)';



То есть я понимаю: из таблицы Телефоны выбрать столбцы "Телефон", "Имя", "Улицу", "Дом", "Корпус", "Квартира", а вот что такое дальше?


Это сообщение отредактировал(а) Yantarik - 14.8.2007, 12:17
PM MAIL   Вверх
pseud
Дата 14.8.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



insert - вставить новую запись
select - выбрать записи
update - редактировать записи
delete - удалить записи

читаем основы SQL

Добавлено через 57 секунд
Цитата(Yantarik @  14.8.2007,  12:16 Найти цитируемый пост)
 мне программа выдает ошибку:


в каком месте?

Добавлено через 5 минут и 33 секунды
думаю тебе для начала пойдет это

Короткий справочник по SQL

P.S. ну очень короткий


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 15.8.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pseud @ 14.8.2007,  14:04)
Цитата(Yantarik @  14.8.2007,  12:16 Найти цитируемый пост)
 мне программа выдает ошибку:


в каком месте?


На  ADOConnectionForExcel.Open;

"insert - вставить новую запись
читаем основы SQL"
Сорри, с селектом перепутала. 

Про вопрос №2:
В очень кратком справочнике нет опсисаия термина(или что это?)
"values". 
Интуитивно я понимаю, что ":pName" - это переменная. НО откуда она берётся и почему перед ней ":" ?

PM MAIL   Вверх
pseud
Дата 15.8.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Цитата(Yantarik @  15.8.2007,  12:19 Найти цитируемый пост)
Про вопрос №2:


если тебе не нужен Insert, то не нужен и Values

выложи лучше свой нерабочий SQL 


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как раз Insert нужен smile
Код

procedure TForm1.BADOClick(Sender: TObject);
var
i:integer;
begin
SourceDatasetInit;
//выставляем параметры подключения для xls-ки
ADOConnectionForExcel.ConnectionString:=
'Provider=MSDASQL.1; '+
'Persist Security Info=False; '+
'Data Source=Файлы Excel; '+
'Location='+'"'+GetCurrentDir+'\1.xls'+'";'+
'Mode=ReadWrite; '+
'Initial Catalog='+'"'+GetCurrentDir+'\"';
ADOConnectionForExcel.DefaultDatabase:=GetCurrentDir+'\1.xls';
ADOConnectionForExcel.Open;
//создаем книгу
ADOCommandForExcel.CommandText:='create table [Телефоны] '+
' ([Телефон] char (100), '+
' [Имя] char (100), '+
' [Улица] char (100), '+
' [Дом] char (100), '+
' [Корпус] char (100), '+
' [Квартира] char (100)) ';
ADOCommandForExcel.Execute;
ADODataSetSource.First;
//собственно экспорт
//Настоятельно советую работать через параметры т.к. в данном случае это быстрее
ADOCommandForExcel.CommandText:='insert into [Телефоны] '+
'([Телефон], [Имя], [Улица], [Дом], [Корпус], [Квартира]) '+
' values' +
'(:pPhone, :pName, :pUl, :pHouse, :pKorp, :pFlat)';
if ADODataSetSource.RecordCount>0 then begin
repeat
for i:=0 to ADODataSetSource.FieldCount-1 do
  if ADODataSetSource.fields[i].Value=null then
  ADOCommandForExcel.Parameters[i].Value:=' '//на пустую строку '' ODBC ругается
                                      else
  ADOCommandForExcel.Parameters[i].Value:=ADODataSetSource.fields[i].AsString;
Application.ProcessMessages;
ADOCommandForExcel.Execute;
ADODataSetSource.Next;

until ADODataSetSource.Eof;
                                   end;// if ADODataSet1.RecordCount>0 then begin
showmessage('Экспорт завершен');
ADOConnectionForExcel.Close;
shellexecute(Application.Handle,'open',PAnsiChar(GetCurrentDir+'\1.xls'),nil,nil, sw_ShowNormal);

end;



С ошибкой  мы разобрались. 

PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И еще я не понимаю:
зачем создается еще одна таблица в базе, если мне надо, чтобы считывались данные и переносились(записывались) в Эксель?

PM MAIL   Вверх
pseud
Дата 16.8.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Yantarik
получи (+1) в репутацию за новый для меня способ экспорта в Excel пусть и сочиненный не тобой и не доконца тобой понятый smile
в базе таблиц не создается это создается именно файл Excel


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pseud @ 16.8.2007,  11:00)
в базе таблиц не создается это создается именно файл Excel

Так в том-то и дело, что у меня при переименовании таблицы создается новая таблица в базе.
Возможно надо что-то "особенное" указать в Object Inspector для ADOCommandForExcel.CommandText и ADOCommandForExcel.Execute. 
Сейчас у меня там ссылка(не знаю, как это правильно называется)  на базу.


И еще один вопрос:
Мне надо выгрузить всю таблицу.
В селекте это *, а вот в инсерте это как описывается? Нужно ли в данном случае перечисление столбцов(их около 30-40 штук) или можно как-то похоже с селектом описать?
PM MAIL   Вверх
pseud
Дата 16.8.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



вот она кучка проблем из твоего экспорта вылилась

можно конечно поковырять твой экспорт, но...
а почему не хочешь мной описанный способ испробовать?

1. он универсален
2. не создает новых таблиц в базе
3. Не нужно перечисление столбцов




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pseud @  16.8.2007,  12:07 Найти цитируемый пост)
а почему не хочешь мной описанный способ испробовать?

1. Потому что я его не понимаю совсем smile))
То есть мне нужно объяснять каждую строчку ,начиная с первых 4хзначных цифр: что это откуда берется? Я не знаю, кода прописывать свою базу и т.д.

Мой вариант с другой базой у меня на компе работал.  Но там было перечислимое множество столбцов. Здесь же я меняю под свою базу и все - создают новую таблицу в моей базе вместо того, чтобы вывыести в эксель.

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


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

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

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


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

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


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

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


 




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


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

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