Выгрузка массива в диапазон Excel
От: molinero  
Дата: 03.01.12 12:24
Оценка:
Если длина строки > 256 символов — в ячейке отображается ######, если длина строки > 920 символов, то при записи в диапазон возникает ошибка OLE error


enlarger := 1;

  Excel:=CreateOleObject('Excel.Application');
  Excel.Application.EnableEvents := false;
  try
    Excel.SheetsInNewWorkBook:=1;
    WorkBook:=Excel.WorkBooks.Add;
    WorkSheet:=WorkBook.WorkSheets[1];

    tmpQuery:=TQuery.Create(self);
    with tmpQuery do begin
      Close;
      SQL.Clear;
      SQL.Add('текст запроса');
      Open;

      First;
      while not EOF do begin
        Range := WorkSheet.Range[WorkSheet.Cells[RecNo+enlarger, 1], WorkSheet.Cells[RecNo+enlarger, 10]];
        Range.NumberFormat := '@';
        Range.Value := Массив VarArray
        next;
        end;
      end;


  finally
  Excel.Visible:=true;
  Excel:=UnAssigned;
  end;


Ошибка возникает на 2003 и 2010 Excel'е, на 2007 ошибка не возникает, но ###### так же присутствуют.
Если занчение присваивать не диапазону, а ячейке — все происходит точно так же.
Как обойти это ограничение?
Re: Выгрузка массива в диапазон Excel
От: BlackEric http://black-eric.lj.ru
Дата: 03.01.12 17:13
Оценка:
Здравствуйте, molinero, Вы писали:

M>Если длина строки > 256 символов — в ячейке отображается ######, если длина строки > 920 символов, то при записи в диапазон возникает ошибка OLE error



Вы пытаетесь работать с Excel через Sql?
TQuery это что?
https://github.com/BlackEric001
Re[2]: Выгрузка массива в диапазон Excel
От: BlackEric http://black-eric.lj.ru
Дата: 03.01.12 17:16
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, molinero, Вы писали:


M>>Если длина строки > 256 символов — в ячейке отображается ######, если длина строки > 920 символов, то при записи в диапазон возникает ошибка OLE error



BE>Вы пытаетесь работать с Excel через Sql?

BE>TQuery это что?


Также покажите строку подключение, текст запроса и
что это Range.Value := Массив VarArray ?

В какой строке ошибка возникает?
https://github.com/BlackEric001
Re[2]: Выгрузка массива в диапазон Excel
От: molinero  
Дата: 05.01.12 08:00
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, molinero, Вы писали:


M>>Если длина строки > 256 символов — в ячейке отображается ######, если длина строки > 920 символов, то при записи в диапазон возникает ошибка OLE error



BE>Вы пытаетесь работать с Excel через Sql?

BE>TQuery это что?

Нет... Создаю запрос к таблице и выбираю данные.

tmpQuery:=TQuery.Create(self);
    with tmpQuery do begin
      Close;
      SQL.Clear;
      SQL.Add('текст запроса'); //Абсолютно не важнен, в данном случае, текст запроса
      Open;


Прохожу по всем строкам из выборки и присваиваю диапазону Excel массив значений

while not EOF do begin
        Range := WorkSheet.Range[WorkSheet.Cells[RecNo+enlarger, 1], WorkSheet.Cells[RecNo+enlarger, 10]];
        Range.NumberFormat := '@';
        Range.Value := Массив VarArray //массив создается функцией VarArrayCreate()
        next;
        end;
      end;


Все нормално до тех пор, пока длина текста в одной из ячеек не станет больше 920 символов, причем на всех компьютерах происходит по разному. 2007 офис вин7-32 переваривает нормально, сервер2008р2 2003 офис и вин7-64 2010 офис наталкивается на это препятствие.
Re[3]: Выгрузка массива в диапазон Excel
От: molinero  
Дата: 05.01.12 08:34
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, BlackEric, Вы писали:


BE>>Здравствуйте, molinero, Вы писали:


M>>>Если длина строки > 256 символов — в ячейке отображается ######, если длина строки > 920 символов, то при записи в диапазон возникает ошибка OLE error



BE>>Вы пытаетесь работать с Excel через Sql?

BE>>TQuery это что?


BE>Также покажите строку подключение, текст запроса и

BE>что это Range.Value := Массив VarArray ?

BE>В какой строке ошибка возникает?


Это функция которая возвращает вариантный массив.
function TfMakeReport.LineOfReport(TimeStart, TimeStop, Organization, WorkPlace, Count, CountHours, ClientK, OrganizationK, Task: Variant): Variant;
var Line: Variant; i: integer;s: string;
begin

  Line := VarArrayCreate([0, 9], varVariant);
  Line[0] := FormatDateTime('dd.mm.yyyy hh:mm', TimeStart);
  Line[1] := FormatDateTime('t', TimeStart);
  Line[2] := FormatDateTime('t', TimeStop);
  Line[3] := Organization;
  Line[4] := WorkPlace;
  Line[5] := String(Count);        //в этих строках без приведения к типу ни чего не изменяется
  Line[6] := String(CountHours);   //в этих строках без приведения к типу ни чего не изменяется
  Line[7] := String(ClientK);      //в этих строках без приведения к типу ни чего не изменяется
  Line[8] := String(OrganizationK);//в этих строках без приведения к типу ни чего не изменяется
  Line[9] := Task; //Ошибка происходит если длина текста в этой переменной > 920. Если меньше ошибки не возникает.
  Result := Line;

end;


Возникает в этой строке

Range.Value := LineOfReport({параметры});
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.