Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.03.2013, 12:12
niko93 niko93 вне форума
Прохожий
 
Регистрация: 29.03.2013
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Создание диаграммы Excel с помощью Delphi

Привет всем, пишу тестирующую программу скорости набора. Результаты теста я сохраняю в компонент StringGrid. Теперь мне нужно создать диаграмму в Excel'e. К примеру я нажимаю кнопку "экспорт в Excel" и открывается программа Excel с диаграммой внутри. Исходные данные для диаграммы являются поля "скорость(в мин)" и "ср.ритм-ть". Каким образом это можно реализовать, пожалуйста помогите мне с кодом, или же киньте схожий пример. В прикрепленных файлах сам проект. Заранее спасибо!
Вложения
Тип файла: rar Project.rar (277.2 Кбайт, 11 просмотров)
Ответить с цитированием
  #2  
Старый 29.03.2013, 12:28
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Два варианта:
1) Сложный. Создаёшь макрос в excel, в котором записано создание диаграммы. Открываешь VB код, и переводишь его на Delphi'йский язык.

2) Простой. Есть компоненты DevExpress VCL. В них есть cxGrid, который САМ умеет обрисовывать диаграммы и импортировать их(и не только их, но и всю информацию из таблицы) в 19 форматов файлов, в том числе xls.
Ответить с цитированием
  #3  
Старый 29.03.2013, 12:46
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от niko93
Привет всем, пишу тестирующую программу скорости набора. Результаты теста я сохраняю в компонент StringGrid. Теперь мне нужно создать диаграмму в Excel'e. К примеру я нажимаю кнопку "экспорт в Excel" и открывается программа Excel с диаграммой внутри. Исходные данные для диаграммы являются поля "скорость(в мин)" и "ср.ритм-ть". Каким образом это можно реализовать, пожалуйста помогите мне с кодом, или же киньте схожий пример. В прикрепленных файлах сам проект. Заранее спасибо!
создать в chart в delphi и потом как картинку в excel сунуть, не?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #4  
Старый 29.03.2013, 16:36
niko93 niko93 вне форума
Прохожий
 
Регистрация: 29.03.2013
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

В инете нашел пример построения диаграммы, но он у меня почему-то не работает...
Вот код программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  StdCtrls, ExtCtrls, IniFiles,  Dialogs, Buttons, ComCtrls, Gauges, jpeg, Clipbrd,
  pngimage,Math, Grids,ComObj;


type
  TForm1 = class(TForm)
    statisticsbody: TRichEdit;
    statisticsrc: TRichEdit;
    btn1: TButton;
    StringGrid1: TStringGrid;
    btn2: TButton;
    Button2: TButton;
function onlynumbers(str:string):string;

    procedure zgrstat;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure WriteTable(FirstCol, FirstRow:integer; Grid: TStringGrid);
    procedure AddLineChartFromTable(X, Y, Height, Width, Format: integer; Title, XLabel,YLabel: string; DataGrid: TStringGrid; DataPosition: byte; ChartType:integer);
    procedure Button2Click(Sender: TObject);

  private
    { Private declarations }
  CurCol, CurRow: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MyExcel:Variant;

implementation

{$R *.dfm}
uses ExcelXP;

procedure TForm1.zgrstat;
var
hg, al: string;
Text: TIniFile; i:Integer;
begin

Text:= TIniFile.Create(PChar(extractFileDir(ParamSTR(0))
+ '\folder\kv_LastUser.sav'));
try
al:= text.ReadString('user', 'uptime', '');
hg:= #13 + '        Информация о проделанной работе:' +  #13 +
#13 + '   Общая продолжительность обучения:  ' + al + #13 +
#13 +
'      Детализированный отчет выполненных '+#13+
'                  упражнений:';
statisticsbody.Clear;
statisticsbody.Lines.LoadFromFile(extractFileDir(ParamSTR(0))
+ '\folder\kv_LastStat.sav');
statisticsrc.Clear;
statisticsrc.Lines.Add(hg);
statisticsrc.Lines.Text:= hg;
statisticsrc.Lines.AddStrings(statisticsbody.Lines);

finally
Text.Free;
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
zgrstat;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='Задание № ';
StringGrid1.Cells[1,0]:='Дата/время ';
StringGrid1.Cells[2,0]:='Оценка ';
StringGrid1.Cells[3,0]:='Допущено ошибок ';
StringGrid1.Cells[4,0]:='Попыток ';
StringGrid1.Cells[5,0]:='Скорость(в мин) ';
StringGrid1.Cells[6,0]:='Текущая ритм-ть ';
StringGrid1.Cells[7,0]:='Средняя ритм-ть ';
StringGrid1.Cells[8,0]:='Скорость(в сек) ';
StringGrid1.Cells[9,0]:='Затрачено времени ';
StringGrid1.DoubleBuffered:=true;

end;

function TForm1.onlynumbers(str:string):string;//получает строку
                                         //возвращает только цифры из строки
var buf:string;
    i:integer;
begin
buf:='';
for i:=1 to length(str) do//перебираем все символы строки
  if (str[i] in ['0'..'9']) or (str[i] in ['%']) then buf:=buf+str[i];//если очередной символ - цифра
                                               //то приписываем  его к итоговой строке
Result:=buf;
end;

procedure TForm1.btn2Click(Sender: TObject);
var i,j,start:Integer;
begin
for i:=0 to 6 do statisticsrc.Lines.Delete(0);  //срезали шапку
start:=3;
for i:=1 to (statisticsrc.Lines.Count div 12) do //для каждого блока теста
  begin
  StringGrid1.Cells[0,i]:=onlynumbers(statisticsrc.Lines.Strings[start-2]); //получаем № теста
  for j:=0 to 8 do
  StringGrid1.Cells[j+1,i]:=onlynumbers(statisticsrc.Lines.Strings[start+j]);
  start:=start+12;  //переходим к следующему блоку
  end;
StringGrid1.RowCount:=(statisticsrc.Lines.Count div 12)+1;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

begin
With StringGrid1, Canvas do
    if (ARow>0) then
       if (CurCol=ARow) or (CurRow=Arow) then
       begin
       StringGrid1.Canvas.Brush.Color := clBlack;
       StringGrid1.Canvas.Font.Color := clWhite;
       StringGrid1.canvas.fillRect(Rect); //Закрашиваем бэкграунд
       StringGrid1.canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]); //Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т.д..
       end;
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StringGrid1.MouseToCell(x, y, CurRow, CurRow);
  StringGrid1.Repaint;
end;

procedure TForm1.WriteTable(FirstCol, FirstRow:integer; Grid: TStringGrid);
var col,row:integer;
begin
try
for col := 0 to Grid.ColCount - 1 do
for row := 0 to Grid.RowCount - 1 do
MyExcel.ActiveWorkBook.ActiveSheet.Cells[FirstRow+row, FirstCol+col]:=Grid.Cells[col, row];
except
raise Exception.Create('Запись таблицы завершилась ошибкой')
end;
end;

procedure TForm1.AddLineChartFromTable(X, Y, Height, Width, Format: integer; Title, XLabel,YLabel: string; DataGrid: TStringGrid; DataPosition: byte; ChartType:integer);
var Chart: OLEVariant;
DataRange: OLEVariant;
begin
//Вставляем данные из таблицы
WriteTable(1, 2, StringGrid1);
//выбираем данные для дигаграммы
DataRange:=MyExcel.ActiveWorkBook.ActiveSheet.UsedRange;
//добавляем новыю диаграмму на активный лист
MyExcel.ActiveWorkBook.ActiveSheet.ChartObjects.Add(x,y,width,height);
//выбираем последнюю добавленную диаграмму
Chart:=MyExcel.ActiveWorkBook.ActiveSheet.ChartObjects[MyExcel.ActiveWorkBook.ActiveSheet.ChartObjects.Count];
Chart.Chart.ChartWizard(Source:=DataRange,
Gallery:=xlLine,
Format:=Format,
PlotBy:=DataPosition,
CategoryLabels:=1,
SeriesLabels:=1,
HasLegend:=true,
Title:=Title,
CategoryTitle:=XLabel,
ValueTitle:=YLabel);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
AddLineChartFromTable(200, 200, 300, 300, 5,EmptyParam, EmptyParam,EmptyParam, StringGrid1, EmptyParam, EmptyParam);
end;

end.
При компиляции Delphi ругается на 183 строчку, подскажите плиз, где я допустил ошибку, или что я не правильно делаю...
Ответить с цитированием
  #5  
Старый 29.03.2013, 17:42
niko93 niko93 вне форума
Прохожий
 
Регистрация: 29.03.2013
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Mrak
создать в chart в delphi и потом как картинку в excel сунуть, не?
нет, нужно сделать так, чтобы в самом Excel'e создавалась диаграмма,и по нажатию кнопки должна открыться программа Excel с диаграммой внутри, вот как-то так...
Ответить с цитированием
  #6  
Старый 29.03.2013, 17:56
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от niko93
нет, нужно сделать так, чтобы в самом Excel'e создавалась диаграмма,и по нажатию кнопки должна открыться программа Excel с диаграммой внутри, вот как-то так...
ну, откроется программа excel c диаграммой внутри
только диаграмма эта будет картинка
вариант?
я себе так сделал потому что картинки нужны
причем в делфях создается 36 диаграмм и вносится в ексел
изображения диаграмм на 90метров!) работает шустро
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #7  
Старый 29.03.2013, 18:43
niko93 niko93 вне форума
Прохожий
 
Регистрация: 29.03.2013
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Так, что вышеуказаный пример не рабочий чтоли? или это у меня руки не из "того" места растут?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter