Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Нужно сохранить данные из DBGrida в файл.   Найти похожие ветки 

 
WFS ©   (2007-07-24 20:58) [0]

Скажите пожалуйста, как сохранить данные из DBGrida в файл. Просто вручную все столбцы и строки перебирать очень неудобно. Есть ли че нить такое типа DBgrid1.Savetofile. Или может можно в эксель перегнать?


 
{RASkov} ©   (2007-07-24 21:01) [1]

> [0] WFS ©   (24.07.07 20:58)

В ДБГриде нет данных, или другими словами эти данные уже и так сохранены в файле...
См DataSet.


 
WFS ©   (2007-07-24 21:09) [2]

А можно чуть поконкретнее, какую процедуру датасета нужно использовать?


 
{RASkov} ©   (2007-07-24 21:15) [3]

> [2] WFS ©   (24.07.07 21:09)

никакую... нужно почитать, что есть датасет и что есть дбгрид.... и что есть "ихи" данные....


 
MsGuns ©   (2007-07-24 21:17) [4]

Один из вариантов:

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;


 
WFS ©   (2007-07-24 21:22) [5]

О,господи, как все сложно в этой жизни...
Подскажите, как сгенерировать тогда нажатие клавиши printscreen?:)


 
MsGuns ©   (2007-07-24 21:24) [6]

Эта "сложность" от универсальности. Приведенный код выводит в Эксел данные ЛЮБОГО датасета. Если положить эту процедуру в библиотеку, то впоследствии организовать печать любого "грида" - дело 5 секунд


 
WFS ©   (2007-07-24 21:32) [7]

Боюсь у меня нет времени разбираться с этим.
Мне хотя бы как нибудь надо сделать до завтра и уволиться наконец с работы:)


 
MsGuns ©   (2007-07-24 21:34) [8]

>WFS ©   (24.07.07 21:32) [7]
>Боюсь у меня нет времени разбираться с этим.
Мне хотя бы как нибудь надо сделать до завтра и уволиться наконец с работы:)

Тогда тебе к Игорю Шевченко


 
WFS ©   (2007-07-24 21:36) [9]

А кто это такой?
Да кстати, как сэмулировать принтскрин?


 
Anatoly Podgoretsky ©   (2007-07-24 21:51) [10]


> надо сделать до завтра и уволиться наконец с работы:)

Разумно!


 
WFS ©   (2007-07-24 22:08) [11]

я узнал код клавиши принтскрин. Это 39!
Теперь просто ответьте, как сэмулировать нажатие клавиши.
че нить типа keypress?


 
MsGuns ©   (2007-07-24 22:46) [12]

Видишь ли, "эмуляция" - это нам в наследство от дедовского ДОС осталось, а в винде есть сообщения, которыми обмениваются приложения с ОС.
Попробуй почитать что-нибудь о них, например о PostMessage/SendMessage.
Напоследок, перед тем, как навсегда расстаться с программированием ;)


 
Anatoly Podgoretsky ©   (2007-07-24 22:49) [13]

> MsGuns  (24.07.2007 22:46:12)  [12]

Времени мало осталось, но может успеет?


 
WFS ©   (2007-07-24 22:56) [14]

Ну навсегда я с ним не расстанусь. Но буду заниматься немного другими вещами.
Кстати, я ухожу, если кто хочет, может пойти вместо меня. В основном необходимо заниматься всякого рода тупых, но сложных программ, как например та, которую я сейчас делаю: контроль и учет деталей, находящихся на складе.


 
WFS ©   (2007-07-24 22:56) [15]

*заниматься разработкой (опечатка)


 
MsGuns ©   (2007-07-24 23:32) [16]

>WFS ©   (24.07.07 22:56) [14]
>Кстати, я ухожу, если кто хочет, может пойти вместо меня

Мизантроп ?


 
WFS ©   (2007-07-24 23:38) [17]

MsGuns, я не понял, к чему ты написал это слово:)


 
MsGuns ©   (2007-07-24 23:46) [18]

Нужно быть мизантропом (другими словам - человеконенавистником), чтобы рекомендовать другим место, которое столь сильно деквалифицирует специалиста ;)


 
WFS ©   (2007-07-24 23:57) [19]

Не, ты зря.
Место неплохое, можно работать дома.
Программы, которые требуется писать, сложные, но построены их простых элементов. То есть все, здесь собравшиеся, вполне смогут там работать.
Я по специальности не программер, а лазерщик, и считаю, что за год работы я узнал много нового.


 
WFS ©   (2007-07-24 23:59) [20]

Да, кстати, всем спасибо. Сделал я следующим образом: Сохранил вначале дбгрид в мемо, а затем в файл:))


 
MsGuns ©   (2007-07-25 00:03) [21]

>WFS ©   (24.07.07 23:59) [20]
>Да, кстати, всем спасибо. Сделал я следующим образом: Сохранил вначале дбгрид в мемо, а затем в файл:))

!?

Настоятельно рекомендую непосредственно перед увольнением снести со всех компов твоей контроы все твои программы. Все до единой.
Иначе прокляты будут и ты, и потомки твои до седьмого колена ;)))


 
Loginov Dmitry ©   (2007-07-25 13:08) [22]

TClientDataSet(DBGrid1.DataSource.DataSet).SaveToFile(FileName);

Не запускать это раньше времени :-D


 
stanislav ©   (2007-07-25 13:16) [23]

WFS ©   (24.07.07 23:59) [20]
Вот теперь точно никто не придет на твое место...


 
Virgo_Style ©   (2007-07-25 13:24) [24]

stanislav ©   (25.07.07 13:16) [23]
Если там разделители приличные, то еще есть шанс)


 
WFS ©   (2007-07-25 19:01) [25]

не понял, в чем прикол?


 
MsGuns ©   (2007-07-25 21:18) [26]

>WFS ©   (25.07.07 19:01) [25]
>не понял, в чем прикол?

Ну, если доступно..
Вот есть картина, художественная. Например, "Сикстинкая мадонна".
Требуется ее перевезти.
Так вот, ее взяли и порезали на мелкие кусочки, со спичечную этикету азером. И упаковали затем в спичечные коробки...



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
15-1185256532
dimaL
2007-07-24 09:55
2007.08.19
Вкладка Interbase


15-1184934390
UMU
2007-07-20 16:26
2007.08.19
Договор на продажу ПО (лицензирование)


15-1184648259
vajo
2007-07-17 08:57
2007.08.19
DVD-RW перестал читать не DVD диски


15-1185245077
IE
2007-07-24 06:44
2007.08.19
Настроки прокси для определенного сайта в IE


2-1184705148
JetAPI
2007-07-18 00:45
2007.08.19
TListView; закрасить/затереть текст в колонке.