Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2015, 07:47   #1
Оля2394
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 30
По умолчанию Delphi БД - Построение графика в excel

Здравствуйте, помогите пожалуйста, программа должна брать данные из xls файла, и на их основе создать график(диаграмму) в Excel'e, все данные записаны в файл, в котором она и должна построить.
Подскажите в чем ошибка, и как её устранить.
Код:
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ComObj, ActiveX, TlHelp32, ShellAPI, Spin,
   OleServer,  ExtCtrls, Buttons;
 
type
  TForm2 = class(TForm)
   
    Button1: TButton;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    { Private declarations }
 
  public
    { Public declarations }
 
  end;
 
var
  Form2: TForm2;
    size:Integer;
     MyPath : string;
 
implementation
 
uses Unit1, Udm;
var
  EIN, SheetIn, myChart, Source : variant;
 
{$R *.DFM}
 
const MaxN = 11;
  AP : array[1..MaxN] of string[3] = ();
 
function GetProccesByEXE(exename: string): THandle;
var
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin
Result:=0;
hSnapshoot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot = 0) then Exit;
pe32.dwSize:= Sizeof(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
  if (pe32.szExeFile = exename) then
  begin
  Result:=pe32.th32ProcessID;
  exit;
  end;
  until not Process32Next(hSnapshoot, pe32);
end;
 
function ExistExcel:Boolean;
var
ID: TCLSID;
Res: HRESULT;
begin
 Res:=CLSIDFromProgID('Excel.Application', ID);
 if Res=S_OK then
 Result:=true
 else Result:=False;
end;
 
function RunExcel: Boolean;
begin
if GetProccesByEXE('EXCEL.EXE')<>0 then
begin
Ein:=GetActiveOleObject('Excel.Application');
Result:=true;
end
else
Result:=false;
end;
 
function StartExcel: Boolean;
begin
if ExistExcel then
Begin
if RunExcel=false then
Ein:=CreateOleObject('Excel.Application');
Result:=True;
end
else
begin
ShowMessage('Ms Excel No');
Result:=False;
end;
end;
 
procedure Excel_Open;
begin
  Ein:=CreateOleObject('Excel.Application');
  Ein.Visible:=true; //false;
        Ein.Workbooks.Open('C::');
  {Fxls:=MyPath+'Diag'+IntToStr(QID)+'.xls';
  Ein.WorkBooks.add(Fxls);   }
  SheetIn:=Ein.ActiveWorkBook.ActiveSheet;
end;
 
Function SetValueRange(Sheet:variant; Range:string; value_:variant):boolean;
begin
  SetValueRange:=true;
  try
    EIN.ActiveWorkbook.Sheets.Item[sheet].Range[range]:=value_;
  except
    SetValueRange:=false;
  end;
End;
  
procedure TForm2.FormCreate(Sender: TObject);
begin
  MyPath:=ExtractFilePath(Application.ExeName);
end;
 
 
 
procedure TForm2.Button3Click(Sender: TObject);
var
  i,Cnt : integer;
  UpCh : char;
  NN : array[1..MaxN] of integer;
begin
    for i:=1 to MaxN do
      if Fields[i-1].IsNull
        then NN[i]:=0
        else NN[i]:=Fields[i-1].AsInteger;
    Close;
  
  Excel_Open;
 
  SheetIn.ChartObjects[1].Activate;
 
//  стирание старых значений
  for i:=0 to MaxN-1 do begin
    SheetIn.Cells[2,i+1]:='';
    SheetIn.Cells[3,i+1]:='';
 
  end;
 
  Cnt:=0;
  for i:=1 to MaxN do begin
    if NN[i]>0 then begin
      Inc(Cnt);
      SetValueRange('Лист1',Chr(ord('A')+Cnt-1)+'2',AP[i]);
      SetValueRange('Лист1',Chr(ord('A')+Cnt-1)+'3',NN[i]);
    end;
  end;
 
  UpCh:=Chr(ord('A')+Cnt-1); //+'2'
  myChart:=EIN.ActiveChart;
  myChart.SetSourceData(Source:=EIN.ActiveWorkbook.Sheets.Item['Лист1'].Range['A2:'+UpCh+'3'],PlotBy:=1);
end;
end.
Как я поняла, ошибка(Argument out of range) в этом фрагменте, помогите пожалуйста

Код:
procedure TForm2.Button3Click(Sender: TObject);
var
  i,Cnt : integer;
  UpCh : char;
  NN : array[1..MaxN] of integer;
begin
    for i:=1 to MaxN do
      if Fields[i-1].IsNull
        then NN[i]:=0
        else NN[i]:=Fields[i-1].AsInteger;
    Close;

Последний раз редактировалось Оля2394; 22.02.2015 в 17:44.
Оля2394 вне форума Ответить с цитированием
Старый 22.02.2015, 08:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
брать данные из xls файла, и на их основе создать график(диаграмму) в Excel'e
Жуть какая... А зачем это делать через стороннюю программу, коль в самом же экзеле и строится диаграмма?

Fields как описано? Что это вообще за массив?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2015, 08:42   #3
Оля2394
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 30
По умолчанию

Цитата:
А зачем это делать через стороннюю программу, коль в самом же экзеле и строится диаграмма?
Дали такое задание
Цитата:
Fields как описано? Что это вообще за массив?
Что за массив не знаю. Дали этот код, что-бы разобралась в нём. Без этого цикла программа работает, но стирает все значения неважно 0 там или нет.
Код:
 for i:=1 to MaxN do
      if Fields[i-1].IsNull
        then NN[i]:=0
        else NN[i]:=Fields[i-1].AsInteger;
    Close;
Можно ли как-то обойти этот Fields?

Последний раз редактировалось Оля2394; 22.02.2015 в 08:46.
Оля2394 вне форума Ответить с цитированием
Старый 22.02.2015, 09:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что за массив не знаю.
Тогда забудь о решении с использованием именно этого кода.
Вообще конечно если догадываться то можно написать проверку:
Код:
  if Fields.Count>i then begin
      if Fields[i-1].IsNull
        then NN[i]:=0
        else NN[i]:=Fields[i-1].AsInteger;
  end;
однако даю 80% что это не поможет, потому что сам код писался явно наобум. Просто взяли налепили в программу несовместимые куски и решили что все будет работать идеально.
Твоя задача... А как кстати она звучит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2015, 09:54   #5
Оля2394
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 30
По умолчанию

Цитата:
А как кстати она звучит?
Разработка программы на delphi для построения графика в excel

Последний раз редактировалось Оля2394; 22.02.2015 в 17:43.
Оля2394 вне форума Ответить с цитированием
Старый 22.02.2015, 10:18   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Выборки из чего? Из базы?
Смотри, тебе предлагают следующее: Выполнить запрос к некой базе, к примеру в Access, и в цикле перенести данные из нее в ячейки Экзела. По факту если брать твой код то выглядеть это может так:
Код:
procedure TForm2.Button3Click(Sender: TObject);
var j,i:integer;
begin
with НекоеQUERYКотороеТыНеПоказала do begin
  Excel_Open;
  SheetIn.ChartObjects[1].Activate;
  first;
    while not eof do begin
      for i:=0 to Fields.Count-1 do begin
      if Fields[i].IsNull
        then EIN.ActiveWorkbook.Sheets.Item[sheet].cell[j,i]:=0;
        else EIN.ActiveWorkbook.Sheets.Item[sheet].cell[j,i]:=Fields[i].AsInteger;
     end;
     inc(j); Next;
   end;
  close;
end 
  UpCh:=Chr(ord('A')+Cnt-1); //+'2'
  myChart:=EIN.ActiveChart;
  myChart.SetSourceData(Source:=EIN.ActiveWorkbook.Sheets.Item['Лист1'].Range['A2:'+UpCh+'3'],PlotBy:=1);
end;
Однако тебе все равно придется разбираться что это все означает. В смысле какой оператор и функция что делает, иначе график, настроенный на определенные ячейки просто не построится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2015, 11:43   #7
Оля2394
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 30
По умолчанию

Цитата:
Выборки из чего? Из базы?
сами данные у меня, как раз находятся xls файле

Последний раз редактировалось Оля2394; 22.02.2015 в 17:42.
Оля2394 вне форума Ответить с цитированием
Старый 22.02.2015, 15:09   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сами данные у меня, как раз находятся xls файле
Тогда тем более задание глупое. Выбирать данные их XLS, чтоб потом в XLS построить график? Препод явно намекает "Баблом или телом", есть такой контингент, требующий альтернативной сдачи курсачей. Задание либо совсем тупое, либо специально дали такое чтоб запудрить тебе мозги.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графика в Delphi вася радугов Помощь студентам 16 21.05.2014 02:38
Построение графика Delphi azhigalieva Помощь студентам 2 12.12.2013 22:35
Построение графика в Delphi! Richik123 Помощь студентам 4 12.12.2012 21:51
построение графика в excel AlenaCh Помощь студентам 0 14.03.2011 17:48
Построение необычного графика в Excel. Tidus Microsoft Office Excel 5 18.02.2010 12:42