![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Экспорт данных в Excel [D6, Access]
Dyusha © (2006-03-28 12:15:00)Добрый День Уважаемые Мастера!!! При помощи следующего кода эспортирую записи в Excel, но появляется следующая ошибка: "OLE error 800A03EC". в чем может быть проблема, с другими таблицами из этой же базы все проходит нормально.
var
XL, XArr: Variant;
i: Integer;
j: Integer;
begin
XArr := VarArrayCreate([1, ADOQuery2.FieldCount], varVariant);
XL := CreateOLEObject('Excel.Application');
XL.WorkBooks.add;
XL.visible := true;
XL.Workbooks[1].Worksheets[1].Name:=SeSkinLabel2.caption;
j := 1;
ADOQuery2.First;
while not ADOQuery2.Eof do
begin
i := 1;
while i <= ADOQuery2.FieldCount do
begin
XArr[i] := ADOQuery2.Fields[i - 1].Value;
i := i + 1;
end;
XL.Range['A' + IntToStr(j),
CHR(64 + ADOQuery2.FieldCount) + IntToStr(j)].Value := XArr;
ADOQuery2.Next;
j := j + 1;
end;
XL.Range['A1', CHR(64 + ADOQuery2.FieldCount) + IntToStr(j)].select;
XL.Selection.Font.Name := 'Arial';
XL.Selection.Font.Size := 10;
XL.selection.Columns.AutoFit;
XL.Range['A1', 'A1'].select;
Спасибо большое за любую оказанную помощь.
Dyusha (2006-04-04 16:09:00) [1]procedure FillSheet(Sheet: OleVariant; const TableName: String);
var
j, i: Integer;
XArr: OleVariant;
begin
// + 1 äëÿ çàãîëîâêà - èìåí ïîëåé
XArr := VarArrayCreate([1, ADOQuery2.RecordCount + 1, 1, ADOQuery2.FieldCount], varVariant);
for i := 0 to ADOQuery2.FieldCount - 1 do
XArr[1, i + 1] := ADOQuery2.Fields[i].FieldName;
j := 2; // çàïîëíèì âåñü ìàññèâ ñêîïîì
while not ADOQuery2.Eof do begin
for i := 1 to ADOQuery2.FieldCount do
if ADOQuery2.Fields[i - 1].DataType in [ftString, ftWideString, ftMemo]
then XArr[j, i] := #39 + ADOQuery2.Fields[i - 1].AsString
else XArr[j, i] := ADOQuery2.Fields[i - 1].Value;
Inc(j);
ADOQuery2.Next;
end;
R := Sheet.Range['A1', Sheet.Cells.Item[ADOQuery2.RecordCount + 1, ADOQuery2.FieldCount]];
R.Formula := XArr;
R.Font.Name := 'Arial';
R.Font.Size := 12;
R.Columns.AutoFit;
XArr := Unassigned;
end;
begin
XL := CreateOleObject('Excel.Application');
if VarIsEmpty(XL) then Exit; // âàùå íåò XL'ÿ!
WorkBook := XL.Application.WorkBooks.Add;
ASheet := WorkBook.WorkSheets[1];
XL.Workbooks[1].Worksheets[1].Name:=SeSkinLabel2.caption;
try
XL.Visible := True;
FillSheet(ASheet, 'NEW_FIZ_DOC');
if WorkBook.Sheets.Count < 2
then ASheet := WorkBook.Sheets.Add
else ASheet := WorkBook.Sheets[2];
finally
ASheet := Unassigned;
WorkBook := Unassigned;
XL := Unassigned;
end;
Вот так все работает чики-чики. Спасибо Shablya Alexander
sniknik (2006-03-31 13:01:00) [2]и кстати вся эта морока с массивами нафиг не нужна!
вместо
R := XL.ActiveSheet.Range['A1', CHR(64 + ADOQuery2.FieldCount) + IntToStr(ADOQuery2.RecordCount)];
R.Value := XArr;
делаеш
XL.ActiveSheet.Range['A1'].CopyFromRecordset(ADOQuery2.Recordset);
и все
а все, что связано с передачей в масив выкидываеш.
sniknik (2006-03-31 12:55:00) [3]хотя нет, не то, а это я тоже пропустил... ;)
XArr := VarArrayCreate([1, ADOQuery2. FieldCount, 1, ADOQuery2. RecordCount], varVariant);
(первым поля, вторым записи)
for i := 1 to ADOQuery2.FieldCount do
XArr[ j, i] := ADOQuery2.Fields[i - 1].Value;// // Выходим за значение массива
(первым записи, вторым поля)
поменяй местами, так XArr[ i, j]
Dyusha (2006-03-31 12:19:00) [4]"List index out of bounds (-1)"
;-(
sniknik (2006-03-31 08:10:00) [5]помедитируй над строкой
> for i := 1 to ADOQuery2.FieldCount do
;о))
sniknik (2006-03-31 08:08:00) [6]поля с нуля считаются.
Dyusha (2006-03-31 07:35:00) [7]Вот еще один вариант, делаю вот так:
var
XL, R, XArr: Variant;
i: Integer;
j: Integer;
begin
XL := CreateOLEObject('Excel.Application');
XL.WorkBooks.add;
XL.visible := true;
XL.Workbooks[1].Worksheets[1].Name:=SeSkinLabel2.caption;
j := 1;
ADOQuery2.First;
XArr := VarArrayCreate([1, ADOQuery2.FieldCount, 1, ADOQuery2.RecordCount], varVariant);
j := 1; // заполним весь массив скопом
while not ADOQuery2.Eof do
begin
for i := 1 to ADOQuery2.FieldCount do
*********************************************
вот в этом месте VARIANT ARRAY INDEX OUT OF BOUNDS
XArr[j, i] := ADOQuery2.Fields[i - 1].Value;// // Выходим за значение массива
Inc(j);
ADOQuery2.Next;
*********************************************
end;
R := XL.ActiveSheet.Range['A1', CHR(64 + ADOQuery2.FieldCount) +
IntToStr(ADOQuery2.RecordCount)];
R.Value := XArr;
R.Font.Name := 'Arial';
R.Font.Size := 10;
R.Columns.AutoFit;
В чем может быть проблема?
_RusLAN (2006-03-29 13:14:00) [8]Попробуйте присваивать не всю строку зараз
а отдельно каждое поле
и посмотрите на каком будет ошибка
так будет легче определить отчего она берется.
Dyusha (2006-03-28 14:19:00) [9]Я только вот не могу понять тут загвоздка в хранящихся данных или в форматах столбцов. Использую Office 2003
Dyusha (2006-03-28 13:51:00) [10]Наверное это связано со столбцами содержащими даты :-(
Они у меня туда попадают при помощи DateTimePicker
sniknik (2006-03-28 13:14:00) [11]This error is referenced in Knowledge Base article Q191974 and occurs because a single quote is in the expression or header for a field. The preceding error was generated because I missed a quote in the expression. If you need to output a single quote in an expression, then use two backslashes to prefix the quote. For instance, you may need to create an expression like Name's with a quote in it. To accomplish this you must use this syntax: ....
http://www.microsoft.com/mind/0799/beyond/beyond0799.asp
_RusLAN (2006-03-28 13:12:00) [12]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920