Страница 1 из 2

На работает xlWriteMatrixToExcel

Добавлено: 05 май 2011, 18:01
beatlov
Добрый день!Для оптимизации работы с выгрузкой в Excel решил переделать несколько отчетов на выгрузку с помощью матриц.
Но xlWriteMatrixToExcel не срабатывает. Хотя при трассировании кода - видно, что матрица заполняется корректно, функции по заполнению возвращают true. Сама матрица тоже объявлена корректно.
кусок кода работы с матрицами:
xlCreateExcelWithTemplate(('T:\ШАБЛОНЫ\Галактика\ шаблон.xls '),True);
i_:=1;
j_:=1;
//функция для определения количества записей в view
strcount_:=fGetSum_(strCount);
xlWriteMatrixToExcel(StrCount, 25);
xlClearMatrix;
_loop SMNMTOZAYAVKAREN {

xlDoWriteToMatrix(i_, 1, i_);
xlStWriteToMatrix(i_, 2, xxx.PID);
xlStWriteToMatrix(i_, 3, xxx.name);
xlStWriteToMatrix(i_, 4, yyyy.name);
xlStWriteToMatrix(i_, 5, yyyy.Gost);
........
xlStWriteToMatrix(i_, 23,katpodr.name);
i_:=i_+1;
}
xlWriteMatrixToExcel(4, 1);
xlSaveAsWorkBook(1,GetPathParameter('Files','OutputFilesDirectory',0)+'ОТЧЕТ2.xls');
xlFreeMatrix;
xlKillExcel;

Re: На работает xlWriteMatrixToExcel

Добавлено: 05 май 2011, 19:19
Vik
Вместо xlWriteMatrixToExcel(StrCount, 25); надо xlCreateMatrix(StrCount, 25)

Re: На работает xlWriteMatrixToExcel

Добавлено: 26 сен 2013, 07:49
Алексей
Какое ограничение на кол-во записей в матрицу?
10тыс. записей пишутся красиво, а вот 140тыс. записей... выводится пустой эксель...

Re: На работает xlWriteMatrixToExcel

Добавлено: 26 сен 2013, 08:58
RAJAH
Судя по документации, 65536.

Код: Выделить всё

// В библиотеке превышение этих констант нигде не проверяется
MaxExcelRow = 65536;
MaxExcelCol = 256;

Re: На работает xlWriteMatrixToExcel

Добавлено: 26 сен 2013, 09:25
edward_K
Но вывод возможен в 2007 офисе и выше. Вообще разработчик выводит блоками , обычно строк по 100. Ну и следите за счетчиками - они должны быть longint

Re: На работает xlWriteMatrixToExcel

Добавлено: 26 сен 2013, 11:01
Алексей
я подозревал... печально :) как раз ушёл из старых экселей где дробил по листам чтобы выгружать данные в один лист и попадаюсь на ограниченном размере матрицы... ну буду резать тысяч по 10тыс. спсб.

Re: На работает xlWriteMatrixToExcel

Добавлено: 26 сен 2013, 12:23
Алексей
что то не получилось... записалось ровно 60 тыс. записей, а следующая часть - пусто... т.е. она как то проанализировала что матрицу 10'000 х 50 если писать с позиции 60'001 х 1 она не входит типа в 65'565 ?

осталось slk попробовать?

проверил, xlWriteMatrixToExcel выдаёт false если конечная строчка превышает 65565.

Re: На работает xlWriteMatrixToExcel

Добавлено: 27 сен 2013, 10:51
edward_K
Точно знаю, что в FSS4 при выводе расшифровки проблем нет. Пробовать пока некогда. Проверьте тип переменных, которые используете.

Re: На работает xlWriteMatrixToExcel

Добавлено: 30 сен 2013, 13:19
Алексей
участвующих в выводе в эксель переменных типа word найдено не было :) а ФСС4 формируется как, прямой записью в эксель или xlt шаблоны или skl ?

Re: На работает xlWriteMatrixToExcel

Добавлено: 30 сен 2013, 13:42
edward_K
Как то так

Код: Выделить всё

  xlCreateMatrix(100, 20);
  var LastRecord:longint;
  LastRecord:= 2;
  if SetSheet('Расшифровка')
  {
    SetVisualHeader(''#13'Перенос информации в Excel: Расшифровка');
    var nmbRow : longint;
    var jk,ik:longint;
    nmbRow := 2;
    ik := 2;
    jk := 1;
    _loop RasshifrSum
    {
      if (jk = 100)
      {
        xlWriteMatrixToExcel((ik - 99), 1);
        jk := 1;
        xlClearMatrix;
      }
      xlStWriteToMatrix(jk, 1,GetStrTabn(RasshifrSum.Tabn,RasshifrSum.StrTabn)); //Табельный номер
      xlStWriteToMatrix(jk, 2,RasshifrSum.FIO);               //ФИО
      xlStWriteToMatrix(jk, 3,RasshifrSum.PodrName);          //Подразделение
      xlStWriteToMatrix(jk, 4,string(RasshifrSum.nmbTable));  //Номер таблицы
      xlStWriteToMatrix(jk, 5,RasshifrSum.nameField);         //Название поля
      xlStWriteToMatrix(jk, 6,string(RasshifrSum.MonthV));    //Месяц в котором
      xlStWriteToMatrix(jk, 7,string(RasshifrSum.YearV));     //Год в котором
      xlStWriteToMatrix(jk, 8,string(RasshifrSum.MonthZ));    //Месяц за который
      xlStWriteToMatrix(jk, 9,string(RasshifrSum.YearZ));     //Год за который
      xlStWriteToMatrix(jk,10,string(RasshifrSum.FromBegYear)); //признак итоговой записи (с начала года)
      xlStWriteToMatrix(jk,11,string(RasshifrSum.VidOpl));    //Вид оплаты
      xlDoWriteToMatrix(jk,12,RasshifrSum.Summa);             //Сумма
      LastRecord:= (ik + 1) - jk;
      inc(nmbRow);
      inc(ik);
      inc(jk);
    }
  }
  xlWriteMatrixToExcel(LastRecord, 1);
  xlClearMatrix;

Re: На работает xlWriteMatrixToExcel

Добавлено: 01 окт 2013, 06:25
Алексей
ну я как то так же и писал, только блоками по 10 тыс. записей.

т.е. при такой схеме у вас получается вывести больше 65565 строчек ?

Re: На работает xlWriteMatrixToExcel

Добавлено: 01 окт 2013, 10:59
edward_K
не у меня 8) . Но вроде выводит. Может быть шаблон надо также в формате 2007 подсовывать? Хотя вроде в обычный выводят.

Re: На работает xlWriteMatrixToExcel

Добавлено: 01 окт 2013, 11:57
edward_K
накидал простенький примерчик
В общем если на вход подсунуть шаблон 2010 , то нормально, а если 2003 то нет.
Есть функция для определении версии установленного офиса, только инициализация Excel все равно нужна - то есть открыли посмотрели, закрыли, открыли нужный шаблон.
- xlCheckExcelInstall():boolean - определение установлен ли Excel на компьютер.
- xlGetVersionExcelInstall(var sVersion : string):boolean. Параметром sVersion
возвращается версия Excel установленная на компьютере.

Код: Выделить всё

  xlOpenNewExcel(false)
  xlGetVersionExcelInstall(VersionExcel);
  xlKillExcel;
  if double(VersionExcel)>11

Re: На работает xlWriteMatrixToExcel

Добавлено: 02 окт 2013, 02:23
LaaLaa
Памятка для администраторов Галактики 8.1
«Формирование отчетов Excel размером более 65536 строк»

Суть проблемы. Формат файлов XLS строй версии Microsoft Excel 97-2003 не поддерживает листы размером более чем 65536 строк. Данное ограничение было снято в более поздних версиях Microsoft Excel 2007-2010. Соответственно, изменился формат файлов XLSX.

Более подробно см статьи на тему «Технические характеристики и ограничения Microsoft Excel»
- Применимо к Excel 2003 http://office.microsoft.com/ru-ru/excel ... 99291.aspx
- Применимо к Excel 2007 http://office.microsoft.com/ru-ru/excel ... 73849.aspx
- Применимо к Excel 2010 http://office.microsoft.com/ru-ru/excel ... 42495.aspx

В Галактике 8.1 часть отчетов реализована с примирением шаблонов и макросов Excel.

В дистрибутиве Галактики шаблоны поставляются старом формате XLT «Шаблон Excel 97-2003» т.к. множество пользователей все еще используют старые версии офиса. Соответственно при формировании отчетов большого объема пользователь будет получать ошибку, даже если на его рабочем месте установлена новая версия Excel 2010. Происходит это, потому что сам формат файла не поддерживает большое количество строк.

Чтобы решить проблему шаблон отчета требуется конвертировать в новый формат XLTM «Шаблон Excel с поддержкой макросов».

См. также: Пошаговая инструкция по конвертации на примере

Re: На работает xlWriteMatrixToExcel

Добавлено: 02 окт 2013, 11:31
Irina_
Спасибо, LaaLaa. Полезная информация. Насколько я понимаю, при изменении с патчами стандартного шаблона описанную процедуру конвертации надо будет повторять.