Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

Как 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.038 c
1-1092748837
wicked
2004-08-17 17:20
2004.09.05
компоненты c++builder в delphi....


1-1092745697
GRAND25
2004-08-17 16:28
2004.09.05
Электронная идентификация пользователя


6-1088655505
Del_programmer
2004-07-01 08:18
2004.09.05
pop3


4-1090405878
sashuly
2004-07-21 14:31
2004.09.05
отлов русских букв с OnKeyDown


14-1092743459
Григорьев Антон
2004-08-17 15:50
2004.09.05
Delphi+БД. Какую книгу посоветуете?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский