Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.10.2015, 00:09
kucher kucher вне форума
Прохожий
 
Регистрация: 16.09.2015
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Экспорт Отчётов в Excel из ADOQuery

МОЖЕТ КТО_НИБУДЬ СТАЛКИВАЛСЯ!
имеется такой код для создания отчётов чисто по таблице!
а как сделать универсальный (ЕСЛИ ЭТО ВООБЩЕ ВОЗМОЖНО) экспорт отчётов по ЗАПРОСАМ ADOQuery
ВОТ САМ КОД
Код:
procedure TfMain.Button9Click(Sender: TObject);
Var
XLApp,Sheet,Colum:Variant;
index,i:integer;
begin
    XLApp:=CreateOLEObject('Excel.Application'); //Строка создаёт объект Excel и записывает его в переменную
    XLApp.Visible:=true; //объект видимый EXcel
    XLApp.Workbooks.Add(-4167); //Excel состоит из книг (страниц), которые мы добавляем.
    //Число - константа, менять нельзя
 
    //Функция, которая создаёт OLE-объекты позволяет наладить связь с другим приложением
    XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт';
    Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Columns;
 
   //Ширина столбцов
    Colum.Columns[2].ColumnWidth:=30;
    Colum.Columns[3].ColumnWidth:=20;
    Colum.Columns[4].ColumnWidth:=20;
    Colum.Columns[5].ColumnWidth:=20;
    Colum.Columns[6].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:=clRed;  //Цвет строки
    Colum.Rows[1].Font.Size:=14;      //Размер шрифта
 
    Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт']; //Указатель на лист
    Sheet.Cells[1,2]:='Заказы'; // Название таблицы
    Sheet.Cells[2,1]:='ИдКлиента';
    Sheet.Cells[2,2]:='ИдТовара';                    //Шапка таблицы
    Sheet.Cells[2,3]:='ДатаЗаказа';
    Sheet.Cells[2,4]:='Срочность';
    Sheet.Cells[2,5]:='Колличество';
 
    fDM.TZakaziData.First;
    index:=3;
    //Цикл для вывода данных таблицы
    for i:=0 to fDM.TZakaziData.RecordCount do begin
    //Наполнение таблицы
    sheet.Cells[index,1]:=fDM.TZakaziData.Fields.Fields[1].AsString;
    sheet.Cells[index,2]:=fDM.TZakaziData.Fields.Fields[2].AsString;
    sheet.Cells[index,3]:=fDM.TZakaziData.Fields.Fields[3].AsString;
    sheet.Cells[index,4]:=fDM.TZakaziData.Fields.Fields[4].AsString;
    sheet.Cells[index,5]:=fDM.TZakaziData.Fields.Fields[5].AsString;
    Inc(index);
    fDM.TZakaziData.Next; //Переход на следующую строку
    end;  end;
Ответить с цитированием
  #2  
Старый 22.10.2015, 05:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Нету здесь отчёта, есть прямой вывод данных в экзель, отчёт - это немного другое, с применением операций над содержимым. В приведенной выше процедуре жима кнопки лишние действия детектед, напр. в цикле наполнения переменную index можно и выкинуть, начав цикл не с нуля, а сразу с тройки, да и возможен выход из диапазона RecordCount... Что касается универсальности отчётов по запросу, пользуйте для этого специальные генераторы, но и они не могут знать заранее что им подсунут в качестве наполнителя, всёравно шаблон ручками набивать предварительно придётся, хотя конечно, название\кол-во полей и их физические размеры можно задать и автоматом, но в этом случае получится лишь черновик, красоты полноценного отчёта к сожалению, с первой попытки трудно добиться
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
kucher (22.10.2015)
  #3  
Старый 22.10.2015, 10:39
kucher kucher вне форума
Прохожий
 
Регистрация: 16.09.2015
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

вроеде как должен работать код
Код:
procedure TForm1.Button1Click(Sender: TObject);
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:='Отчёт';
 
 Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт'];
 
for i := 1 to fDM.DSQuery1.Fields.Count do
  Sheet.Cells[1,i]:= fDM.DSQuery1.Fields[i].FieldName;

fDM.DSQuery1.First;
    index:=3;
    //Цикл для вывода данных таблицы
    for i:=0 to fDM.DSQuery1.RecordCount do begin
    //Наполнение таблицы
	for i := 1 to fDM.DSQuery1.Fields.Count do begin
    Sheet.Cells[index,i]:= fDM.DSQuery1.Fields.Fields[i].AsString;
	end;
	Inc(index);
	fDM.DSQuery1.Next; //Переход на следующую строку
    end;
  end;

появились следующие ошибки
Код:
[Error] Main.pas(319): Undeclared identifier: 'Fields'
[Error] Main.pas(325): Assignment to FOR-Loop variable 'i'
[Error] Main.pas(325): Undeclared identifier: 'RecordCount'
[Error] Main.pas(327): Assignment to FOR-Loop variable 'i'
[Error] Main.pas(327): Undeclared identifier: 'Fields'
[Error] Main.pas(328): Undeclared identifier: 'Fields'
[Error] Main.pas(328): Missing operator or semicolon
[Error] Main.pas(331): Undeclared identifier: 'Next'
[Error] Main.pas(335): '.' expected but ';' found
[Fatal Error] GK.dpr(7): Could not compile used unit 'Main.pas'
Ответить с цитированием
  #4  
Старый 22.10.2015, 10:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
...появились следующие ошибки...
Как видно, некоторые из-за невнимательности, не тот индекс где-то и Fields дважды задействованы,остальные с делфиорфографией связаны, что вам нужно в итоге, пжлст объясните, можно подправить
Ответить с цитированием
  #5  
Старый 22.10.2015, 11:08
kucher kucher вне форума
Прохожий
 
Регистрация: 16.09.2015
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

такой вопрос как сделать чтобы в этом коде
Код:
//Цикл для вывода данных таблицы
    for i:=0 to fDM.TZakaziData.RecordCount do begin
    //Наполнение таблицы
    sheet.Cells[index,1]:=fDM.TZakaziData.Fields.Fields[1].AsString;
    sheet.Cells[index,2]:=fDM.TZakaziData.Fields.Fields[2].AsString;
    sheet.Cells[index,3]:=fDM.TZakaziData.Fields.Fields[3].AsString;
    sheet.Cells[index,4]:=fDM.TZakaziData.Fields.Fields[4].AsString;
    sheet.Cells[index,5]:=fDM.TZakaziData.Fields.Fields[5].AsString;
    Inc(index);
    fDM.TZakaziData.Next; //Переход на следующую строку
    end;
не нужно было прописывать 5 раз
Код:
sheet.Cells[index,1]:=fDM.TZakaziData.Fields.Fields[1].AsString;
    sheet.Cells[index,2]:=fDM.TZakaziData.Fields.Fields[2].AsString;
    sheet.Cells[index,3]:=fDM.TZakaziData.Fields.Fields[3].AsString;
    sheet.Cells[index,4]:=fDM.TZakaziData.Fields.Fields[4].AsString;
    sheet.Cells[index,5]:=fDM.TZakaziData.Fields.Fields[5].AsString;
и цикл сам определял сколько нужно в столбце строк (5, 6, 7 от того сколько в таблице)
Я ВОТ ПОПРОБЫВАЛ НО НЕ РАБОТАЕТ, НО принцип такой вроде как
Код:
    fDM.TZakaziData.First;
    index:=3;
    //Цикл для вывода данных таблицы
    for i:=0 to fDM.TZakaziData.RecordCount do begin
 //   sheet.Cells[index,1]:=fDM.TZakaziData.Fields.Fields[1].AsString;
 //   sheet.Cells[index,2]:=fDM.TZakaziData.Fields.Fields[2].AsString;
 //   sheet.Cells[index,3]:=fDM.TZakaziData.Fields.Fields[3].AsString;
 //   sheet.Cells[index,4]:=fDM.TZakaziData.Fields.Fields[4].AsString;
 //   sheet.Cells[index,5]:=fDM.TZakaziData.Fields.Fields[5].AsString;

     for j := 1 to fDM.TZakaziData.Fields.Count-1 do  begin
     Sheet.Cells[index,j]:= fDM.TZakaziData.Fields.Fields[j].AsString;
     end;
    Inc(index);
    fDM.TZakaziData.Next; //Переход на следующую строку
    end;
Ответить с цитированием
  #6  
Старый 22.10.2015, 11:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Возможно нужно так
Код:
procedure TForm1.Button1Click(Sender: TObject);
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:='Отчёт';

 Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт'];

 for i := 1 to fDM.DSQuery1.Fields.Count-1 do
  Sheet.Cells[1,i]:= fDM.DSQuery1.Fields[i].FieldName;

  fDM.DSQuery1.First;

    //Цикл для вывода данных таблицы
   for i:= 2 to fDM.DSQuery1.RecordCount-1 do
    begin
    //Наполнение таблицы
  	 for index := 1 to fDM.DSQuery1.Fields.Count-1 do
      Sheet.Cells[i,index]:= fDM.DSQuery1.Fields[i].AsString;

		 fDM.DSQuery1.Next; //Переход на следующую строку
    end;

  end;
Неначем проверить, к печали
Ответить с цитированием
  #7  
Старый 23.10.2015, 15:55
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Friday;

interface

uses
  ComObj, Variants, DB;

procedure DataSetToExcel(DataSet: TDataSet; Name: string;
  FieldsName: Boolean = True; AFileName: string = ''; AutoFit: Boolean = True);

implementation

const
  xlWBATWorksheet = $FFFFEFB9;

  xlExcel2 = $00000010;
  xlExcel3 = $0000001D;
  xlExcel4 = $00000021;
  xlExcel5 = $00000027;
  xlExcel7 = $00000027;
  xlExcel9795 = $0000002B;

procedure DataSetToExcel(DataSet: TDataSet; Name: string;
  FieldsName: Boolean = True; AFileName: string = ''; AutoFit: Boolean = True);
var
  ExcelApplication: OleVariant;
  ExcelWorkbook: OleVariant;
  ExcelWorksheet: OleVariant;
  row, col: Integer;
  i: Integer;
begin
  ExcelApplication:=CreateOleObject('Excel.Application');
  try
    ExcelWorkbook:=ExcelApplication.Workbooks.Add(xlWBATWorksheet);
    ExcelWorksheet:=ExcelWorkbook.Sheets.Item[1];
    ExcelWorksheet.Name:=Name;

    row:=1;
    col:=1;
    if FieldsName then
    begin
      for i:=0 to DataSet.FieldDefs.Count-1 do
      begin
        ExcelWorksheet.Cells.Item[row, col]:=DataSet.FieldDefs[i].Name;
        Inc(col);
      end;
      Inc(row);
    end;

    DataSet.DisableControls;
    DataSet.First;
    try
      while not DataSet.Eof do
      begin
        col:=1;
        for i:=0 to DataSet.Fields.Count-1 do
        begin
          ExcelWorksheet.Cells.Item[row, col]:=DataSet.Fields[i].AsString;
          Inc(col);
        end;
        Inc(row);
        DataSet.Next;
      end;
    finally
      DataSet.EnableControls;
    end;

    if AutoFit then ExcelWorksheet.Columns.EntireColumn.AutoFit;
    ExcelApplication.Visible:=True;

    if AFileName<>'' then
      ExcelWorkbook.SaveAs(Filename:=AFileName, FileFormat:=xlExcel7);
  finally
    ExcelApplication.Quit;
    ExcelApplication:=Null;
  end;
end;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter