Как создать 3 ексель-файла одновременно

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Всем добрый день!

Мне нужно из таблицы выгрузить данные в 3 разных ексель-файла.
Создавать файлы по очереди не хочется, т.к. придется 3 раза проходить одну и ту же таблицу, это лишнее время.
Вроде нашла команду xlSetActiveWorkBookByName, но не получается раскидать информацию по файлам, все пишется в один, получается каша.

Можно такое сделать?
Кто сказал, что бесполезно биться головой об стену?!
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как создать 3 ексель-файла одновременно

Сообщение RAJAH »

Вырезка из моего кода:

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

...
.{while i<n
.begin
   xlCreateNewExcelWithTemplate(shabl,true);
   xlSetActiveWorkBook(i);
end.
...
.begin
   i:=i+1;
   xlKillExcel;
end.
.}
.endform
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Не получается, 3 "шапки" собирает в одну

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

  nf_xlsPers:=str_path+'persons_'+datetostr(cur_date(),'DD-MM-YYYY')+'.xlsx';
  nf_xlsTypesVS:=str_path+'TypesVS_'+datetostr(cur_date(),'DD-MM-YYYY')+'.xlsx';
  nf_xlsDocs:=str_path+'Docs_'+datetostr(cur_date(),'DD-MM-YYYY')+'.xlsx';

  xlCreateExcelWithTemplate(nf_xlsPers,true);
  xlSetActiveWorkBook(1);
  xlSetCellStringValue('Таб.№',1,1,1,1);
  xlSetCellStringValue('ФИО',1,2,1,2);
  xlSetCellStringValue('Дата рожд.',1,3,1,3);
  xlSetCellStringValue('Дата приказа о приеме на работу',1,4,1,4);
  xlSetCellStringValue('№ приказа о приеме на работу',1,5,1,5);
  xlSetCellStringValue('Должность по ШР',1,6,1,6);
  xlSetCellStringValue('№ приказа о назначении на должность',1,7,1,7);
  xlSetCellStringValue('Дата приказа о назначении на должность',1,8,1,8);
  xlSetCellStringValue('Подразделение по ШР',1,9,1,9);
  xlSetCellStringValue('№ диплома о высшем образовании',1,10,1,10);
  xlSetCellStringValue('Дата выдачи диплома',1,11,1,11);
  xlSetCellStringValue('Наименование ВУЗа',1,12,1,12);

  xlCreateExcelWithTemplate(nf_xlsTypesVS,true);
  xlSetActiveWorkBook(2);
  xlSetCellStringValue('Таб.№',1,1,1,1);
  xlSetCellStringValue('Тип ВС',1,2,1,2);
  xlSetCellStringValue('№ свидетельства',1,3,1,3);
  xlSetCellStringValue('Дата выдачи',1,4,1,4);
  xlSetCellStringValue('Учебное заведение',1,5,1,5);

  xlCreateExcelWithTemplate(nf_xlsDocs,true);
  xlSetActiveWorkBook(3);
  xlSetCellStringValue('Таб.№',1,1,1,1);
  xlSetCellStringValue('Тип документа',1,2,1,2);
  xlSetCellStringValue('№ документа',1,3,1,3);
  xlSetCellStringValue('Дата выдачи',1,4,1,4);
  xlSetCellStringValue('Учебное заведение',1,5,1,5);
  xlSetCellStringValue('Уровень ICAO',1,6,1,6);

  _row1:=2; _row2:=2; _row3:=2;

  _loop persons
  { 
    ......
! выводим информацию в 1-й файл
    xlSetActiveWorkBook(1);
    xlSetCellStringValue(string(tabnom+10000000),_row1,1,_row1,1);
    xlSetCellStringValue(persons.fio,_row1,2,_row1,2);
    xlSetCellDateValue(persons.borndate,_row1,3,_row1,3);
    xlSetCellDateValue(dPrFirstApp,_row1,4,_row1,4);
    xlSetCellStringValue(NPrFirstApp,_row1,5,_row1,5);
    xlSetCellStringValue(dolgn,_row1,6,_row1,6);
    xlSetCellStringValue(NPrCurApp,_row1,7,_row1,7);
    xlSetCellDateValue(dPrFirstApp,_row1,8,_row1,8);
    xlSetCellStringValue(podr,1,9,1,9);
   ...........
    _row1:=_row1+1;
  }

  xlKillExcel();

Кто сказал, что бесполезно биться головой об стену?!
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как создать 3 ексель-файла одновременно

Сообщение RAJAH »

"Убейте" ранее открытый Excel перед вызовом нового. Получается, всё равно по очереди формируются отчёты...
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

если я его убью, то как я потом писать в него буду?
мне же в цикле по таблице persons нужно писать во все 3 файла одновременно (разную информацию).
Кто сказал, что бесполезно биться головой об стену?!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как создать 3 ексель-файла одновременно

Сообщение edward_K »

А кто вам сказал что книги имеют индификатор 1,2,3? Попробуйте их по имени переключать. Не лишне сделать проверку на ошибки - что возвращают xl функции? Вообще удобней писать в разные листы, а не книги.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Как создать 3 ексель-файла одновременно

Сообщение m0p3e »

Тут xlOpenWorkBook нужно использовать, но муторно.
IMHO намного проще заполнить три матрицы и поочередно открывая файлы их сливать.

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

var m1,m2,m3 : LongInt;
m1 := xlCreateMatrixEx (,);
.............
xlStWritetoMatrixEx(m1,iRow,iCol,'')
.............

s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

По имени переключать пробовала, но было то же самое.

Суть задачи такова, что это должна быть ночная выгрузка с данными, запускаемая в авто-режиме.
Файлы создаются в определенном месте каждую ночь.
Эти данные будут перегружаться в другую задачу, и та задача ставит требование, что это должны быть 3 отдельных файла.
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Как создать 3 ексель-файла одновременно

Сообщение Den »

+1 m0p3e
Вы бы лучше бы избавились от xlSetCellStringValue...тогда бы и выгружалось побыстрее на порядок
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Спасибо, попробую с матрицами, только где можно почитать про эти функции?
В excel.doc я не нашла таких....
Как записать в матрицу переменную типа дата? Только в строку преобразовывать?
И еще, как переписать данные из матрицы в эксель-файл со строго определенным именем в определенную папку так, чтобы файл при этом еще и НЕ остался открытым?
Кто сказал, что бесполезно биться головой об стену?!
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как создать 3 ексель-файла одновременно

Сообщение RAJAH »

s2176 писал(а):как переписать данные из матрицы в эксель-файл со строго определенным именем в определенную папку так, чтобы файл при этом еще и НЕ остался открытым?
Закрыть его после записи! :)

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

...
    bul:=xlOpenExcel(false);
    xlDisplayAlerts(false);
...
    bul:=xlSaveAsWorkBook(1, papka+sklkod+'.xls');
...
    xlKillExcel;
    ExecProgram('taskkill', '/im excel.exe /f', 4096, 0);
...
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Получилось, спасибо, RAJAH!
И все-таки где можно найти описание этих функций?
Кто сказал, что бесполезно биться головой об стену?!
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как создать 3 ексель-файла одновременно

Сообщение RAJAH »

s2176 писал(а):где можно найти описание этих функций?
Excel_Lib.pdf на ftp.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Как создать 3 ексель-файла одновременно

Сообщение edward_K »

Для закрытия нужной книги есть еще xlCloseWorkBookByName. Зачем же все процессы прибивать? Хотя для автомата эт наверное надежней.
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Re: Как создать 3 ексель-файла одновременно

Сообщение s2176 »

Спасибо всем за помощь!
Есть еще один некритичный вопрос.
Я заранее не знаю, сколько будет строк в матрице, поэтому описываю с запасом, например:
xlCreateMatrixEx(50000,6)
А можно как-то изменить количество, после прохода по таблице, когда уже точно известно количество строк?
Кто сказал, что бесполезно биться головой об стену?!
Ответить