![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
МОЖЕТ КТО_НИБУДЬ СТАЛКИВАЛСЯ!
имеется такой код для создания отчётов чисто по таблице! а как сделать универсальный (ЕСЛИ ЭТО ВООБЩЕ ВОЗМОЖНО) экспорт отчётов по ЗАПРОСАМ 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. |