|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Создание диаграммы Excel с помощью Delphi
Привет всем, пишу тестирующую программу скорости набора. Результаты теста я сохраняю в компонент StringGrid. Теперь мне нужно создать диаграмму в Excel'e. К примеру я нажимаю кнопку "экспорт в Excel" и открывается программа Excel с диаграммой внутри. Исходные данные для диаграммы являются поля "скорость(в мин)" и "ср.ритм-ть". Каким образом это можно реализовать, пожалуйста помогите мне с кодом, или же киньте схожий пример. В прикрепленных файлах сам проект. Заранее спасибо!
|
#2
|
||||
|
||||
Два варианта:
1) Сложный. Создаёшь макрос в excel, в котором записано создание диаграммы. Открываешь VB код, и переводишь его на Delphi'йский язык. 2) Простой. Есть компоненты DevExpress VCL. В них есть cxGrid, который САМ умеет обрисовывать диаграммы и импортировать их(и не только их, но и всю информацию из таблицы) в 19 форматов файлов, в том числе xls. |
#3
|
||||
|
||||
Цитата:
Я за здоровый экстрим! Спасибо за "спасибо") |
#4
|
|||
|
|||
В инете нашел пример построения диаграммы, но он у меня почему-то не работает...
Вот код программы: Код:
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. |
#5
|
|||
|
|||
Цитата:
|
#6
|
||||
|
||||
Цитата:
только диаграмма эта будет картинка вариант? я себе так сделал потому что картинки нужны причем в делфях создается 36 диаграмм и вносится в ексел изображения диаграмм на 90метров!) работает шустро Я за здоровый экстрим! Спасибо за "спасибо") |
#7
|
|||
|
|||
Так, что вышеуказаный пример не рабочий чтоли? или это у меня руки не из "того" места растут?
|