Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 48
1

Диаграмма в Excel

09.06.2011, 23:16. Показов 2972. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Есть DBgrid данные в который закачиваються из ADOtable. Мне нужно эти данные перевести в Excel и на основании их создать круговую диагрумму в которой указывалось бы процентное соотношение столбца "Уровень". Вот что есть
Delphi
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
procedure TForm10.Button1Click(Sender: TObject);
const
  vbext_ct_StdModule=1;
var
  S:String;
ExcelApp : variant;
row :integer;
col:integer;
 
begin
dbgrid1.DataSource.DataSet.First;
 
ExcelApp:=CreateOLEObject('Excel.Application'); // создает объект
ExcelApp.WorkBooks.add; //новый док
ExcelApp.visible:=true;  // показывает док
 
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'Отчет за '{+datetostr(now)}; // переименовывание ЛИСТА 1
 
for col :=0 to DBGrid1.Columns.Count-1 do
ExcelApp.WorkBooks[1].WorkSheets[1].cells[6,col+2].value:=dbgrid1.fields[col].displaylabel;
 
for row :=0 to DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
for col :=0 to DBGrid1.Columns.Count-1 do
begin
ExcelApp.WorkBooks[1].WorkSheets[1].cells[row+7,col+2].value:=dbgrid1.DataSource.DataSet.Fields[col].AsString;
ExcelApp.WorkBooks[1].WorkSheets[1].cells[row+7,1]:=row+1;
end;
DBGrid1.DataSource.DataSet.Next;
end;
 
ExcelApp.WorkBooks[1].WorkSheets[1].cells[1,1]:='Отчет создан:';
ExcelApp.WorkBooks[1].WorkSheets[1].cells[1,2]:=datetimetostr(now);
ExcelApp.WorkBooks[1].WorkSheets[1].visible:=true;
ExcelApp.WorkBooks[1].WorkSheets[2].visible:=false;
ExcelApp.WorkBooks[1].WorkSheets[3].visible:=false;ExcelApp.WorkBooks[1].WorkSheets[1].Columns.AutoFit;
end;
У меня удачно все выводиться как показано на скриншоте (http://photomonster.ru/full/68... 6.jpg.html)


но как мне добиться вот такого результата программно в делфи (http://photomonster.ru/full/ba... 8.jpg.html)
вот что я хочю получить

сделал примерный макрос
PureBasic
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
ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Всего ответов"
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=COUNT(R[5]C[10]:R[9]C[10])"
    ActiveCell.Offset(-1, 2).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Первый "
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Второй"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Третий"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Четвертый"
    ActiveCell.Offset(-3, 1).Range("A1").Select
    ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[6]C[7]:R[10]C[7],1)"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[5]C[7]:R[9]C[7],2)"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[4]C[7]:R[8]C[7],3)"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R[3]C[7]:R[7]C[7],4)"
    ActiveCell.Offset(-3, 0).Range("A1:A4").Select
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.SetSourceData Source:=Range("'Отчет за '!$E$1:$E$4")
    ActiveChart.ChartType = xlPieExploded
    ActiveChart.SeriesCollection(1).Select
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveChart.SeriesCollection(1).ApplyDataLabels
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
     ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveSheet.ChartObjects("Диаграмма 1").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
Но как его перевести в DELPHI, все мои попытки безуспешны. Есть у кого какие идеи?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2011, 23:16
Ответы с готовыми решениями:

Диаграмма в Excel
Решила сделать диаграмму в Excel, пока что получилось только ее создать. Возникли проблемы с...

Excel диаграмма из Delphi (лишний ряд)
Диаграмма создается по данным из I2, I3, I4, но в Легенде описывается лишний пустой ряд и...

ER диаграмма
Здравствуйте))) Вы не можете мне помочь разобраться, что за связь будет между сущностями...

Диаграмма
Здравствуйте!!Пожалуйста помогите! Вот задание: Столбчатая диаграмма динамики продаж книги....

4
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
10.06.2011, 01:49 2
Не следует копировать васиковский код в делфи (хотя и можно в принципе) - просто из делфей выполните макрос

ExcelApp.Application.Run('Имя макроса');
1
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 48
10.06.2011, 06:53  [ТС] 3
хорошая идея, но проблема в том что защита Excel не дает выполнить макрос: я создаю макрос в .txt документе в котором находиться код макроса(мне нужно чтобы на разных ПК был этот макрос) вот процедура добавления макроса в Excel
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm10.Button3Click(Sender: TObject);
 
var
  E, B: OleVariant;
  i: OleVariant;
begin
   E := CreateOleObject( 'Excel.Application' );
   B := E.Workbooks.Add;
   E.Visible := true;
   i := E.VBE.ActiveVBProject.VBComponents.Count;
   E.VBE.ActiveVBProject.VBComponents.Add( 1 );
   // Добавляем в модуль книги код на VB
   B.VBProject.VBComponents.Item( i+1 ).CodeModule.AddFromFile( 'C:\ModuleTest.txt' );
   // Добавляем то же самое в код листа
   B.VBProject.VBComponents.Item( 'Лист1' ).CodeModule.AddFromFile( 'C:\ModuleTest.txt' );
Для добавления макроса приходиться каждый раз отключать защиту в Excel(Ставить галочку в Пармаетры-Центр урпавления безопасностью-параметры макросов-"Доверять доступ к объектаной модели VBA"). А для пользователей сами понимаете это не удобно.
Какие еще есть варианты чисто программно в Delphi решить данную ситуацию
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
10.06.2011, 10:14 4
Для таких случаев в Экселе есть шаблоны.

Добавлено через 2 минуты
На всякий случай: варианты "чисто программно в Delphi" для данного случая заведомо хуже, просто поверьте
1
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 48
10.06.2011, 17:56  [ТС] 5
Даа теперь понимаю что Макросы намного удобнее и лучше для реализации. Благодарю за помощь. А работа с шаблонами как выглядит в моем случае??
Вот что я делаю : Создал макрос в документе - сохранил документ как шаблон с поддержкой макросов - и теперь при создании нового документа на основе созданного шаблона у меня все равно защита Excel ругается (Excel отключает макросы и требует пользователя включить их) ! Как мне избавить пользователей от лишних действий, чтобы макрос работал так как будто его и нет.
0
10.06.2011, 17:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2011, 17:56
Помогаю со студенческими работами здесь

Диаграмма в делфи
Помогите пожалуйста сделать диаграмму в делфи, я не имею представления как делать. В аксесе есть...

Функциональная диаграмма
Здравствуйте) Не знал куда написать)Возникли проблемы с курсовой... Помогите пожалуйста помогите...

Диаграмма к БД по данным из Access
в общем создал базу данных, база создана в Access, на форме лежат компоненты...

Нужна IDEF0-диаграмма столовой
Курсач пишу на тему Столовая. Помогите с IDEF0-диаграммой столовой. НУжна IDEF0-диаграмма


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

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