link6486 link6487 link6488 link6489 link6490 link6491 link6492 link6493 link6494 link6495 link6496 link6497 link6498 link6499 link6500 link6501 link6502 link6503 link6504 link6505 link6506 link6507 link6508 link6509 link6510 link6511 link6512 link6513 link6514 link6515 link6516 link6517 link6518 link6519 link6520 link6521 link6522 link6523 link6524 link6525 link6526 link6527 link6528 link6529 link6530 link6531 link6532 link6533 link6534 link6535 link6536 link6537 link6538 link6539 link6540 link6541 link6542 link6543 link6544 link6545 link6546 link6547 link6548 link6549 link6550 link6551 link6552 link6553 link6554 link6555 link6556 link6557 link6558 link6559 link6560 link6561 link6562 link6563 link6564 link6565 link6566 link6567 link6568 link6569 link6570 link6571 link6572 link6573 link6574 link6575 link6576 link6577 link6578 link6579 link6580 link6581 link6582 link6583 link6584 link6585 link6586 link6587 link6588 link6589 link6590 link6591 link6592 link6593 link6594 link6595 link6596 link6597 link6598 link6599 link6600 link6601 link6602 link6603 link6604 link6605 link6606 link6607 link6608 link6609 link6610 link6611 link6612 link6613 link6614 link6615 link6616 link6617 link6618 link6619 link6620 link6621 link6622 link6623
Дать объявление бесплатно доска объявлений екатеринбург, частные объявления о продаже детской одежды на Etozdes. Красивые большие буфера на фото http://eroticzoom.info/bolshie-siski/.
Работа с Exсel из приложения, написанного на C++Builder   (часть 3)
Итак, начинаем третий урок по работе с Excel из C++Builder.
Мы рассмотрим работу с шаблонами (.xlt) и использование макросов.

В предыдущих уроках мы сами формировали отчет в Excel, от начала и до конца,
но это не всегда удобно, иногда проще создать нужную форму отчета (шаблон .xlt),
а уже потом выводить в нее данные (например из базы данных).
Особенно это удобно, если форма отчета может незначительно измениться,
тогда нет необходимости вносить изменения в проект на C++Builder,
достаточно будет лишь изменить шаблон.
Кроме того, часть информации рассчитывается по формулам, записанным в шаблон,
и при изменении этих формул, также нет необходимости вносить изменения
в проект на C++Builder,достаточно изменить формулу в шаблоне.

Давайте рассмотрим этот вариант.

У нас есть некая база данных, и в ней таблица поставщиков SaleMan
и связанная с ней таблица товаров Goods, которые они поставляют.
Создадим на их основе отчет "Счет-фактура" и "Накладная" по
выбранному поставщику.

Оба отчета будут использовать один шаблон (.xlt) и выводиться в один файл (.xls)
(на одном листе WorkSheets 1 — Счет-фактура, на другом WorkSheets 2 — Накладная)
Создадим шаблон отчета (рассмотрите прилагаемый файл NaclSf.xlt)
Всем полям, в которые будут выводиться данные, дадим интуитивно понятные
имена.

Например: НомерНАКЛ , ДатаНАКЛ, ПоставщикНАКЛ, ИННПНАКЛ, НомерСФ , ДатаСФ и др.

Формат таблиц SaleMan и Goods следующий:

SaleMan

ID integer ID поставщика
Org string Hазвание организации-поставщика
Addr string Адрес поставщика
InnOrg string ИНН постащика

Goods

ID integer ID товара
IDSale integer поставщик товара
Name string наименование товара
Izmer string единица измерения
Count float количество
Price float цена за ед изм

---

Разумеется это крайне обрезанный и упрощенный вариант, удобный для примера.

Variant App, Sh;
TDate Today = Now();

// устанавливаем путь к файлу шаблона
AnsiString sFile = GetCurrentDir()+"\\NaclSf.xlt";

// инициализируем Excel, открываем этот шаблон
try {
App=Variant::GetActiveObject("Excel.Application");
} catch(...) {
try { App=Variant::CreateObject("Excel.Application"); }
catch (...) {
Application->MessageBox("Невозможно открыть Microsoft Excel!"
" Возможно этого приложения на компьютере не установлено.","Ошибка",MB_OK+MB_ICONERROR);
}}
try {
App.OlePropertyGet("WorkBooks").OleProcedure("Open",sFile.c_str(),0,false,1);
Sh=App.OlePropertyGet("WorkSheets",1);
} catch(...) {
Application->MessageBox("Ошибка открытия книги Microsoft Excel!","Ошибка",MB_OK+MB_ICONERROR);
}

// выводим в шаблон данные
// сначала заголовок
toExcel(App,"НомерНАКЛ",SaleManID->Value);
toExcel(App,"ДатаНАКЛ",Today.DateString());
toExcel(App,"ПоставщикНАКЛ",SaleManOrg->Value.c_str());
toExcel(App,"ИННПНАКЛ",SaleManInn->Value.c_str());

toExcel(App,"НомерСФ",SaleManID->Value);
toExcel(App,"ДатаСФ",Today.DateString());
toExcel(App,"АдресПСФ",SaleManAddr->Value.c_str());
toExcel(App,"ПоставщикСФ",SaleManOrg->Value.c_str());
toExcel(App,"ИННПСФ",SaleManInn->Value.c_str());

// определяем в n количество товара (строк для ввода в шаблон)
Goods->First();
int n = 0; while(!Goods->Eof) { n++; Goods->Next(); }
// или int n = Goods->RecordCount;

// вставляем в шаблон нужное количество строк
Variant C;
App.OlePropertyGet("WorkSheets",1).OleProcedure("Select");
C=App.OlePropertyGet("Range","ТоварСФ");
C=App.OlePropertyGet("Rows",(int) C.OlePropertyGet("Row")+1);
for(int i=1;i<n;i++) C.OleProcedure("Insert");

App.OlePropertyGet("WorkSheets",2).OleProcedure("Select");
C=App.OlePropertyGet("Range","ТоварНАКЛ");
C=App.OlePropertyGet("Rows",(int) C.OlePropertyGet("Row")+1);
for(int i=1;i<n;i++) C.OleProcedure("Insert");

// вывод данных из накладной в эти строки
Goods->First();
int i = 0;
while(!Goods->Eof){
toExcel(App,"ТоварСФ",i,GoodsName->Value.c_str());
toExcel(App,"ТоварНАКЛ",i,GoodsName->Value.c_str());
toExcel(App,"НомерППНАКЛ",i,i+1);
toExcel(App,"СтранаСФ",i,"Россия");
toExcel(App,"ЕдизмСФ",i,GoodsIzmer->Value.c_str());
toExcel(App,"ЕдизмНАКЛ",i,GoodsIzmer->Value.c_str());
toExcel(App,"КолСФ",i,GoodsCount->Value);
toExcel(App,"КолНАКЛ",i,GoodsCount->Value);
toExcel(App,"ЦенаСФ",i,GoodsPrice->Value);
toExcel(App,"ЦенаНАКЛ",i,GoodsPrice->Value);
toExcel(App,"СтоимСФ",i,GoodsPrice->Value*GoodsCount->Value);
toExcel(App,"СтоимостьСНДССФ",i,(GoodsPrice->Value*GoodsCount->Value*5)/100.);
toExcel(App,"ВсегоНАКЛ",i,GoodsPrice->Value*GoodsCount->Value);
toExcel(App,"СуммаНДССФ",i,(GoodsPrice->Value*GoodsCount->Value*5)/100.);
toExcel(App,"СуммаНДСНАКЛ",i,(GoodsPrice->Value*GoodsCount->Value*5)/100.);
i++; Goods->Next();
}

// и наконец, делаем Excel видимым
App.OlePropertySet("Visible",true);

Полный проект примера к C++Builder 6 с шаблоном и таблицами можно скачать здесь (12 Кб)

----

Теперь об использовании макросов.

Практически любые наши действия в Excel могут быть описаны с помощью макросов.
Создадим и запишем в шаблоне новый макрос, дадим ему имя. (например MyMacros1)
Всё !!!
Теперь запустим макрос на выполнение

App.OleProcedure("Run","MyMacros1");

и необходимые действия из макроса будут выполнены.
Разумеется, нужно, чтобы эти макросы были подготовлены заранее
и сохранены в шаблоне, а уже при формировании отчета (.xls) на
основании этого шаблона (.xlt), макросы можно будет применять.

Все замечания и предложения и добавления: support@cbuilder.ru
Если Вы используете Excel или Word в работе с C++Builder,
присылайте примеры, проекты и интересные решения нам,
а также если у вас остались вопросы — спрашивайте.