C builder ячейки excel

Работа с 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) и использование макросов.


Содержание

  1. C builder and excel
  2. Работа с Exсel из приложения, написанного на C++Builder (часть 2)
  3. Работа с сервером Excel
  4. Установка связи с объектом
  5. Работа с ячейками таблицы

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте! Недавно столкнулся с проблемой: необходимо считать построчно некоторые данные из ячейки. Файл выбирается пользователем.
(Переменная Variable mExcel есть, включены <utilcls.h> и <comobj.h>) (И да, я нуб, не судите строго)
Проблема №1:
Пишет «Неверный тип переменной»

C++
1
2
3
4
5
if(Form2->OpenDialog1->Execute())
        filename=Form2->OpenDialog1->FileName;
mExcel = CreateOleObject("Excel.Application");
 mExcel.OlePropertySet("Visible", False);
 mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", filename);

Проблема №2:
Не работает считывание

C++
1
2
3
4
5
6
7
8
9
10
11
TStringList *tt=new TStringList;
for(int i=0;i<8;i++)
  {
   tt->Add(mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", 10, "C").OlePropertyGet("Value"));
   Form2->ListBox1->Items->AddStrings(tt);
  }
  mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", "C:\ElDnevFiles\1Ponedelnik.xml");
  for(int a=0;a<8;a++)
  {
   mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", 1, "A").OlePropertySet("Value", tt->Strings[a]);
  }

Пожалуйста, помогите, очень надо!
З.Ы.
И как дополнение на тему OLE [необязательно к прочтению]:
Выдаёт ошибку «IsBound() @ c:bcbemuvclutilcls.h/4249» при выполнении кода

C++
1
2
3
4
5
6
7
8
sch++;
  mExcel = CreateOleObject("Excel.Application");
  mExcel.OlePropertySet("Visible", False);
  FileOpen();
  mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", sch, "A").OlePropertySet("Value", urokName);
  FileSave();
  mExcel.OleProcedure("Quit");
  Form2->ComboBox1->Text="Select "+(sch+1);

Заранее спасибо!



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 уже инициализирована.

C++
1
2
3
4
#include <utilcls.h>
#include <comobj.h>
 
Variable mExcel;

Добавлено через 9 часов 58 минут
Вообщем я покопался, и нашёл, что ошибку «IsBound() @ c:bcbemuvclutilcls.h/4249» выдаёт на этом месте:

C++
1
mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", "C://ElDnevFiles//1Ponedelnik");

Если что, информацию брал здесь: http://forum.0day.kiev.ua/inde… pic=171148 (пост №3).



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

10.11.2013, 19:07

4

C++
1
mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", WideString("C:\ElDnevFiles\1Ponedelnik.xml"));



1



Apelsinych

0 / 0 / 0

Регистрация: 09.11.2013

Сообщений: 5

10.11.2013, 19:35

 [ТС]

5

Спасибо, сейчас попробую

Добавлено через 8 минут
К сожалению, вылетает с той же ошибкой

C++
1
mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", WideString("C:\ElDnevFiles\1Ponedelnik.xml"));



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

10.11.2013, 21:22

6

Ну, не знаю… Вот этот код:

C++
1
2
3
4
5
6
    WideString filename;
    if(Form1->OpenDialog1->Execute())
        filename=Form1->OpenDialog1->FileName;
    Variant mExcel = CreateOleObject("Excel.Application");
    mExcel.OlePropertySet("Visible", True);
    mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", filename);

только что прекрасно у меня отработал, файл (XML, кстати) открыл…



1



Apelsinych

0 / 0 / 0

Регистрация: 09.11.2013

Сообщений: 5

11.11.2013, 08:46

 [ТС]

7

Спасибо, заработало!

Добавлено через 1 час 52 минуты
Извините, но не мог бы кто-нибудь всё-таки помочь мне с построчным чтением из ячейки? Просто мой код не работает:

C++
1
2
3
4
5
6
7
8
9
10
for(int i=0;i<8;i++)
  {
   tt->Add(mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", y+9, "C").OlePropertyGet("Value"));
   Form2->ListBox1->Items->AddStrings(tt);
  }
  mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", "C:\ElDnevFiles\1Ponedelnik.xml");
  for(int j=0;j<8;j++)
  {
   mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", j+1, "A").OlePropertySet("Value", tt->Strings[j]);
  }



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

11.11.2013, 11:26

8

Цитата
Сообщение от Apelsinych
Посмотреть сообщение

с построчным чтением из ячейки

помочь, конечно, можно, но смысл твоих действий от меня ускользает. Поэтому просто покажу, как сделать, чтобы работало:

1) строки/столбцы в Excel-е индексируются с 1, а не с 0
2) Обращаться к ячейкам нужно по их индексам, а не по именам.

Итого:

C++
1
2
3
4
5
for(int i=1;i<9;i++)
{
    tt->Add(mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", y+9, 3).OlePropertyGet("Value"));
    Form2->ListBox1->Items->AddStrings(tt);
}

Аналогично и во второй части кода…



2



Apelsinych

0 / 0 / 0

Регистрация: 09.11.2013

Сообщений: 5

11.11.2013, 20:14

 [ТС]

9

UI, спасибо огромное, очень помогли!

Добавлено через 33 минуты
UI, извините, я вот сижу и ничего не понимаю: моя программа почему-то считывает в ListBox1 сразу всё содержимое ячейки, не учитывая переходы строк. В чём проблема?

C++
1
2
3
4
5
6
7
8
9
10
11
 for(int i=0;i<8;i++)
 {
  tt->Add(mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", y+9, 3).OlePropertyGet("Value"));
  Form2->ListBox1->Items->AddStrings(tt);
 }
 mExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", filename);
 for(int j=0;j<8;j++)
 {
  b=Form2->ListBox1->Items->Strings[j];
  mExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells", j+1, 1).OlePropertySet("Value", b);
 }



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

11.11.2013, 20:14

Помогаю со студенческими работами здесь

Построчное чтение
мне нужно построчно прочесть файл и представить его в виде массива. как это сделать?

Построчное чтение файла
Здравствуйте. У меня возникла проблема с построчным чтением файла. На форуме так и не нашёл. Суть…

Построчное чтение файла
Помогите пожалуйста, не могу доделать программу, точнее я её сделала но не так как бы мне хотелось….

Построчное чтение txt
У меня есть txt вида:
&quot;1x
2q
3w
4e
5r
и т.д&quot;
нужно как-то взять и постоянно подставлять…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

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.

Понравилась статья? Поделить с друзьями:
  • Byval vba excel что это
  • Calculate table in excel
  • Byval vba excel описание
  • Calculate standard deviation in excel
  • Byval byref vba excel