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

Вниз

Как DBF-файл открыть в EXCEL?   Найти похожие ветки 

 
Diman   (2004-08-12 11:54) [0]

Есть таблица DBF с неизвестным кол-вом полей.Как ее занести в EXCEL?


 
sniknik ©   (2004-08-12 11:58) [1]

что значит как? в экселе в меню выбираеш "открыть" и в нем нужный DBF-файл, жмеш ентер.


 
Соловьев ©   (2004-08-12 11:59) [2]

File->Open->Type File->dBase


 
Соловьев ©   (2004-08-12 12:03) [3]

хотя если включить телепат моде то
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=502


 
Diman   (2004-08-12 12:18) [4]

Надо через Делфи, напр. кнопка "Открыть в Excel", а перед этим показать DBF-таблицу в DBGrid.


 
46_55_41_44 ©   (2004-08-12 12:24) [5]


> Diman   (12.08.04 12:18) [4]

Ну что Диман.. Ты наконец-то перевел свои данные в Excel?


 
jack128 ©   (2004-08-12 12:28) [6]

ShellExecute(0, nil, "excel.exe", DBFFileName, nil, SW_SHOW);


 
Diman   (2004-08-12 12:30) [7]

Да Fuad! Из текст-файла получилось! теперь надо из DBF и RTF!


 
46_55_41_44 ©   (2004-08-12 12:32) [8]

так секундочку... как ты из текстового сделал?


 
46_55_41_44 ©   (2004-08-12 12:34) [9]

давай сюда кодик )))
у меня есть свой юнит Fuad_Excel.pas собрал там всякие функции для работы с Excel... Может твоя тоже понадобится ))


 
Diman   (2004-08-12 12:42) [10]

unit txt_to_DBGrid;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, DBGrids, StdCtrls, Buttons, DB, RxMemDS, OleServer,ComObj;

type
 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   SpeedButton1: TSpeedButton;
   Edit1: TEdit;
   FN: TOpenDialog;
   Button1: TButton;
   MEM: TRxMemoryData;
   DataSource1: TDataSource;
   MEMF0: TIntegerField;
   MEMF1: TIntegerField;
   MEMF2: TIntegerField;
   MEMF3: TIntegerField;
   MEMF4: TIntegerField;
   MEMF5: TIntegerField;
   MEMF6: TIntegerField;
   MEMF7: TIntegerField;
   MEMF8: TIntegerField;
   MEMF9: TIntegerField;
   BitBtn1: TBitBtn;
   procedure Button1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure SpeedButton1Click(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

const a: array[0..9] of string[1] = ("0","1","2","3","4","5","6","7","8","9");

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 f: textfile;
 s,s1,S2: string;
 k: integer;

function ReplaceStr(const S, Srch, Replace: string): string;
var
q: Integer;
Source: string;
begin
Source := S;
Result := "";
repeat
  q := Pos(Srch, Source);
  if q > 0 then begin
    Result := Result + Copy(Source, 1, q - 1) + Replace;
    Source := Copy(Source, q + Length(Srch), MaxInt);
  end
  else Result := Result + Source;
until q <= 0;
end;

begin
if not mem.Active then mem.Active := true;
   mem.EmptyTable;
   assignfile(f,edit1.Text);
   reset (f);
repeat
 readln(f,s);
 S2 := ReplaceStr(s, #9, " 0");
 k := 0;
 mem.Append;
 repeat
     if (pos(" ",s2) <> 0) and (s2 <> "") then   //&#229;&#241;&#235;&#232; &#239;&#240;&#238;&#225;&#229;&#235; &#241;&#243;&#249;&#229;&#241;&#242;&#226;&#243;&#229;&#242;
     begin
       s1 := copy (s2,0,pos(" ",s2) - 1); // &#226;&#251;&#228;&#229;&#235;&#255;&#229;&#236; &#239;&#238;&#228;&#241;&#242;&#240;&#238;&#234;&#243; &#228;&#238; 1-&#227;&#238; &#239;&#240;&#238;&#225;&#229;&#235;&#224;
       mem.FieldByName("F"+ inttostr(k)).AsInteger := strtoint(s1); //&#231;&#224;&#237;&#238;&#241;&#232;&#236; &#239;&#238;&#228;&#241;&#242;&#240;&#238;&#234;&#243; &#226; &#239;&#238;&#235;&#229;

       s2 := copy (s2,pos(" ",s2)+1, length(s2) - pos(" ",s2));  // &#241;&#242;&#240;&#238;&#234;&#224; = &#241;&#242;&#240;&#238;&#234;&#224; - &#239;&#238;&#228;&#241;&#242;&#240;&#238;&#234;&#224;
       k := k+1; // &#239;&#229;&#240;&#229;&#245;&#238;&#228; &#237;&#224; &#241;&#235;&#229;&#228;. &#239;&#238;&#235;&#229;
     end
     else        // &#239;&#240;&#238;&#225;&#229;&#235;&#238;&#226; &#225;&#238;&#235;&#252;&#248;&#229; &#237;&#229;&#242;

     begin
       if s2 <>"" then
       begin
         mem.FieldByName("F"+inttostr(k)).AsInteger := strtoint(s2); //&#239;&#238;&#241;&#235;&#229;&#228;&#237;&#229;&#229; &#239;&#238;&#235;&#229;
         s2 := "";   // &#241;&#242;&#224;&#226;&#232;&#236; &#239;&#240;&#232;&#231;&#237;&#224;&#234; &#234;&#238;&#237;&#246;&#224; &#241;&#242;&#240;&#238;&#234;&#232;
       end;
     end;
   until s2 ="";
 until EOF(f);
 closefile(f);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
 Form1 := nil;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 FN.Execute;
 edit1.Text := FN.FileName;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var
   i,t,j,y,x,m: integer;
   TabGrid: variant; //&#228;&#235;&#255; &#236;&#224;&#241;&#241;&#232;&#226;&#224;
   ExcelApp, Workbook, Cell1, Cell2 : Variant;
   BeginCol, BeginRow : integer;

begin
BeginCol:=1;
BeginRow:=1;
ExcelApp := CreateOleObject("Excel.Application");
//ExcelApp.Application.EnableEvents := false;

   //     aRow := mem.RecordCount; showmessage(inttostr(aRow));
   //     acol := mem.FieldCount; showmessage(inttostr(acol));

 x:=mem.RecordCount;
 y:=mem.FieldCount;
 tabgrid := vararraycreate([3,(x+2),0,(y-1)],varvariant);
 Workbook := ExcelApp.WorkBooks.Add();
 Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol]; // &#203;&#229;&#226;&#224;&#255; &#226;&#229;&#240;&#245;&#237;&#255;&#255; &#255;&#247;&#229;&#233;&#234;&#224; &#238;&#225;&#235;&#224;&#241;&#242;&#232;,
 Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow  + x - 1,
          BeginCol + y - 1];   // &#207;&#240;&#224;&#226;&#224;&#255; &#237;&#232;&#230;&#237;&#255;&#255; &#255;&#247;&#229;&#233;&#234;&#224; &#238;&#225;&#235;&#224;&#241;&#242;&#232;,
 i:=3;
 mem.First;
 for t := 1 to x  do
 begin
// showmessage(inttostr(mem.RecordCount));
 m:=0;
      for j := 0 to (y - 1) do
        begin
          tabgrid[i,j] := dbgrid1.Fields[m].Value;
        //  showmessage(inttostr(tabgrid[i,j]));
        //  range[i,j].value := tabgrid;//?
          inc(m,1);
        end;
    mem.Next;
    inc (i,1);

 end;

 // &#206;&#225;&#235;&#224;&#241;&#242;&#252;, &#226; &#234;&#238;&#242;&#238;&#240;&#243;&#254; &#225;&#243;&#228;&#229;&#236; &#226;&#251;&#226;&#238;&#228;&#232;&#242;&#252; &#228;&#224;&#237;&#237;&#251;&#229;
//  Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
Excelapp.range[Cell1,Cell2].value := tabgrid;
// ExcelApp.AutoQuit := true;
 // &#196;&#229;&#235;&#224;&#229;&#236; Excel &#226;&#232;&#228;&#232;&#236;&#251;&#236;
ExcelApp.Visible := true;

//ExcelApplication1 := TExcelApplication.Create(self);
//ExcelApplication1.ConnectKind := ckNewInstance;
//ExcelApplication1.AutoQuit := true;
//ExcelApplication1.Visible[0] := true;
//ExcelWorkbook1 := ExcelApplication1.Workbooks.Add(EmptyParam,0);
//ExcelWorkSheet1 := ExcelApplication1.ActiveWorkBook.ActiveSheet as ExcelWorkSheet;

end;

end.


 
46_55_41_44 ©   (2004-08-12 12:46) [11]

понятно... но зачем ту часть, которая мне известна выложил? )))
Эти функции у меня есть )))
Кстати тем же макаром делаешь из DBF.
просто соединяешь ее с DBGrid (вместо mem будет например ADOQuery, соединенный с *.DBF)  и все...
остается только RTF! )))


 
Diman   (2004-08-12 12:50) [12]

Остальная часть пусть будет для всех !
А как читать из DBF, не через READLN же?


 
Danilka ©   (2004-08-12 12:52) [13]

[11] 46_55_41_44 ©   (12.08.04 12:46)
Открыть ДБФ-ку в экселе будет на порядок быстрее, чем через оле.
А чтобы открыть ее опять-же создаешь оле объект Эксель.Аппликацион, и делаешь ему Workbooks.Open


 
Diman   (2004-08-12 13:06) [14]

>Danilca@
Действительно, сейчас попробую сразу открыть через Open, Спасибо.


 
46_55_41_44 ©   (2004-08-12 13:46) [15]

Ну как получилось?
помоему все-таки лучще через АДОконнекшн! )))


 
Danilka ©   (2004-08-12 13:52) [16]

[15] 46_55_41_44 ©   (12.08.04 13:46)
> помоему все-таки лучще через АДОконнекшн! )))

Кому именно лучше?
Если пользователям, то нет, зачем им ждать 10 секунд там, где может отработать за доли секунды.
Если программисту, то тоже нет, написать 1 строчку Workbooks.Open вместо целой кучи строчек и используемых компонентов..


 
Skyle ©   (2004-08-12 13:56) [17]


> [10] Diman   (12.08.04 12:42)

Страсти какие...:(


 
Diman   (2004-08-12 14:19) [18]

Неа, не получилось, точнее, получилось 1 раз, а потом стал запускать - одни глюки...
edit1.Text := FN.FileName;
 if copy(edit1.text,length(edit1.text)-3,4) = ".dbf" then
   begin
    // showmessage("DBF");

     try
       ExcelApp := GetActiveOleObject("Excel.Application");
     except
       ExcelApp := CreateOleObject("Excel.Application");
     end;
     WorkBook := ExcelApp.WorkBooks.Open(edit1.text);
     ExcelApp.Visible := True;
   end;


 
Danilka ©   (2004-08-12 14:28) [19]


> а потом стал запускать - одни глюки...

Что значит "одни глюки"? Точно одни, можен еще с кем-то? :))


> получилось 1 раз

может ты просто забыл закрыть файл после первого раза? :))


 
Diman   (2004-08-12 14:32) [20]

может ты просто забыл закрыть файл после первого раза? :))
- может и забыл, а какой файл?
 Когда убрал  ExcelApp := GetActiveOleObject("Excel.Application");
 все заработало! А что делать, если Excel уже открыт?


 
Danilka ©   (2004-08-12 14:48) [21]

[20] Diman   (12.08.04 14:32)
Запусти эксель (не дельфями, не через оле, а по-обычному). Открой любой файл. Затем попытайся его еще раз открыть, что видишь? Вот это и есть твои "глюки".

Ты первый раз открыл в экселе свою ДБФ-ку, после того как поработал с ней надо ее закрывать.


> может и забыл, а какой файл?

свою ДБФ-ку.
Как закрывать? close, очевидно. :))


 
Diman   (2004-08-12 15:07) [22]

Проблема вот в чем, открываю одну таблицу, она открывается - сколько хочу раз, закрываю ее в Excel, открываю другую - не хочет.:(



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

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

Наверх




Память: 0.53 MB
Время: 0.052 c
1-1092933826
alexts
2004-08-19 20:43
2004.09.05
Парсинг текстовых файлов


1-1093162496
Islander
2004-08-22 12:14
2004.09.05
Как передвинуть клавиатурный фокус в ListView?


8-1086706742
Сашенька
2004-06-08 18:59
2004.09.05
Сравнение цветов


3-1092217610
Руслан
2004-08-11 13:46
2004.09.05
А можно ли в DBGride использовать заголовки как кнопки(например


3-1092294860
REA
2004-08-12 11:14
2004.09.05
IB описания полей