Работа с Exсel из приложения, написанного на C++Builder (часть 2)
Итак, начинаем второй урок по работе с Excel из C++Builder.
Первый
урок был достаточно коротким, после него возникло множество вопросов
и в этом уроке мы попытаемся ответить на многие из них.
Кроме того, на многие вопросы ответили Вы сами,
прислав
примеры своих работ с Excel.
Все ответы и примеры построены на программном коде первого урока
(http://cbuilder.ru/WinLesson/bles1.htm)
——————————————
Список вопросов, ответы на которые приводятся в данном уроке.
1 Как получить из ячейки не только ее значение, но и формулу данной ячейки
?
2 Как нарисовать диаграмму ?
3 Как нарисовать границы у выбранного диапазона ячеек (бордюр) ?
4 Как получить значение какой-либо ячейки ?
5 Как задать формат для ячейки ?
6 Как установить масштаб для документа ?
7 Как выровнять данные в ячейке ?
8 Как установить высоту строки ?
9 Как установить ширину столбца ?
10 Как установить цвет ячеек ?
11 Как задать количество листов в книге ?
12 Как дать название листу ?
13 Как сохранить получившийся документ ?
14 Как установить настройки при печати ?
14 Как распечатать получившийся документ ?
15 Как закрыть документ Excel ?
и множество других…
——————————————
Для того, чтобы лучше понять работу с Excel, рассмотрим иерархию объектов
в Excel.
Примерная иерархия вложенных объектов OLE-сервера.
Итак, на вершине — объект Application (у нас в примере Variant App),
Workbooks — книга (не используем), работаем сразу с листом — WorkSheets
— у нас Variant Sh,
группы ячеек Cells — для них используем объект Variant Rang;
«Свойствами объектов Excel могут являться так называемые коллекции
объектов.
Например, коллекция Workbooks является свойством объекта Excel.Application,
при этом она содержит
набор вложенных объектов — рабочих книг Excel, а те, в свою очередь, обладают
свойством Worksheets,
представляющим собой коллекцию рабочих листов, каждый из которых обладает
свойством Cells,
являющимся коллекцией ячеек.
Аналогично, коллекция Charts также является свойством рабочей книги»
из статьи «
Создание контроллеров автоматизации
с помощью C++Builder» Наталия Елманова
Итак, запускаем предыдущий проект и добавляем в него следующий код.
Вопрос. У меня в ячейке есть число, но оно рассчитывается
по формуле в этой ячейке.
Как получить из ячейки не только ее значение, но и формулу данной ячейки
?
// получить формулу из ячейки
Variant __fastcall TForm1::fromExcelFormula(int Row, int Column)
{
try{
Variant result,cur;
cur = Sh.OlePropertyGet(«Cells»,Row,Column);
result = cur.OlePropertyGet(«Formula»);
return result;
}catch(…) {;}
}
// получаем значение и формулу из ячейки 34,5
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label3->Caption = fromExcelCell(34,5); // получить значение из ячейки
Label4->Caption = fromExcelFormula(34,5); // получить формулу из ячейки
}
//————————————————
Вопрос. Как нарисовать диаграмму ?
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Variant Chart;
Chart=App.OlePropertyGet(«Charts»).OleFunction(«Add»);
// добавим объект диаграмму
Chart.OlePropertySet(«ChartType»,65); // установим один из типов
диаграммы
// выберем ячейки для построения диаграммы, это строки 3 — 31 и столбец
3
Chart.OleProcedure(«SetSourceData»,Sh.OlePropertyGet(«Range»,Sh.OlePropertyGet(«Cells»,3,3),
Sh.OlePropertyGet(«Cells»,31,3)),2);
Chart.OlePropertyGet(«SeriesCollection»,1).OlePropertySet(«XValues»,Sh.OlePropertyGet(«Range»,
Sh.OlePropertyGet(«Cells»,2,3),Sh.OlePropertyGet(«Cells»,31,3)));
Chart.OleProcedure(«Location»,2,Sh.OlePropertyGet(«Name»));
// установим место вывода диаграммы
// для этого получим UsedRange — испольуемый диапазон ячеек, и отступим
вниз на 25 пикселей
Sh.OlePropertyGet(«ChartObjects»,1).
OlePropertySet(«Top»,Sh.OlePropertyGet(«UsedRange»).OlePropertyGet(«Height»)+25);
// и слева от края 10 пикселей
Sh.OlePropertyGet(«ChartObjects»,1).OlePropertySet(«left»,10);
// встаем на начало
Sh.OlePropertyGet(«Cells»,1,1).OleProcedure(«Select»);
}
//——————————————————
Вопрос. Как нарисовать границы у выбранного диапазона
ячеек (бордюр) ?
// Устанавливаем диапазон ячеек для рисования бордюра A2:E31
int m = 30;
AnsiString s = «A2:E»+IntToStr(m+1);
Variant range = App.OlePropertyGet(«Range», s.c_str());
for (int i=1; i<=4; i++)
range.OlePropertyGet(«Borders»).OlePropertyGet(«Item»,
i).OlePropertySet(«LineStyle», 1);
//——————————————————
Вопрос. Как получить значение какой-либо ячейки
?
Label3->Caption = fromExcelCell(34,5); // получить значение ячейки
34,5
// получить значение ячейки
Variant __fastcall TForm1::fromExcelCell(int Row, int Column)
{
try{
Variant result,cur;
cur = Sh.OlePropertyGet(«Cells»,Row,Column);
result = cur.OlePropertyGet(«Value»);
return result;
}catch(…) {;}
}
//——————-
Вопрос. Как задать формат для ячейки ?
// устанавливаем формат числа для ячейки 1,1
Sh.OlePropertyGet(«Cells», 1,1).OlePropertySet(«NumberFormat»,
«0.00»);
// устанавливаем формат строка для ячейки 1,2
Sh.OlePropertyGet(«Cells», 1,2).OlePropertySet(«NumberFormat»,
«@»);
// устанавливаем формат даты для ячейки 1,3
Sh.OlePropertyGet(«Cells», 1,3).OlePropertySet(«NumberFormat»,
«ДД.ММ.ГГГГ»);
//——————-
Вопрос. Как установить масштаб для документа ?
// Устанавливаем масштаб = 75%
App.OlePropertyGet(«ActiveWindow»).OlePropertySet(«Zoom»,
75);
//——————-
Вопрос. Как выровнять данные в ячейке ?
// Выравнивам данные в ячейке
Sh.OlePropertyGet(«Cells», 1,1).OlePropertySet(«HorizontalAlignment»,
4);
// где 4 — по левому краю, 2 — по правому, 3 — по центру)
// или по-другому это можно записать так
// Rang = Sh.OlePropertyGet(«Cells»,1,1);
// Rang.OlePropertySet(«HorizontalAlignment»,4);
// и для вертикального выравнивания — VerticalAlignment
//——————-
Вопрос. Как установить высоту строки ?
// устанавливаем высоту 60
Rang.OlePropertySet(«RowHeight», 60);
//——————-
Вопрос. Как установить ширину столбца ?
// устанавливаем ширину столбца 12
Sh.OlePropertyGet(«Columns»).OlePropertyGet(«Item»,1).OlePropertySet(«ColumnWidth»,
12);
//——————-
Вопрос. Как установить цвет ячеек ?
Rang = Sh.OlePropertyGet(«Range», «A1:E1»);
Rang.OlePropertyGet(«Interior»).OlePropertySet(«ColorIndex»,4);
//——————-
Вопрос. Как задать количество листов в книге ?
// Определяем количество листов в книге — 1
App.OlePropertySet(«SheetsInNewWorkbook», 1);
//——————-
Вопрос. Как дать название листу ?
// Даем название нашему листу «Наш лист итогов»
Sh = App.OlePropertyGet(«Worksheets»).OlePropertyGet(«Item»,
1);
Sh.OlePropertySet(«Name», «Наш лист итогов»);
//——————-
Вопрос. Как сохранить получившийся документ ?
// Не спрашивать о замене файла, если он уже есть
App.OlePropertySet(«DisplayAlerts», false);
// Сохраняем файл как «Firm.xls»
App.OlePropertyGet(«WorkSheets»,1).OleProcedure(«SaveAs»,»Firm.xls»);
//———————
Вопрос. Как установить настройки при печати ?
// Левое и правое поля отступа для печати
Sh.OlePropertyGet(«PageSetup»).OlePropertySet(«LeftMargin»,
80);
Sh.OlePropertyGet(«PageSetup»).OlePropertySet(«RightMargin»,20);
//———————
Вопрос. Как распечатать получившийся документ ?
App.OlePropertyGet(«WorkBooks»,1).OleProcedure(«PrintOut»);
//———————
Вопрос. Как закрыть документ Excel ?
try{
App.OlePropertyGet(«WorkBooks»,1).OleProcedure(«Close»);
}catch(…){
ShowMessage(«Не забудьте сами закрыть Excel.»);
}
// закрыть сам Excel
App.OleProcedure(«Quit»);
//——————————
Посмотреть как все это работает и другие возможности
для C++Builder 6 полный проект можно скачать и посмотреть в
работе здесь (15 Кб).
Многие спрашивают — как ускорить вывод
в Excel больших массивов данных,
слишком медленно все работает.
Наиболее идеальный вариант — воспользоваться
компонентами XLSReadWrite2 или аналогичными.
Также, в проекте есть пример, как можно немного ускорить такой вывод,
для этого при выводе данных можно не выводить
данные последовательно в каждую ячейку
в цикле, а лучше сформировать вариантный массив, и выполнить присвоение
области (Range)
этого массива, только после этого делая Excel видимым.
Также более быстрая работа происходит при использовании
библиотеки типов.
Все замечания и предложения и добавления: support@cbuilder.ru
Если Вы используете Excel или Word в работе с C++Builder,
присылайте примеры, проекты и интересные решения нам,
а также если у вас остались вопросы — спрашивайте.
В следующем уроке:
Для облегчения вывода данных в Excel можно использовать шаблоны.
Мы рассмотрим работу с шаблонами (.xlt) и использование макросов.
Содержание
- Excel application c builder
- Excel application c builder
- Работа с Exсel из приложения, написанного на C++Builder (часть 2)
Excel application c builder
Часто задают вопрос, как можно передать данные в Excel и управлять им из приложения, написанного на C++Builder
Для этого есть несколько путей. Рассмотрим один из вариантов — как это сделать через технологию OLE, не используя
компоненты с вкладки Office97 палитры компонентов.
Мы можем вывести данные в новый файл Excel, или заранее создать шаблон .xlt и выводить данные в шаблон.
На этом уроке мы создадим новый файл (новую книгу)
Пример с шаблоном рассмотрим в следующем уроке.
Давайте построим простое приложение C++Builder и передадим из него:
данные, формулы и сохраним получившийся файл на диске, после чего можем и закрыть Excel.
Итак, создаем новое приложение C++Builder, назовем файл с формой main.cpp и форма по умолчанию Form1.
Для удобства вынесем все наши действия в отдельные функции.
Разместим на форме Form1 кнопку bToExcel и 2 компонента DateTimePicker, назовем их DTP1 и DTP2
Присвоим в конструкторе формы им значения Ну вот приложение и готово.
Если Вам не хочется набирать вручную, готовый пример проекта к C++Builder 6 можно скачать здесь (.rar 5 Кб)
Запустите его, откомпилируйте и посмотрите результат.
Теперь также просто Вы можете в своих программах это все повторить.
Точно также передаваемые данные можно взять из БД, нужным образом обработать и передать в Excel.
Для того, чтобы посмотреть что еще и как можно делать с Excel Вы можете запустить Excel,
зайти в редактор по VisualBasic и посмотреть там какие еще команды (функции) есть для управления.
А на следующем уроке мы поговорим о том, как можно передать данные в шаблон (.xlt)
Источник
Excel application c builder
В предыдущих уроках мы сами формировали отчет в 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 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)
Всё .
Теперь запустим макрос на выполнение
и необходимые действия из макроса будут выполнены.
Разумеется, нужно, чтобы эти макросы были подготовлены заранее
и сохранены в шаблоне, а уже при формировании отчета (.xls) на
основании этого шаблона (.xlt), макросы можно будет применять.
Источник
Работа с Exсel из приложения, написанного на C++Builder (часть 2)
Первый урок был достаточно коротким, после него возникло множество вопросов
и в этом уроке мы попытаемся ответить на многие из них.
Кроме того, на многие вопросы ответили Вы сами,
прислав примеры своих работ с Excel.
Все ответы и примеры построены на программном коде первого урока
(http://cbuilder.ru/WinLesson/bles1.htm)
Список вопросов, ответы на которые приводятся в данном уроке.
1 Как получить из ячейки не только ее значение, но и формулу данной ячейки ?
2 Как нарисовать диаграмму ?
3 Как нарисовать границы у выбранного диапазона ячеек (бордюр) ?
4 Как получить значение какой-либо ячейки ?
5 Как задать формат для ячейки ?
6 Как установить масштаб для документа ?
7 Как выровнять данные в ячейке ?
8 Как установить высоту строки ?
9 Как установить ширину столбца ?
10 Как установить цвет ячеек ?
11 Как задать количество листов в книге ?
12 Как дать название листу ?
13 Как сохранить получившийся документ ?
14 Как установить настройки при печати ?
14 Как распечатать получившийся документ ?
15 Как закрыть документ Excel ?
Для того, чтобы лучше понять работу с Excel, рассмотрим иерархию объектов в Excel.
Примерная иерархия вложенных объектов OLE-сервера.
Итак, на вершине — объект Application (у нас в примере Variant App),
Workbooks — книга (не используем), работаем сразу с листом — WorkSheets — у нас Variant Sh,
группы ячеек Cells — для них используем объект Variant Rang;
«Свойствами объектов Excel могут являться так называемые коллекции объектов.
Например, коллекция Workbooks является свойством объекта Excel.Application, при этом она содержит
набор вложенных объектов — рабочих книг Excel, а те, в свою очередь, обладают свойством Worksheets,
представляющим собой коллекцию рабочих листов, каждый из которых обладает свойством Cells,
являющимся коллекцией ячеек.
Аналогично, коллекция Charts также является свойством рабочей книги»
из статьи » Создание контроллеров автоматизации с помощью C++Builder» Наталия Елманова
Итак, запускаем предыдущий проект и добавляем в него следующий код.
Вопрос. У меня в ячейке есть число, но оно рассчитывается по формуле в этой ячейке.
Как получить из ячейки не только ее значение, но и формулу данной ячейки ?
// получить формулу из ячейки
Variant __fastcall TForm1::fromExcelFormula(int Row, int Column)
<
try <
Variant result,cur;
cur = Sh.OlePropertyGet(«Cells»,Row,Column);
result = cur.OlePropertyGet(«Formula»);
return result;
>catch(. ) <;>
>
// получаем значение и формулу из ячейки 34,5
void __fastcall TForm1::Button1Click(TObject *Sender)
<
Label3->Caption = fromExcelCell(34,5); // получить значение из ячейки
Label4->Caption = fromExcelFormula(34,5); // получить формулу из ячейки
>
//————————————————
Вопрос. Как нарисовать диаграмму ?
void __fastcall TForm1::Button5Click(TObject *Sender)
<
Variant Chart;
Chart=App.OlePropertyGet(«Charts»).OleFunction(«Add»); // добавим объект диаграмму
Chart.OlePropertySet(«ChartType»,65); // установим один из типов диаграммы
// выберем ячейки для построения диаграммы, это строки 3 — 31 и столбец 3
Chart.OleProcedure(«SetSourceData»,Sh.OlePropertyGet(«Range»,Sh.OlePropertyGet(«Cells»,3,3),
Sh.OlePropertyGet(«Cells»,31,3)),2);
Chart.OlePropertyGet(«SeriesCollection»,1).OlePropertySet(«XValues»,Sh.OlePropertyGet(«Range»,
Sh.OlePropertyGet(«Cells»,2,3),Sh.OlePropertyGet(«Cells»,31,3)));
Chart.OleProcedure(«Location»,2,Sh.OlePropertyGet(«Name»));
// установим место вывода диаграммы
// для этого получим UsedRange — испольуемый диапазон ячеек, и отступим вниз на 25 пикселей
Sh.OlePropertyGet(«ChartObjects»,1).
OlePropertySet(«Top»,Sh.OlePropertyGet(«UsedRange»).OlePropertyGet(«Height»)+25);
// и слева от края 10 пикселей
Sh.OlePropertyGet(«ChartObjects»,1).OlePropertySet(«left»,10);
// встаем на начало
Sh.OlePropertyGet(«Cells»,1,1).OleProcedure(«Select»);
>
//——————————————————
Вопрос. Как нарисовать границы у выбранного диапазона ячеек (бордюр) ?
// Устанавливаем диапазон ячеек для рисования бордюра A2:E31
int m = 30;
AnsiString s = «A2:E»+IntToStr(m+1);
Variant range = App.OlePropertyGet(«Range», s.c_str());
for (int i=1; i Вопрос. Как получить значение какой-либо ячейки ?
Label3->Caption = fromExcelCell(34,5); // получить значение ячейки 34,5
// получить значение ячейки
Variant __fastcall TForm1::fromExcelCell(int Row, int Column)
<
try <
Variant result,cur;
cur = Sh.OlePropertyGet(«Cells»,Row,Column);
result = cur.OlePropertyGet(«Value»);
return result;
>catch(. ) <;>
>
//——————-
Вопрос. Как задать формат для ячейки ?
// устанавливаем формат числа для ячейки 1,1
Sh.OlePropertyGet(«Cells», 1,1).OlePropertySet(«NumberFormat», «0.00»);
// устанавливаем формат строка для ячейки 1,2
Sh.OlePropertyGet(«Cells», 1,2).OlePropertySet(«NumberFormat», «@»);
// устанавливаем формат даты для ячейки 1,3
Sh.OlePropertyGet(«Cells», 1,3).OlePropertySet(«NumberFormat», «ДД.ММ.ГГГГ»);
Вопрос. Как установить масштаб для документа ?
// Устанавливаем масштаб = 75%
App.OlePropertyGet(«ActiveWindow»).OlePropertySet(«Zoom», 75);
Вопрос. Как выровнять данные в ячейке ?
// Выравнивам данные в ячейке
Sh.OlePropertyGet(«Cells», 1,1).OlePropertySet(«HorizontalAlignment», 4);
// где 4 — по левому краю, 2 — по правому, 3 — по центру)
// или по-другому это можно записать так
// Rang = Sh.OlePropertyGet(«Cells»,1,1);
// Rang.OlePropertySet(«HorizontalAlignment»,4);
// и для вертикального выравнивания — VerticalAlignment
Вопрос. Как установить высоту строки ?
// устанавливаем высоту 60
Rang.OlePropertySet(«RowHeight», 60);
Вопрос. Как установить ширину столбца ?
// устанавливаем ширину столбца 12
Sh.OlePropertyGet(«Columns»).OlePropertyGet(«Item»,1).OlePropertySet(«ColumnWidth», 12);
Вопрос. Как установить цвет ячеек ?
Rang = Sh.OlePropertyGet(«Range», «A1:E1»);
Rang.OlePropertyGet(«Interior»).OlePropertySet(«ColorIndex»,4);
Вопрос. Как задать количество листов в книге ?
// Определяем количество листов в книге — 1
App.OlePropertySet(«SheetsInNewWorkbook», 1);
Вопрос. Как дать название листу ?
// Даем название нашему листу «Наш лист итогов»
Sh = App.OlePropertyGet(«Worksheets»).OlePropertyGet(«Item», 1);
Sh.OlePropertySet(«Name», «Наш лист итогов»);
Вопрос. Как сохранить получившийся документ ?
// Не спрашивать о замене файла, если он уже есть
App.OlePropertySet(«DisplayAlerts», false);
// Сохраняем файл как «Firm.xls»
App.OlePropertyGet(«WorkSheets»,1).OleProcedure(«SaveAs»,»Firm.xls»);
Вопрос. Как установить настройки при печати ?
// Левое и правое поля отступа для печати
Sh.OlePropertyGet(«PageSetup»).OlePropertySet(«LeftMargin», 80);
Sh.OlePropertyGet(«PageSetup»).OlePropertySet(«RightMargin»,20);
Вопрос. Как распечатать получившийся документ ?
Вопрос. Как закрыть документ Excel ?
try <
App.OlePropertyGet(«WorkBooks»,1).OleProcedure(«Close»);
>catch(. ) <
ShowMessage(«Не забудьте сами закрыть Excel.»);
>
// закрыть сам Excel
App.OleProcedure(«Quit»);
//——————————
Посмотреть как все это работает и другие возможности
для C++Builder 6 полный проект можно скачать и посмотреть в работе здесь (15 Кб).
Многие спрашивают — как ускорить вывод в Excel больших массивов данных ,
слишком медленно все работает.
Наиболее идеальный вариант — воспользоваться компонентами XLSReadWrite2 или аналогичными.
Также, в проекте есть пример, как можно немного ускорить такой вывод,
для этого при выводе данных можно не выводить данные последовательно в каждую ячейку
в цикле, а лучше сформировать вариантный массив, и выполнить присвоение области (Range)
этого массива, только после этого делая Excel видимым.
Также более быстрая работа происходит при использовании библиотеки типов.
Все замечания и предложения и добавления: support@cbuilder.ru
Если Вы используете Excel или Word в работе с C++Builder,
присылайте примеры, проекты и интересные решения нам,
а также если у вас остались вопросы — спрашивайте.
В следующем уроке:
Для облегчения вывода данных в Excel можно использовать шаблоны.
Мы рассмотрим работу с шаблонами (.xlt) и использование макросов.
Источник
Author: Pixelot12345
How to use the Excel.Application in C++Builder. Target device is Win64.
Use the ComObj, call in CreateOleObject (“Excel.Application”).
Including ComObj is required.
In C++Builder it is below.
//// #include «System.Win.ComObj.hpp» |
Import from CSV file to Excel file.
//// constexpr wchar_t const def_filename[] = L«C:EmbarcaderoExcel_testBook1.xlsx»; constexpr wchar_t const csv_file[] = L«C:EmbarcaderoExcel_testcsv.csv»; |
We will implement this process.
Prepare the TButton.
TButton is one in a simple form.
Next is the TButton OnClick event.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
///// constexpr wchar_t const def_excel_name[] = L«Excel.Application»; void __fastcall TForm1::Button1Click(TObject *Sender) { Variant ExcelApp = CreateOleObject(def_excel_name); try { Variant excel_book; Variant excel_sheet; UnicodeString excel_filename{def_filename}; try { ExcelApp.OlePropertySet(«Visible», true); //setup Show Excel. excel_book = ExcelApp.OlePropertyGet(«Workbooks»). OleFunction(«Open»,static_cast<WideString>(excel_filename)); //Open Excel File. excel_sheet = excel_book.OlePropertyGet(«WorkSheets»). OlePropertyGet(«Item», static_cast<WideString>(«Sheet1»)); //Select Sheet Name or Number. /* excel_sheet.OlePropertyGet(«Cells»). OlePropertyGet(«Item»,1,2).OlePropertySet(«Value»,(WideString)L»文字»); //Write String Cell. cell_set(excel_sheet.OlePropertyGet(«Cells»), 1, 1, «a»); //One Cell SetValue. */ load_csv_toCell(csv_file,excel_sheet.OlePropertyGet(«Cells»)); excel_book.OleProcedure(«Save»); } __finally { excel_book = Unassigned(); excel_sheet = Unassigned(); } ExcelApp.OleProcedure(«Quit»); //Quit Excel. } __finally { ExcelApp = Unassigned(); } } |
Sheet name is “Sheet 1”.
Next we will create two methods.
//// void __fastcall TForm1::cell_set(System::Variant cells, int row_, int col, String value_) { try { //Write to one of the cell. cells.OlePropertyGet(«Item»,row_,col) .OlePropertySet(«Value»,static_cast<WideString>(value_)); } catch(...){} } |
Read the file with TStringList.And, you write to the specified cell.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//// void __fastcall TForm1::load_csv_toCell(String csv_filename, System::Variant cells) { auto csv_ = {std::make_unique<TStringList>()}; std::wstringstream cols_; std::wstring value_ = L«»; int column_count_{0}; try { (*csv_.begin())—>LoadFromFile(csv_filename); //Read file. for (int i=0; i < (*csv_.begin())—>Count; i++) //Retrieve one row. { //Separate one line. column_count_ = 0; //Column Count = 0. cols_.clear(); //Clear Rows. cols_.str(StringReplace((*csv_.begin())—>Strings[i],L«»«, ««,TReplaceFlags()<<rfReplaceAll).w_str()); while (std::getline(cols_, value_, L‘,’)){ column_count_++; cell_set(cells,i + 1,column_count_,value_.c_str()); }; } } catch(...){} } |
Write the imported CSV file to Excel.
Создаем книгу Excel, переименовываем листы, добавляем листы и сохраняем книгу в папку.
Создать книгу Excel на С++. Переименовать листы Excel на C++. Добавить листы Excel на C++. Сохранить файл Excel на C++.
Unit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <Comobj.hpp> // Хидер для OLE объектов //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Variant App, Bks, Bk, Shts, Sht; //Переменные App-Application, Bks-книги, //Bk-книга, Shts-листы, Sht-лист App=CreateOleObject("Excel.Application"); // Создаем Excel Application App.OlePropertySet("Visible", true); //Делаем нашу Excel книгу видимой Bks=App.OlePropertyGet("Workbooks"); //Набор рабочих книг App.OlePropertySet("SheetsInNewWorkbook", 2); //Количество листов в книге. Теперь будет 2 страницы Bks.OleProcedure("Add"); //Процедура добавления Bk=Bks.OlePropertyGet("Item", 1); //Текущая книга Shts=Bk.OlePropertyGet("Worksheets"); //Набор страниц книги Excel // Первый лист Sht=Shts.OlePropertyGet("Item", 1); //Лист 1 Sht.OlePropertySet("Name", WideString(" Лист")); //Имя у него "Первый Лист" // Второй лист Sht=Shts.OlePropertyGet("Item", 2); //Лист 2 Sht.OlePropertySet("Name", WideString(" Листок")); //Имя у него "Второй Лист" App.OlePropertySet("DisplayAlerts", false); //Не спрашивать призамене файла // Теперь его сохраним в папку "excel", путь C:excel App.OlePropertyGet("WorkBooks",1).OleProcedure("SaveAs", WideString("C:\excel\data.xlsx") ) ; } //---------------------------------------------------------------------------
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
- Подробности
- Родительская категория: Уроки и примеры программирования на С++
- Категория: Уроки и примеры программирования C++ Embarcadero RAD Studio 10 | C++ Builder 10
-
Просмотров: 6872
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { DTP1->Date = Now() - 30; DTP2->Date = Now(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MakeReport(); } //--------------------------------------------------------------------------- // а вот и вся программа void TForm1::MakeReport() { // запускаем Excel ExcelInit(""); // записываем в него заголовки toExcelCell(1,1,WideString("Дата")); toExcelCell(1,2,WideString("Наименование")); toExcelCell(1,3,WideString("Количество")); toExcelCell(1,4,WideString("Цена за еденицу")); toExcelCell(1,5,WideString("Сумма")); // записываем в него данные for(int i=0; i < 30; i++){ toExcelCell(i+2, 1, Variant(DTP1->Date + i)); AnsiString s = "Молоко "+IntToStr(i+1)+"% жирности"; toExcelCell(i+2, 2, WideString(s)); toExcelCell(i+2, 3, Variant(i*2+3)); toExcelCell(i+2, 4, Variant(i*17.5+1)); toExcelCell(i+2, 5, Variant((i*2+3) * (i*17.5+1))); } toExcelCell(32,1,WideString("Итого")); // записываем 2 формулы (диапазон значений) formulaExcel(32, 3, 30); formulaExcel(32, 5, 30); // еще формула toExcelCell(34,1,WideString("Налог 5%")); App.OlePropertyGet("Cells", 34, 5).OlePropertySet("Formula", WideString("=E32*5%")); // делаем его видимым if(!App.IsEmpty())App.OlePropertySet("Visible",true); // сохраняем его на диске в файл MyTest.xls try{ App.OlePropertyGet("WorkBooks",1).OleProcedure("SaveAs","MyTest"); }catch(...){ ShowMessage("Не забудьте сохранить сделанные изменения !"); } // можем при желании и сразу закрыть, если закрывать не нужно - удалите этот блок //--- try{ App.OlePropertyGet("WorkBooks",1).OleProcedure("Close"); }catch(...){ ShowMessage("Не забудьте сами закрыть Excel."); } //--- // освобождаем ресурсы Sh.Clear(); App.Clear(); } //-------------------------------------------------------------------------- void __fastcall TForm1::ExcelInit(String File) { // если Excel запущен - подключиться к нему try { App=Variant::GetActiveObject("Excel.Application"); } catch(...) { // Excel не запущен - запустить его try { App=Variant::CreateObject("Excel.Application"); } catch (...) { Application->MessageBox(L"Невозможно открыть Microsoft Excel!" L"Возможно Excel не установлен на компьютере.",L"Ошибка",MB_OK+MB_ICONERROR); } } try { if(File!="") App.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str()); else App.OlePropertyGet("WorkBooks").OleProcedure("add"); Sh=App.OlePropertyGet("WorkSheets",1); } catch(...) { Application->MessageBox(L"Ошибка открытия книги Microsoft Excel!", L"Ошибка",MB_OK+MB_ICONERROR); } }/* ExcelInit() */ //--------------------------------------------------------------------------- void __fastcall TForm1::toExcelCell(int Row,int Column, WideString data) { try { Variant cur = Sh.OlePropertyGet("Cells", Row,Column); cur.OlePropertySet("Value", data); //ShowMessage("1"); } catch(...) { ; } }/* toExcelCell() */ //--------------------------------------------------------------------------- void __fastcall TForm1::toExcelCell(int Row,int Column, Variant data) { try { Variant cur = Sh.OlePropertyGet("Cells", Row,Column); cur.OlePropertySet("Value", data); //ShowMessage("2"); } catch(...) { ; } } //--------------------------------------------------------------------------- void __fastcall TForm1::formulaExcel(int sRow, int sColumn, int row) { try { App.OlePropertyGet("Cells", sRow, sColumn).OlePropertySet("FormulaR1C1",WideString("=СУММ(R[-"+WideString(row)+"]C:R[-1]C)")); } catch(...) { ; } }/* formulaExcel() */ //--------------------------------------------------------------------------- |