![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача DataSource в Excel. [D7, XP]
Neket © (2009-02-28 16:01:00)Добрый день. Подскажите пожалуста как правильно передать данные загруженные из БД в DataSource. Примера куска кода будет достаточно. Заранее благодарен.
Сергей М. (2009-03-01 15:38:00) [1]
> Neket
var MyArr: OleVariant;
..
MyArr := VarArrayCreate(..., varVariant);
..
Neket (2009-03-01 15:34:00) [2]Ура сделал!!!!!!... Специально приведу пример потому как вдруг кому-нибудь ещё понадобиться:
var
MasCGR:variant;
XLApp,XL:Variant;
......
colcount:=10;
rowcount:=10;
MassCGR:=VarArrayCreate([0,Rowcount,0,colcount],varVariant);
For i:=0 to rowcount do
For k:=0 to colcount do
MassCGR[i,k]:=IntToStr(Random(100));
.....................................
CoInitialize(nil);
try
XLApp:= CreateOleObject('Excel.Application');
XL:=XLApp.Workbooks.Add();
XLApp.Workbooks[1].WorkSheets[1].Name:='CGR';
XLApp.Visible:=true;
Xl.ActiveSheet.Range['A1',Xl.ActiveSheet.Cells.Item[Rowcount,Colcount]].Value:=M assCGR;
finally
CoUninitialize;
sniknik (2009-03-01 15:15:00) [3]> Ок дело в том что я уже пробовал тип Variant вот так
а чего пишут в статьях? чего оно ожидает на самом деле? а не то, что ты пробовал.
Neket (2009-03-01 15:10:00) [4]Ок дело в том что я уже пробовал тип Variant вот так
var
MasCGR: array of array of Variant;
Таже самая ошибка...
ИOLEVariantпробовал тоже самое.
sniknik (2009-03-01 15:06:00) [5]> Ок как вариант готов рассмотреть вариант использования ADO.
что значит как вариант? ты либо его используешь и пользуешься его возможностями, либо нет.
> И есть некий двумерный динамический Строковый (Непринципиально) массив заполненный примерно так:
как раз принципиально... работа с вариантным массивом должна быть в приведенных ссылках... а подпихивать неизвестно что (екселю) и ожидать, что будет работать глупо.
> То при компиляции вылетает ошибка :
> type not allowed in Variant Dispatch call
вот вот, оно самое.
Neket (2009-03-01 14:43:00) [6]Добавлю... если я делаю как пишут в И-нете в различных статьях
Xl.ActiveSheet.Range['A1',Xl.ActiveSheet.Cells.Item[Rowcount,Colcount]].Va lue:=MassCGR;
То при компиляции вылетает ошибка :
type not allowed in Variant Dispatch call
Neket (2009-03-01 14:28:00) [7]Парни помогите ПЛЗ второй день выходной на работе сижу с этой проблемой. выручайте ПЛЗ а то блинов уже хотца поесть ;-)
Neket (2009-03-01 14:27:00) [8]Ок тогда перефразирую вопрос.
Есть некий созданный Excel-евский документ созданый так:
XLApp:= CreateOleObject('Excel.Application');
XL:=XLApp.Workbooks.Add();
XLApp.Workbooks[1].WorkSheets[1].Name:='CGR';
XLApp.Visible:=true;
И есть некий двумерный динамическийСтроковый (Непринципиально) массив заполненный примерно так:
var
MasCGR: array of array of string;
......
colcount:=10;
rowcount:=10;
SetLength(MassCGR,rowcount,colcount);
For i:=0 to rowcount do
For k:=0 to colcount do
MassCGR[i,k]:=IntToStr(Random(100));
Как данные из этого массива перенести быстро вы Excel?
потому как
For i:=0 to rowcount do
For k:=0 to colcount do
xL.Sheets['CGR'].Cells.Item[i+1, k+1].Value :=MassCGR[i,k];
Так делать нильзя и это очень долго.
Neket (2009-03-01 13:21:00) [9]Ок как вариант готов рассмотреть вариант использования ADO. Как? Где можно почитать?
sniknik (2009-03-01 13:17:00) [10]> т.е. вот сдесь идет передача данных хронящихся в Recordset в QueryTables.
все с ног на голову...
наоборот в екселе есть подобная работа с ADO-шным рекордсетом (видимо VB это внутри и вызывает), т.к. оба творения мелкософта т.что связку они наладили.
но есть большая проблема, это работает исключительно для ADO, про использование которого ни слова в вопросе/обсуждении (не считая случайного примера из VB, что не делает фактом его использование тобой...).
Neket (2009-03-01 12:09:00) [11]Amoeba © (28.02.09 18:48) [14] Спасибо уже давно иучено. Но я объясню в связи с чем возник вопрос.
В Visualbasik есть примерный аналог компоненты Datasourse который называется ReckordSet. и работает он примерно так
Dim cnnConnect As ADODB.Connection- т.е. вот сдесь идет передача данных хронящихся в Recordset в QueryTables.
Dim rstData As ADODB.Recordset
Dim qtbData As Excel.QueryTable
Dim wksNew As Excel.Worksheet
On Error GoTo CreateQueryTable_Err
' Open connection on data source.
Set cnnConnect = New ADODB.Connection
cnnConnect.Provider = "SQLOLEDB"
cnnConnect.Open strConnect
' Open Recordset object on connection.
Set rstData = New ADODB.Recordset
rstData.Open strSQL, cnnConnect, adOpenForwardOnly
' Add new worksheet.
Set wksNew = ThisWorkbook.Worksheets.Add
' Create query table in new worksheet.
Set qtbData = _
wksNew.QueryTables.Add(rstData, wksNew.Range("A1"))
Вот почему я думал что есть такой вот легкий способ передачи данных из Delphi в Excel.
Amoeba (2009-02-28 18:48:00) [12]Автору вопроса изучить эти статьи:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=249
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=272
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=313
Neket (2009-02-28 18:23:00) [13]А где они есть? В ДатаСет?
Palladin (2009-02-28 18:22:00) [14]мдя... ) товарисч даже не соизволил разобраться, что происходит...
Anatoly Podgoretsky (2009-02-28 18:09:00) [15]В DataSource нет данных.
Neket (2009-02-28 16:27:00) [16]Вот Сдесь ключевая строчка
t:=x.ActiveSheet.QueryTables.Add(Connection:='TEXT;'c:\'+GUIDToString(h),
Destination:=Range("A1"));
А как сюда подвязать DataSource1?
Neket (2009-02-28 16:27:00) [17]Вот Сдесь ключевая строчка
t:=x.ActiveSheet.QueryTables.Add(Connection:='TEXT;'c:\'+GUIDToString(h),
Destination:=Range("A1"));
А как сюда подвязать DataSource1?
Palladin (2009-02-28 16:21:00) [18]вот те раз... там такая шакарная вещь на основе которой построена целая система отчетности... )
ну дело хозяйское... на...
Var
f:Text;
s:String;
i:Integer;
h:TGUID;
x:Olevariant;
t:OleVariant;
Begin
CreateGUID(h);
AssignFile(f,'c:\'+GUIDToString(h)); Rewrite(f);
While Not ds.Eof Do
Begin
s:='';
For i:=0 to ds.Fields.Count-1 Do
s:=s+ds.Fields[i].AsString+#9;
SetLength(s,Length(s)-1);
WriteLn(f,s);
End;
CloseFile(f);
x:=CreateOleObject('Excel.Application');
x.Visible:=True;
x.Workbooks.Add;
t:=x.ActiveSheet.QueryTables.Add(Connection:='TEXT;'c:\'+GUIDToString(h), Destination:=Range("A1"));
t.Name:=GUIDToString(h);
t.AdjustColumnWidth:=True;
t.TextFileParseType:=1;
t.TextFileTextQualifier:=1;
t.TextFileTabDelimiter:=True;
t.TextFileSemicolonDelimiter:=False;
t.TextFileCommaDelimiter:=False;
t.TextFileSpaceDelimiter:=False;
t.Refresh;
End;
Neket (2009-02-28 16:12:00) [19]Пробую так, но что-то мне подсказывает что это кривова-то я делаю. Навернео Ошибка Компилятора о несоответсвии типов.
XLApp:= CreateOleObject('Excel.Application');
XL:=XLApp.Workbooks.Add();
XLApp.Workbooks[1].WorkSheets[1].Name:='CGR';
XLApp.Visible:=true;
XL.Range['A1','K2858'].Value:=form1.DataSource1.DataSet;
А как привильно?
Neket (2009-02-28 16:09:00) [20]Ды дело в том что неочень хочется компанентами пользоваться... Хотца самому. Ну дай кусочек кода как это делатся ПЛЗ...