link6674 link6675 link6676 link6677 link6678 link6679 link6680 link6681 link6682 link6683 link6684 link6685 link6686 link6687 link6688 link6689 link6690 link6691 link6692 link6693 link6694 link6695 link6696 link6697 link6698 link6699 link6700 link6701 link6702 link6703 link6704 link6705 link6706 link6707 link6708 link6709 link6710 link6711 link6712 link6713 link6714 link6715 link6716 link6717 link6718 link6719 link6720 link6721 link6722 link6723 link6724 link6725 link6726 link6727 link6728 link6729 link6730 link6731 link6732 link6733 link6734 link6735 link6736 link6737 link6738 link6739 link6740 link6741 link6742 link6743 link6744 link6745 link6746 link6747 link6748 link6749 link6750 link6751 link6752 link6753 link6754 link6755 link6756 link6757 link6758 link6759 link6760 link6761 link6762 link6763 link6764 link6765 link6766 link6767 link6768 link6769 link6770 link6771 link6772 link6773 link6774 link6775 link6776 link6777 link6778 link6779 link6780 link6781 link6782 link6783 link6784 link6785 link6786 link6787 link6788 link6789 link6790 link6791 link6792 link6793 link6794 link6795 link6796 link6797 link6798 link6799 link6800 link6801 link6802 link6803 link6804 link6805 link6806 link6807 link6808 link6809 link6810 link6811 link6812 link6813 link6814 link6815
Работа с 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,
присылайте примеры, проекты и интересные решения нам,
а также если у вас остались вопросы — спрашивайте.