Форум: "Базы";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизЭкспорт данных в Excel Найти похожие ветки
← →
Dyusha © (2006-03-28 12:15) [0]Добрый День Уважаемые Мастера!!! При помощи следующего кода эспортирую записи в 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;
Спасибо большое за любую оказанную помощь.
← →
_RusLAN © (2006-03-28 13:12) [1]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920
← →
sniknik © (2006-03-28 13:14) [2]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
← →
Dyusha © (2006-03-28 13:51) [3]Наверное это связано со столбцами содержащими даты :-(
Они у меня туда попадают при помощи DateTimePicker
← →
Dyusha © (2006-03-28 14:19) [4]Я только вот не могу понять тут загвоздка в хранящихся данных или в форматах столбцов. Использую Office 2003
← →
_RusLAN © (2006-03-29 13:14) [5]Попробуйте присваивать не всю строку зараз
а отдельно каждое поле
и посмотрите на каком будет ошибка
так будет легче определить отчего она берется.
← →
Dyusha © (2006-03-31 07:35) [6]Вот еще один вариант, делаю вот так:
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;
В чем может быть проблема?
← →
sniknik © (2006-03-31 08:08) [7]поля с нуля считаются.
← →
sniknik © (2006-03-31 08:10) [8]помедитируй над строкой
> for i := 1 to ADOQuery2.FieldCount do
;о))
← →
Dyusha © (2006-03-31 12:19) [9]"List index out of bounds (-1)"
;-(
← →
sniknik © (2006-03-31 12:55) [10]хотя нет, не то, а это я тоже пропустил... ;)
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]
← →
sniknik © (2006-03-31 13:01) [11]и кстати вся эта морока с массивами нафиг не нужна!
вместо
R := XL.ActiveSheet.Range["A1", CHR(64 + ADOQuery2.FieldCount) + IntToStr(ADOQuery2.RecordCount)];
R.Value := XArr;
делаеш
XL.ActiveSheet.Range["A1"].CopyFromRecordset(ADOQuery2.Recordset);
и все
а все, что связано с передачей в масив выкидываеш.
← →
Dyusha © (2006-04-04 16:09) [12]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
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c