Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.005 c
14-100070
Nikolay
2001-12-06 00:35
2002.01.31
О форуме, о взаимотношениях, о доброте


3-99905
victor
2001-12-28 08:59
2002.01.31
Добавление поля в таблицу Interbase


3-99882
dim-
2001-12-25 11:32
2002.01.31
Кодировка таблицы при создании


4-100123
Дмитрий Д.
2001-12-04 14:35
2002.01.31
Помогите со структурой плиз!


1-99965
Aleksandr
2002-01-14 11:12
2002.01.31
Проекция объектов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский