Форум: "Базы";
Текущий архив: 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 //åñëè ïðîáåë ñóùåñòâóåò
begin
s1 := copy (s2,0,pos(" ",s2) - 1); // âûäåëÿåì ïîäñòðîêó äî 1-ãî ïðîáåëà
mem.FieldByName("F"+ inttostr(k)).AsInteger := strtoint(s1); //çàíîñèì ïîäñòðîêó â ïîëå
s2 := copy (s2,pos(" ",s2)+1, length(s2) - pos(" ",s2)); // ñòðîêà = ñòðîêà - ïîäñòðîêà
k := k+1; // ïåðåõîä íà ñëåä. ïîëå
end
else // ïðîáåëîâ áîëüøå íåò
begin
if s2 <>"" then
begin
mem.FieldByName("F"+inttostr(k)).AsInteger := strtoint(s2); //ïîñëåäíåå ïîëå
s2 := ""; // ñòàâèì ïðèçíàê êîíöà ñòðîêè
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; //äëÿ ìàññèâà
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]; // Ëåâàÿ âåðõíÿÿ ÿ÷åéêà îáëàñòè,
Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + x - 1,
BeginCol + y - 1]; // Ïðàâàÿ íèæíÿÿ ÿ÷åéêà îáëàñòè,
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;
// Îáëàñòü, â êîòîðóþ áóäåì âûâîäèòü äàííûå
// Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
Excelapp.range[Cell1,Cell2].value := tabgrid;
// ExcelApp.AutoQuit := true;
// Äåëàåì Excel âèäèìûì
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