Работа с 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) и использование макросов.
Содержание
- C builder and excel
- Работа с Exсel из приложения, написанного на C++Builder (часть 2)
- Работа с сервером Excel
- Установка связи с объектом
- Работа с ячейками таблицы
C builder and excel
Часто задают вопрос, как можно передать данные в 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)
Источник
Работа с 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) и использование макросов.
Источник
Работа с сервером Excel
При создании нового документа в Excel (рабочая книга) из совокупности библиотек выбираются объекты, которые составляют каркас документа. Эти объекты доступны программисту.
Объект ExcelApplication задает приложение Excel, его свойства, методы и события характеризуют приложение в целом. Одно из свойств (Workbooks) возвращает все открытые в приложении рабочие книги.
Объект ExcelWorkbook задает рабочую книгу и имеет в свою очередь свойство Worksheets – все рабочие листы книги.
Объект Worksheet – это конкретный лист рабочей книги.
Установка связи с объектом
В библиотеке VCL имеются специальные компоненты, представляющие объекты Excel в приложении Builder C++. При проектировании приложения необходимо разместить на форме пиктограммы желаемых компонент, а для установки связи с объектами использовать метод Connect(). Вот несколько примеров такой связи:
Установить связь с Excel
Установить связь с активной рабочей книгой
ExcelWorkbook1-> ConnectTo (ExcelApplication1->ActiveWorkbook);
Установить связь с активным листом
ExcelWorksheet1 -> ConnectTo ( ExcelWorkbook1->ActiveSheet);
Получить лист, следующий за ExcelWorksheet1, и установить связь с ним
ExcelWorksheet2 -> ConnectTo (ExcelWorksheet1 -> get_Next());
Окно Excel станет видимым (или невидимым, если параметр равен false) только после вызова специального метода:
#define lcid LOCALE_SYSTEM_DEFAULT
Для вызова некоторых методов и свойств используется специальная константа LOCALE_SYSTEM_DEFAULT (lcid), ее значение равно 0.
Количество рабочих книг, открытых в приложении, и число рабочих листов в книге можно определить так:
int n= ExcelApplication1-> Workbooks-> Count;
n= ExcelWorkbook1-> Worksheets->Count;
Для открытия файла используется метод Open:
Для сохранения рабочей книги используется метод Save:
Можно добавить новую рабочую книгу и установить с ней связь.
ExcelWorkbook3-> ConnectTo ( ExcelApplication1->ActiveWorkbook);
Рабочая книга может иметь автора. Следующие операторы устанавливают и получают имя автора программно:
ExcelWorkbook1->set_Author(0,TVariant(«Павлов Иван Петрович»));
Сделать рабочий лист активным:
ExcelWorksheet2 ->Activate (lcid);
Можно установить новое имя листа:
Работа с ячейками таблицы
Запись значения в активную ячейку
Можно выделить указанную ячейку (например “D1”) и сделать ее активной:
ExcelWorksheet2 -> get_Range ((TVariant)»D1″,(TVariant)»D1″) -> Select();
В Excel предусмотрено обращение к ячейкам таблицы как к элементам двумерного массива Cells( , ). В Builder C++ сначала нужно получить доступ к этому массиву, вызвав метод get_Cells(), а затем метод set_Item( , , ) запишет заданное значение в элемент с указанными индексами. Все параметры перед передачей серверу должны быть упакованы в особый формат TVariant.
— число 222 записывается в ячейку с номерами (1,1):
ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)1,(TVariant)1,(TVariant)»222″);
— формула записывается в ячейку (2,2):
ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)2,(TVariant)2,(TVariant)»=A1+D1″);
для записи формул можно использовать функции:
ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)5,(TVariant)1,(TVariant)»=СУММА(A1:A3″);
for (i=0; i get_Cells()-> set_Item((TVariant)(i+1),(TVariant)(j+1),k);
Извлечение из ячейки:
k= (TVariant)ExcelWorksheet2 -> get_Cells()-> get_Item((TVariant)1,(TVariant)4);
ExcelWorksheet2 -> get_Range((TVariant)»A7″,(TVariant)»A7″)-> Select();
Объект Range рабочего листа ExcelWorksheet предоставляет удобный доступ к таблице и может представлять:
Например, в ячейку B1 занести число 4:
Запись формулы в ячейки “с3-с6”:
Когда формула присваивается диапазону ячеек, то переменные в формуле имеют относительные имена, поэтому в данном примере в ячейку c4 будет вписана формула “=a4 +b4” и т.д.
Название города помещается в 12 ячеек
Получить значение из ячейки можно следующим образом:
Очистить содержимое диапазона ячеек:
ExcelWorksheet2 -> get_Range((TVariant)»D1″,(TVariant)»E3″)-> Clear();
Копировать диапазон ячеек через буфер обмена:
При создании объектов Range нельзя пользоваться смещением. Тем не менее, можно использовать смещение, чтобы переходить от одного объекта Range к другому, например от одной ячейки к другой, отстоящей от первой на определенном расстоянии. Достигается это благодаря методу Offset объекта Range. Метод имеет два параметра: смещение по строкам и столбцам, и возвращает новый объект Range, отстоящий от прежнего на заданное расстояние.
Например, следующий оператор задает запись в ячейку, отстоящую от b5 на (–1, 3), то есть в ячейку
В следующем примере числами заполняется прямоугольная область (5 строк, 4 столбца; базовая ячейка “a3”):
for (i=0; i get_Range((TVariant)»a3″,(TVariant)»a3″)->
Источник
Apelsinych 0 / 0 / 0 Регистрация: 09.11.2013 Сообщений: 5 |
||||||||||||
1 |
||||||||||||
09.11.2013, 20:12. Показов 3564. Ответов 8 Метки нет (Все метки)
Здравствуйте! Недавно столкнулся с проблемой: необходимо считать построчно некоторые данные из ячейки. Файл выбирается пользователем.
Проблема №2:
Пожалуйста, помогите, очень надо!
Заранее спасибо!
0 |
1 / 1 / 1 Регистрация: 22.10.2013 Сообщений: 45 |
|
09.11.2013, 21:11 |
2 |
№1 Variant mExcel
0 |
Apelsinych 0 / 0 / 0 Регистрация: 09.11.2013 Сообщений: 5 |
||||||||
10.11.2013, 17:15 [ТС] |
3 |
|||||||
Я в начале сообщения написал, что Variable mExcel уже инициализирована.
Добавлено через 9 часов 58 минут
Если что, информацию брал здесь: http://forum.0day.kiev.ua/inde… pic=171148 (пост №3).
0 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
10.11.2013, 19:07 |
4 |
|||
1 |
Apelsinych 0 / 0 / 0 Регистрация: 09.11.2013 Сообщений: 5 |
||||
10.11.2013, 19:35 [ТС] |
5 |
|||
Спасибо, сейчас попробую Добавлено через 8 минут
0 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
10.11.2013, 21:22 |
6 |
|||
Ну, не знаю… Вот этот код:
только что прекрасно у меня отработал, файл (XML, кстати) открыл…
1 |
Apelsinych 0 / 0 / 0 Регистрация: 09.11.2013 Сообщений: 5 |
||||
11.11.2013, 08:46 [ТС] |
7 |
|||
Спасибо, заработало! Добавлено через 1 час 52 минуты
0 |
volvo Супер-модератор 32516 / 20997 / 8120 Регистрация: 22.10.2011 Сообщений: 36,264 Записей в блоге: 7 |
||||
11.11.2013, 11:26 |
8 |
|||
с построчным чтением из ячейки помочь, конечно, можно, но смысл твоих действий от меня ускользает. Поэтому просто покажу, как сделать, чтобы работало: 1) строки/столбцы в Excel-е индексируются с 1, а не с 0 Итого:
Аналогично и во второй части кода…
2 |
Apelsinych 0 / 0 / 0 Регистрация: 09.11.2013 Сообщений: 5 |
||||
11.11.2013, 20:14 [ТС] |
9 |
|||
UI, спасибо огромное, очень помогли! Добавлено через 33 минуты
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
11.11.2013, 20:14 |
Помогаю со студенческими работами здесь Построчное чтение Построчное чтение файла Построчное чтение файла Построчное чтение txt Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 9 |
Создаем книгу Excel и записываем свое значение в нужную нам ячейку Excel.
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, Cll; //Переменные App-Application //Bks-книга, Bk-книга, Shts-листы, Sht-лист, Cll-ячейка App=CreateOleObject("Excel.Application"); App.OlePropertySet("Visible", true); //Делаем нашу книгу видимой Bks=App.OlePropertyGet("Workbooks"); //Набор рабочих книг Excel App.OlePropertySet("SheetsInNewWorkbook", 1); //Количество листов в книге. В данном слачае 1 Bks.OleProcedure("Add"); //процедура добавления Bk=Bks.OlePropertyGet("Item",1); //Текущая книга Shts=Bk.OlePropertyGet("Worksheets"); //Набор страниц книги Excel Sht=Shts.OlePropertyGet("Item",1); //В какую страницу нам вставить значение Cll=Sht.OlePropertyGet("Cells").OlePropertyGet("Item", 6,10); //В какую ячейку Cll.OlePropertySet("Value", WideString("Наш текст")); //Наше значение. В данном случае "Наш текст" } //---------------------------------------------------------------------------
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
-
Просмотров: 8375
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.