С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
1

Сервер автоматизации Excel

02.05.2014, 10:09. Показов 2446. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!!!
такая проблема.
запускаю из Builder Excel, запускает все нормально (настраивается лист и т.п.) из Access средствами Builder выгружаю данные в Excel
например: fam, nam, otch, настроил так чтобы при выборе конкретных полей выводились данные в соответствующий столбец
Сервер автоматизации Excel


Как удалить столбцы, которые пустые?
Помогите пжл
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2014, 10:09
Ответы с готовыми решениями:

Сервер автоматизации Excel и TextBox1
Не могу разобраться как обратиться к графическому объекту, созданного на листе Excel с именем...

Как работает сервер автоматизации Excel?
Доброго всем времени суток!!! Может, конечно, я немного неправильно выразилась при указании...

Как работает сервер автоматизации Excel?
Доброго всем времени суток!!! Я этот вопрос задавала в форуме по Windows, и там мне посоветовали...

Сервер автоматизации Word
Доброго времени суток! Мне необходима помощь. Задание заключается в том, что мне нужно вывести...

20
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
02.05.2014, 10:30  [ТС] 2
Мне посоветовали не удалять столбцы, а при выводе проверять активность CheckBox и делать смещение на единицу. Как то так, но все равно не могу догнать
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
02.05.2014, 17:38 3
что-ж тут непонятного? проверяешь чекбокс, если false - не выводишь
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
03.05.2014, 09:00  [ТС] 4
посмотрите проект
Новая папка.rar
я проверял на активность CheckBox, но все равно не выходит
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
03.05.2014, 09:02  [ТС] 5
Цитата Сообщение от _Dimon_ Посмотреть сообщение
если false - не выводишь
у меня есть проверка, но мне данные в разноброс выводятся
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
04.02.2015, 18:50  [ТС] 6
Всем доброго времени суток)))
Всплыло старое задание, которое я пытался сделать, но ни чего не получилось..))))
Перед тем как писать, просмотрел "кучу" форумов, но так ни чего и не нашел.
_Dimon_, предложил проверять CheckBox.....

Расскажу принцип работы, как происходит выгрузка.
На форме есть 3 чека:
Название: ыва.JPG
Просмотров: 70

Размер: 10.7 Кб

Если выбрать все активировать, то выгрузка выйдет следующим способом:
Сервер автоматизации Excel


Вот код:
C++
1
2
3
4
5
6
7
8
9
10
.h
private:    // User declarations
Variant  vVarApp,  //приложение
         vVarBooks, //набор книг
         vVarBook, // книга
         vVarSheets,//набор страниц
         vVarSheet, //страница
         vVarCells,//ячейки
         vVarCell; //ячейка
bool     fStart; // служит индикатором того, что сервер запущен
C++
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
.cpp
//создание объекта Excel.Application
    if(!fStart)
    {
        try
        {
            vVarApp=CreateOleObject("Excel.Application");
            fStart=true;
        }
        catch(...)
        {
            MessageBox(0, "Ошибка при открытии сервера Excel", "Ошибка", MB_OK);
            return;
        }
    }
    //установка свойства
    vVarApp.OlePropertySet("Visible",true);
 
    //Переменной vVarBooks присваивается значение Workbooks - свойство
    //объекта Excel.Application, содержащее набор рабочих книг Excel.
    vVarBooks=vVarApp.OlePropertyGet("Workbooks");
 
    //SheetsInNewWorkbook задает количество листов в создаваемой книге,
    //пусть в первой книге их будет 1 страница (лист)
    vVarApp.OlePropertySet("SheetsInNewWorkbook",1);
 
    //Добавляем книгу из 1 листов в объект vVarBooks.
    vVarBooks.OleProcedure("Add");
 
    //Переменная vVarBook содержит ссылку на текущую книгу.
    //(Пусть текущая книга будет первая).
    vVarBook=vVarBooks.OlePropertyGet("Item",1);
 
    //Переменной vVarSheets присваиваем значение
    //Worksheets - свойство объекта Excel.Application,
    //содержащее набор страниц книги Excel.
    vVarSheets=vVarBook.OlePropertyGet("Worksheets");
 
     //берем первый лист
     vVarSheet=vVarSheets.OlePropertyGet("Item",1);
     //задаем новое имя листу
     vVarSheet.OlePropertySet("Name","Cотрудники");
 
            AnsiString fields;
    if (CheckBox1->Checked)
        fields+="fam,";
    if (CheckBox2->Checked)
        fields+="nam,";
    if (CheckBox3->Checked)
        fields+="otch,";
 
    if (fields.Length())
    {
        fields.Delete(fields.Length(),1); //для того чтобы удалить последнюю запятую
        ADOQuery2->SQL->Clear();
        ADOQuery2->SQL->Text="SELECT "+fields+" FROM tab";
        ADOQuery2->Open();
 
                    vVarCell=vVarSheet.OlePropertyGet("Range","A4");
            vVarCell.OleProcedure("Merge");
            vVarCell.OlePropertySet("RowHeight", 15);
            vVarCell.OlePropertySet("ColumnWidth",15);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",true);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Size",12);
            vVarCell.OlePropertySet("HorizontalAlignment",-4108);
            vVarCell.OlePropertySet("VerticalAlignment",-4108);
            vVarCell.OlePropertySet("Value","Фамилия");
            vVarCell.OlePropertyGet("Font").OlePropertySet("Color",clBlack);
 
            //Считываем. Встаем на 1 запись
            Form1->ADOQuery2->First();
            //считывание
            int fam=5;//ячейка
            AnsiString s1;
            s1="A"+IntToStr(fam);
            //пока не конец
            while(!ADOQuery2->Eof)
                {
                    //встаем на указанную ячейку
                    vVarCell=vVarSheet.OlePropertyGet("Range",s1.c_str());
                    //объединяем
                    vVarCell.OleProcedure("Merge");
                    //устанавливаем значение данных
                    vVarCell.OlePropertySet("Value",ADOQuery2->FieldByName("fam")->AsString.c_str());
                    //переходим к след/записи
                    Form1->ADOQuery2->Next();
                    fam++;
                    s1="A"+IntToStr(fam);
                }
            //****************
            vVarCell=vVarSheet.OlePropertyGet("Range","B4");
            vVarCell.OleProcedure("Merge");
            vVarCell.OlePropertySet("RowHeight", 15);
            vVarCell.OlePropertySet("ColumnWidth",15);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",true);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Size",12);
            vVarCell.OlePropertySet("HorizontalAlignment",-4108);
            vVarCell.OlePropertySet("VerticalAlignment",-4108);
            vVarCell.OlePropertySet("Value","Имя");
            vVarCell.OlePropertyGet("Font").OlePropertySet("Color",clBlack);
 
            //Считываем. Встаем на 1 запись
            Form1->ADOQuery2->First();
            //считывание
            int nam=5;//ячейка
            AnsiString s11;
            s11="B"+IntToStr(nam);
            //пока не конец
            while(!ADOQuery2->Eof)
                {
                    //встаем на указанную ячейку
                    vVarCell=vVarSheet.OlePropertyGet("Range",s11.c_str());
                    //объединяем
                    vVarCell.OleProcedure("Merge");
                    //устанавливаем значение данных
                    vVarCell.OlePropertySet("Value",ADOQuery2->FieldByName("nam")->AsString.c_str());
                    //переходим к след/записи
                    Form1->ADOQuery2->Next();
                    nam++;
                    s11="B"+IntToStr(nam);
                }
            //*********
            vVarCell=vVarSheet.OlePropertyGet("Range","C4");
            vVarCell.OleProcedure("Merge");
            vVarCell.OlePropertySet("RowHeight", 15);
            vVarCell.OlePropertySet("ColumnWidth",15);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",true);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Size",12);
            vVarCell.OlePropertySet("HorizontalAlignment",-4108);
            vVarCell.OlePropertySet("VerticalAlignment",-4108);
            vVarCell.OlePropertySet("Value","Отчество");
            vVarCell.OlePropertyGet("Font").OlePropertySet("Color",clBlack);
 
            //Считываем. Встаем на 1 запись
            Form1->ADOQuery2->First();
            //считывание
            int otch=5;//ячейка
            AnsiString s111;
            s111="C"+IntToStr(otch);
            //пока не конец
            while(!ADOQuery2->Eof)
                {
                    //встаем на указанную ячейку
                    vVarCell=vVarSheet.OlePropertyGet("Range",s111.c_str());
                    //объединяем
                    vVarCell.OleProcedure("Merge");
                    //устанавливаем значение данных
                    vVarCell.OlePropertySet("Value",ADOQuery2->FieldByName("otch")->AsString.c_str());
                    //переходим к след/записи
                    Form1->ADOQuery2->Next();
                    otch++;
                    s111="C"+IntToStr(otch);
                }
           }
Как сделать, чтобы если я выбрал 1 и 3 ЧекБокс, то и в Excel отобразился только 1 и 3 столбец?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32996 / 21302 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
04.02.2015, 19:14 7
C++
1
vVarSheet.OlePropertyGet("Columns", "A").OlePropertySet("ColumnWidth", (CheckBox1->Checked ? 15 : 0));
и аналогично для второго и третьего чекбокса не устроит?
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
04.02.2015, 19:24  [ТС] 8
У меня в примере показано 3 CheckBox'a, Вы можете написать хотя бы для одного (максимум двух) как это будет выглядеть. Сижу уже 3 день на этим. Боюсь уже делать шаг влево, шаг вправо).

Знаю что много прошу от Вас.

Help me))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32996 / 21302 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
04.02.2015, 19:26 9
Ну я же написал для одного, что, трудно скопировать эту строку 3 раза и поменять 2 символа?
C++
1
2
3
vVarSheet.OlePropertyGet("Columns", "A").OlePropertySet("ColumnWidth", (CheckBox1->Checked ? 15 : 0));
vVarSheet.OlePropertyGet("Columns", "B").OlePropertySet("ColumnWidth", (CheckBox2->Checked ? 15 : 0));
vVarSheet.OlePropertyGet("Columns", "C").OlePropertySet("ColumnWidth", (CheckBox3->Checked ? 15 : 0));
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
04.02.2015, 19:30  [ТС] 10
Задам вопрос по другому... Куда нужно вставить эти строки?)))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32996 / 21302 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
04.02.2015, 19:32 11
В программу. Конкретнее - в любое место после окончания всех циклов, заполняющих лист Excel.

Не по теме:

Можно подумать, ты показал, куда вставляешь ту простыню кода, которая приведена в посте №6, и которую запросто можно сократить минимум в три раза...

0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
04.02.2015, 19:34 12
volvo, если мне не изменяет память, то наверно должно быть так?
C++
1
vVarSheet.OlePropertyGet("Columns", "A").OlePropertySet("ColumnWidth", (CheckBox1->Checked ? 15 : 0));
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32996 / 21302 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
04.02.2015, 19:36 13
Цитата Сообщение от Sasha Посмотреть сообщение
наверно должно быть так?
Нет. Срочно читай про синтаксис тернарного оператора. Ты поменял местами вопрос и двоеточие...
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
04.02.2015, 19:38 14
Я уже исправил

Добавлено через 22 секунды
Там изначально просто у тебя вообще 2 раза стояло двоеточие
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
04.02.2015, 19:41  [ТС] 15
Ошибка вывода данных

C++
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
//создание объекта Excel.Application
    if(!fStart)
    {
        try
        {
            vVarApp=CreateOleObject("Excel.Application");
            fStart=true;
        }
        catch(...)
        {
            MessageBox(0, "Ошибка при открытии сервера Excel", "Ошибка", MB_OK);
            return;
        }
    }
    //установка свойства
    vVarApp.OlePropertySet("Visible",true);
 
    //Переменной vVarBooks присваивается значение Workbooks - свойство
    //объекта Excel.Application, содержащее набор рабочих книг Excel.
    vVarBooks=vVarApp.OlePropertyGet("Workbooks");
 
    //SheetsInNewWorkbook задает количество листов в создаваемой книге,
    //пусть в первой книге их будет 1 страница (лист)
    vVarApp.OlePropertySet("SheetsInNewWorkbook",1);
 
    //Добавляем книгу из 1 листов в объект vVarBooks.
    vVarBooks.OleProcedure("Add");
 
    //Переменная vVarBook содержит ссылку на текущую книгу.
    //(Пусть текущая книга будет первая).
    vVarBook=vVarBooks.OlePropertyGet("Item",1);
 
    //Переменной vVarSheets присваиваем значение
    //Worksheets - свойство объекта Excel.Application,
    //содержащее набор страниц книги Excel.
    vVarSheets=vVarBook.OlePropertyGet("Worksheets");
 
     //берем первый лист
     vVarSheet=vVarSheets.OlePropertyGet("Item",1);
     //задаем новое имя листу
     vVarSheet.OlePropertySet("Name","Cотрудники");
 
            AnsiString fields;
    if (CheckBox1->Checked)
        fields+="fam,";
    if (CheckBox2->Checked)
        fields+="nam,";
 
    if (fields.Length())
    {
        fields.Delete(fields.Length(),1); //для того чтобы удалить последнюю запятую
        ADOQuery2->SQL->Clear();
        ADOQuery2->SQL->Text="SELECT "+fields+" FROM tab";
        ADOQuery2->Open();
 
                    vVarCell=vVarSheet.OlePropertyGet("Range","A4");
            vVarCell.OleProcedure("Merge");
            vVarCell.OlePropertySet("RowHeight", 15);
            vVarCell.OlePropertySet("ColumnWidth",15);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",true);
            vVarCell.OlePropertyGet("Font").OlePropertySet("Size",12);
            vVarCell.OlePropertySet("HorizontalAlignment",-4108);
            vVarCell.OlePropertySet("VerticalAlignment",-4108);
            vVarCell.OlePropertySet("Value","Фамилия");
            vVarCell.OlePropertyGet("Font").OlePropertySet("Color",clBlack);
 
            //Считываем. Встаем на 1 запись
            Form1->ADOQuery2->First();
            //считывание
            int fam=5;//ячейка
            AnsiString s1;
            s1="A"+IntToStr(fam);
            //пока не конец
            while(!ADOQuery2->Eof)
                {
                    //встаем на указанную ячейку
                    vVarCell=vVarSheet.OlePropertyGet("Range",s1.c_str());
                    //объединяем
                    vVarCell.OleProcedure("Merge");
                    //устанавливаем значение данных
                    vVarCell.OlePropertySet("Value",ADOQuery2->FieldByName("fam")->AsString.c_str());  [COLOR="Red"]Пишет ошибку. если при отборе выбрано только "Отчество"[/COLOR]
                    //переходим к след/записи
                    Form1->ADOQuery2->Next();
                    fam++;
                    s1="A"+IntToStr(fam);
                }
                        vVarSheet.OlePropertyGet("Columns", "A").OlePropertySet("ColumnWidth", (CheckBox1->Checked ? 15 : 0));
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32996 / 21302 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
04.02.2015, 19:42 16
Цитата Сообщение от Sasha Посмотреть сообщение
Там изначально просто у тебя вообще 2 раза стояло двоеточие
Изначально мне вообще код теперь не на чем проверять, всю Windows выпилили, а под *nix-ами Билдер вообще не запускается. Так что теперь всё - только теоретически, без проверки...
0
479 / 392 / 112
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
05.02.2015, 10:26 17
Загляни сюда Экспорт из DBGrid в Excel Если не , то должен разобраться
0
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
05.02.2015, 11:47  [ТС] 18
Bit_Man, все что там есть у меня описано другим способом)))
Я говорю как сделать так, чтобы в Excel выводились те данные, которые я выбрал CheckBox'ами?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32996 / 21302 / 8180
Регистрация: 22.10.2011
Сообщений: 36,595
Записей в блоге: 8
05.02.2015, 12:09 19
Цитата Сообщение от Within_t Посмотреть сообщение
Ошибка вывода данных
Это твои проблемы.

Вот специально пошел и проверил. Если все данные выведены на лист нормально твоим предыдущим кодом (из 6-го сообщения), то добавление трех строк:
C++
1
2
3
vVarSheet.OlePropertyGet("Columns", WideString("A")).OlePropertySet("ColumnWidth", (CheckBox1->Checked ? 15 : 0));
vVarSheet.OlePropertyGet("Columns", WideString("B")).OlePropertySet("ColumnWidth", (CheckBox2->Checked ? 15 : 0));
vVarSheet.OlePropertyGet("Columns", WideString("C")).OlePropertySet("ColumnWidth", (CheckBox3->Checked ? 15 : 0));
после тамошней строки №153 (перед скобкой, закрывающей условие if (fields.Length())) прекрасно скрывает не_выбранные чекбоксами столбцы. Так что сказки рассказывать не нужно.

От темы отписываюсь. Очень похоже на обычный троллинг. Толсто и неинтересно...
1
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
05.02.2015, 13:50  [ТС] 20
Цитата Сообщение от volvo Посмотреть сообщение
Очень похоже на обычный троллинг. Толсто и неинтересно...
я ни кого не троллил, это не в моих интересах)))
0
05.02.2015, 13:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2015, 13:50
Помогаю со студенческими работами здесь

Сервер автоматизации Word. Таблица, Ячейки
Не подскажите ли как на сервере Word сделать такие вещи. Есть таблица. 1. Объединить ("смержить")...

Сервер автоматизации из 32-битного приложения в 64-битной винде
Приветствую. Винда х64. Есть приложение Р1, тоже х64. Есть мое приложение Р2 х32, разрабатываю в...

Программа для автоматизации Excel
Добрый день! Предлагаю всем желающим скачать и опробовать мою программу, которая предназначена для...

Excel, как связанный сервер
Приветсвую всех. У меня на ПК стоит express 2008R2 авторизация windows-кая. ОС запущена под...

OLE-сервер Excel в XE7
Пишу проект в C++ Builder XE7 . В конце решил сделать отчет через Excel. Начал изучать как это...

Переделать DDE сервер из Excel
Народ, я в этой теме ни в зуб ногой. Подскажите, какие параметры и где прописать. Или мож у кого...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru