Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Вниз

Связь Delphi с Exel 


Kulagin   (2001-12-21 15:34) [0]

Помогите пожалуста связать в Delphi компоненты работы с базами данных TTable, TQwery с таблицами Exel



ValeraVV   (2001-12-21 16:53) [1]

Это и ответ и доп.вопрос:
был такой компонент xlReport - классный IMHO, так его версия 2.00 была freeware для exUSSR, да там есть баг - некорректно освобождается Excel и вылетает Exception, скорее всего этот баг исправлен, вот только на сайте www.afalinasoft.com лежит 4-ая trial-версия и 4-ая lite версия, что-то нет freeware для совков. Может кто имеет более-менее стабильно работающую версию freeware, киньте ссылку/компонент на mail.
То что в нижнем колонтитуле версия 2 выводила типа "freeware afalinasoft" так это меня устраивало, да глюк не устраивал.



NewComer   (2001-12-21 17:02) [2]

ИМХО:
лучше все ручками, смотришь хелп по VBA и вперед.
А колонтитул в afalinasoft убрать программно можно.. но оно нам все это надо?



Вячеслав   (2001-12-21 17:16) [3]

// Please see:
// http://www.delphi3000.com/articles/article_1282.asp
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnautoma/html/msdn_thrdole.asp
// file://C:\Program Files\Microsoft Office\Office\1033\VBAXL9.CHM
procedure TForm1.DataSetToExcelFile(const Dataset: TDataset;
const Filename: string);
var
DefaultLCID: LCID;
i: Integer;
Row: Integer;
ExcelApp: TExcelApplication;
Worksheet: TExcelWorksheet;
Workbook: TExcelWorkbook;
begin
DefaultLCID := GetUserDefaultLCID;

ExcelApp := TExcelApplication.Create(Self);
ExcelApp.ConnectKind := ckNewInstance;
ExcelApp.Connect;
ExcelApp.ScreenUpdating[DefaultLCID] := False; // optimize presentation
try
// create workbook
Workbook := TExcelWorkbook.Create(Self);
Workbook.ConnectTo(ExcelApp.Workbooks.Add(TOleEnum(xlWBATWorksheet),
DefaultLCID));
// create worksheet
Worksheet := TExcelWorksheet.Create(Self);
Worksheet.ConnectTo(Workbook.Worksheets[1] as _Worksheet);
Worksheet.Name := "First WorkSheet";
// populate with Dataset information
Dataset.DisableControls;
try
// header
for i := 0 to Dataset.FieldCount - 1 do
begin
if Dataset.Fields[i].Visible then
begin
Worksheet.Cells.Item[1, i + 1].Value :=
Dataset.Fields[i].DisplayLabel;
Worksheet.Cells.Item[1, i + 1].ColumnWidth :=
Dataset.Fields[i].DisplayWidth;
end;
end;
Worksheet.Range["A1", "A1"].EntireRow.Interior.Color := clblue;
Worksheet.Range["A1", "A1"].EntireRow.Font.Bold := True;
Worksheet.Range["A1", "A1"].EntireRow.Font.Color := clWhite;
// data
Row := 2;
Dataset.First; // TODO: add a bookmark
while not Dataset.Eof do
begin
for i := 0 to Dataset.FieldCount - 1 do
begin
if Dataset.Fields[i].Visible then
begin
Worksheet.Cells.Item[Row, i + 1].Value :=
Dataset.Fields[i].Text;
Application.ProcessMessages;
end;
end;
Inc(Row);
Dataset.Next;
end;
// save it
Workbook.SaveAs(
EdFilename.Text, // Filename
XlWindowState(xlNormal), // FileFormat
EmptyParam, // Password,
EmptyParam, // WriteResPass
False, // ReadOnlyRecommended
False, // CreateBackup
xlNoChange, // AccessMode
xlUserResolution, // ConflictResolution
False, // AddToMru
EmptyParam, // TextCodepage
EmptyParam, // TextVisualLayout
DefaultLCID);
Workbook.Close;
finally
Dataset.EnableControls;
Workbook.Free;
Worksheet.Free;
end;
finally
ExcelApp.ScreenUpdating[DefaultLCID] := True; // optimize presentation
ExcelApp.Disconnect;
ExcelApp.Free;
end;
end;



Delirium   (2001-12-21 17:29) [4]

Я бы сохранил как DBF, а в "Excel.Application" открыл-бы, это было бы очень бысто(раз в 10 быстрее чем у Вячеслава) и эффективно.



Delirium   (2001-12-21 17:37) [5]

Если кто не понял что я имею в виду:

procedure TForm1.Button1Click(Sender: TObject);
var V:Variant;
begin
V:=CreateOleObject("Excel.Application");
V.WorkBooks.Add("d:\LNames.DBF");
V.Visible:=True;
V:=UnAssigned;
end;



ValeraVV   (2001-12-21 17:40) [6]

>NewComer © (21.12.01 17:02)
Такой перевод в Excel (Вячеслав © (21.12.01 17:16)) у меня, например, уже сделан, да в xlReport отчеты на основе шаблонов, а не просто голая таблица, а заставить end-user шаблоны править/создавать в Excel - милое дело.



ValeraVV   (2001-12-21 17:43) [7]

А в вопросе ничего не упустили? требуется связать (может типа relation надо), Kulagin (21.12.01 15:34), поясни



NewComer   (2001-12-21 18:10) [8]

to ValeraVV
я тоже когда то пользовался xlReport, но потом отказался
- шаблоны можно и самому сделать
- за xlReport платить нужно
- ежели обновишь xlReport, могут произойти сюрпрайзы: когда то обновил - пришлось с ентим самым колонтитулом бороться, или еще хуже ихним лого, который норовит вылезти на листе случайным образом(потом правда понял их "случайный" алгоритм)



N.Kulagin   (2001-12-24 14:31) [9]

Мне необходимо из TTable, TQwery записывать информаци в Exel, а из Exel
информацию переносить в TTable. На вид связи ограничения не накладываются.



Вячеслав   (2001-12-24 18:28) [10]

Вот еще в архивах нашел обратную процедуру, может пригодиться
Sending data from Excel

This is done in the following procedure :

procedure TForm1.BitBtnFromExcelOnClick(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
NomFich := ‘C:\MyDirectory\NameOfFile.xls’;
IIndex := 1;
XLApp.Connect;
// Open the Excel File
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
// In order to know the dimension of the WorkSheet, i.e the number of rows and the
// number of columns, we activate the last non-empty cell of it
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
// Get the value of the last row
X := XLApp.ActiveCell.Row;
// Get the value of the last column
Y := XLApp.ActiveCell.Column;
// Define the number of the columns in the TStringGrid
GenericStringGrid.ColCount := Y;
// Assign the Variant associated with the WorkSheet to the Delphi Variant Matrix
RangeMatrix := XLApp.Range["A1",XLApp.Cells.Item[X,Y]].Value;
// Quit Excel and Disconnect the Server
XLApp.Quit;
XLApp.Disconnect;
// Define the loop for filling in the TStringGrid
K := 1;
repeat
for R := 1 to Y do
GenericStringGrid.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
Inc(K,1);
GenericStringGrid.RowCount := K + 1;
until
K > X;
// Unassign the Delphi Variant Matrix
RangeMatrix := Unassigned;
end;



KMZ   (2001-12-25 12:25) [11]

Просто посмотри на сайте королевство дельфи ты там все найдешь
и примерчик там есть




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.016 c
1-99927           3d[Power]             2002-01-11 01:22  2002.01.31  
Packed record. absolute. file r/w.


1-99966           Bodia                 2002-01-12 02:53  2002.01.31  
Как сымитирывать нажатие кнопки мыши?


14-100044         lel                   2001-12-05 10:14  2002.01.31  
Способность добиваться успеха...


3-99843           Тонио-Лунатик         2001-12-25 08:43  2002.01.31  
Злостный IBX


3-99865           SlavaG                2001-12-25 21:49  2002.01.31  
Необходим совет