![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно сохранить данные из DBGrida в файл.
WFS © (2007-07-24 20:58:00)Скажите пожалуйста, как сохранить данные из DBGrida в файл. Просто вручную все столбцы и строки перебирать очень неудобно. Есть ли че нить такое типа DBgrid1.Savetofile. Или может можно в эксель перегнать?
MsGuns (2007-07-24 21:24:00) [21]Эта "сложность" от универсальности. Приведенный код выводит в Эксел данные ЛЮБОГО датасета. Если положить эту процедуру в библиотеку, то впоследствии организовать печать любого "грида" - дело 5 секунд
WFS (2007-07-24 21:22:00) [22]О,господи, как все сложно в этой жизни...
Подскажите, как сгенерировать тогда нажатие клавиши printscreen?:)
MsGuns (2007-07-24 21:17:00) [23]Один из вариантов:
uses ComObj, Excel2000, OleServer,
var
XLExp_Report: TExcelApplication;
XLExp_WorkBook: Excel2000.ExcelWorkBook;
XLExp_Sheet: Excel2000.ExcelWorkSheet;
procedure XLExp_OpenReport(TemplateName: OleVariant);
// Процедура создает в первый раз Excel-приложение, а если оно уже существует,
// то коннектится к нему, определяя опции коннекта и создавая объекты "Книга"
// и "Лист". Имя книги задается параметром TemplateName
begin
if not Assigned(XLExp_Report) then
XLExp_Report:=TExcelApplication.Create(nil);
XLExp_Report.ConnectKind:=ckRunningOrNew;
XLExp_Report.Connect;
try
// если офис 2003, ХР
XLExp_WorkBook :=XLExp_Report.Workbooks.Add('',0);
except
try
// если офис 2000
XLExp_WorkBook :=XLExp_Report.Workbooks.Add('Книга1',0);
except
//try
// если Офис 97
//XLExp_WorkBook :=XLExp_Report.Workbooks.Add(xlWBatWorkSheet,0);
//except
//end;
end;
end;
XLExp_Sheet:=XLExp_Workbook.Worksheets.Item[1] as Excel2000.ExcelWorkSheet;
end;
procedure XLExp_DataSetExport(Range: OleVariant; DataSet: TDataSet);
// Експорт данных из датасета в Excel-лист
// Область листа (Range) задается параметром Range
// Range задает область листа (непрерывная последовательность ячеек листа)
// начиная с которой будет итти заполнение из НД. При этом самой левой колонкой
// может любая колонка листа, а строкой - любая строка листа.
// Ячейки этой "линии" колонок должны содержать имена полей НД, данные которых
// будут помещаться в эти колонки
var
RangeLen,Column,Row,lich,i,x: integer;
ValueArray: OleVariant;
Str: string;
FieldArray: array [0..30] of string;
bm: TBookmark;
begin
// Строка начала района
Row:=XLExp_Sheet.Range[Range,EmptyParam].Row;
// Колонка начала района (левая крайняя)
Column:=XLExp_Sheet.Range[Range,EmptyParam].Column;
// Колонка конца района (правая крайняя)
RangeLen:=Column+(XLExp_Sheet.Range[Range,EmptyParam].Columns.Count-1);
// Переписать в массив FieldArray содержимое ячеек 1-й строки указанной области
// листа Excel (имена полей датасета).
// Предполагается, что их не должно быть более 21
x := 0;
for i := Column to RangeLen do
begin
Str := XLExp_Sheet.Cells.Item[Row,i].Formula; // Содержимое ячейки
Delete(Str,1,1); // Обрезаем первый (служебный) символ
FieldArray[x] := Str;
x := x+1;
end;
// Создать дин.массив размерностью RxC, где R - кол-во строк датасета,
// а C - кол-во колонок, заданное Range
ValueArray := VarArrayCreate([0,DataSet.RecordCount-1,0,XLExp_Sheet.Range[Range,EmptyParam].Columns.Count],varVariant);
lich := 0; // Индекс строки НД
// Подготовка датасета к сканированию
with DataSet do
begin
bm := GetBookmark; // Запомнить текущую запись
DisableControls;
First;
while not Eof do
begin
for i := 0 to XLExp_Sheet.Range[Range,EmptyParam].Columns.Count do
// Для каждой колонки Region определяется имя поля НД и значение
// этого поля записывается в дин.массив по адресу=индексу колонки
begin
if (FieldArray[i]<>'') then // Колонка имеет ссылку на имя поля ?
ValueArray[lich,i] := FieldByName(FieldArray[i]).AsString
else
ValueArray[lich,i] := '';
end;
lich := lich+1;
Next;
end;
EnableControls;
GotoBookmark(bm); // Вернуться в исходную (до сканирования) запись
FreeBookmark(bm);
end;
{ Выражение :
xlSheet.Range[Col[Column]+IntToStr(Row),Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)]
представляет "экселовскую" адресацию типа "A10","H17", где буква - индекс колонки, а
число-индекс строки на листе Excel.
В нативном виде (в самом Excel`е) этот регион будет = "A10:H17"
}
// Перегнать в лист Excel (Ragion) значения из массива ValueArray
XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Value := ValueArray;
// Присвоить всем ячейкам региона Region цвет символов как у левой верхней ячейки
XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Font.Color := XLExp_Sheet.Range[Range,EmptyParam].Font.Color;
// Присвоить всем ячейкам региона Region цвет как у левой верхней ячейки
XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Interior.Color := XLExp_Sheet.Range[Range,EmptyParam].Interior.Color;
// Присвоить всем ячейкам региона Region рамки как у левой верхней ячейки
XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Borders.LineStyle := XLExp_Sheet.Range[Range,EmptyParam].Borders.LineStyle;
end;
{RASkov} (2007-07-24 21:15:00) [24]> [2] WFS © (24.07.07 21:09)
никакую... нужно почитать, что есть датасет и что есть дбгрид.... и что есть "ихи" данные....
WFS (2007-07-24 21:09:00) [25]А можно чуть поконкретнее, какую процедуру датасета нужно использовать?
{RASkov} (2007-07-24 21:01:00) [26]> [0] WFS © (24.07.07 20:58)
В ДБГриде нет данных, или другими словами эти данные уже и так сохранены в файле...
См DataSet.