|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Экспорт Отчётов в 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
|
||||
|
||||
Нету здесь отчёта, есть прямой вывод данных в экзель, отчёт - это немного другое, с применением операций над содержимым. В приведенной выше процедуре жима кнопки лишние действия детектед, напр. в цикле наполнения переменную index можно и выкинуть, начав цикл не с нуля, а сразу с тройки, да и возможен выход из диапазона RecordCount... Что касается универсальности отчётов по запросу, пользуйте для этого специальные генераторы, но и они не могут знать заранее что им подсунут в качестве наполнителя, всёравно шаблон ручками набивать предварительно придётся, хотя конечно, название\кол-во полей и их физические размеры можно задать и автоматом, но в этом случае получится лишь черновик, красоты полноценного отчёта к сожалению, с первой попытки трудно добиться
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
kucher (22.10.2015)
|
#3
|
|||
|
|||
вроеде как должен работать код
Код:
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
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
такой вопрос как сделать чтобы в этом коде
Код:
//Цикл для вывода данных таблицы 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; Код:
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; Я ВОТ ПОПРОБЫВАЛ НО НЕ РАБОТАЕТ, НО принцип такой вроде как Код:
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
|
||||
|
||||
Возможно нужно так
Код:
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
|
||||
|
||||
Код:
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. Пишу программы за еду. __________________ |