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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2013, 05:15   #1
quakush
Пользователь
 
Регистрация: 23.08.2013
Сообщений: 13
По умолчанию Выборка данных из Excel

Здравствуйте, хочу из файла Excel выбрать данные из 4х столбцов начиная с 6й строки и поместить их на график. Но возникает ошибка access violation at adress 00000000. В программе пока пробую вывести их в тестовый файл, так что это черновик. Может кто подсказать что не так? Я новичок в программировании и поиск в интернете не дает результатов по OLE программированию, только общие сведения.

Код:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.Buttons, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SpeedButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  f : TextFile;
  Ex, Sheet : Variant;
  FileName : String;
  List : Variant;
  RowPlanSutki, RowFactSutki, RowPlanMes, RowFactMes : integer;
  index : integer;
  VscrSutkiPlan, VscrMesPlan, VscrSutkiFact, VcsrMesFact : array[1..100] of integer;
  procedure ReadFarn;


implementation
  uses Grafik;
{$R *.dfm}

procedure OpenEx(FileName : String);
begin
 Ex := CreateOleObject('Excel.Application');
 Ex.Workbooks.Open(FileName,0,True);
 Ex.Visible := false;
end;

procedure ExitEx;
begin
 Ex.DisplayAlerts := False;
 Ex.Application.Quit;
 Ex := Unassigned;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ExitEx;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 OpenDialog1.Execute();
 FileName := OpenDialog1.FileName;
 OpenEx(FileName);
 List := Ex.Worksheets.Count;
 Sheet:=Ex.WorkSheets.Item[List];


end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  AssignFile(f, 'c:\ex.txt');
  ReWrite(f);
  ReadFarn;
 for index := 6 to RowPlanSutki do begin
     VscrSutkiPlan[index] := Sheet.Cells[index, 2];
  Writeln(f, IntToStr(VscrSutkiPlan[index]));
  Closefile(f);
 end;

end;

procedure ReadFarn;
begin
  RowPlanSutki := 1;
  RowFactSutki := 1;
  RowPlanMes := 1;
  RowFactMes := 1;
  index := 6;
  while VarToStr(Ex.Cells[index, 2]) <> ' ' do
  begin
  VscrSutkiPlan[index] := Ex.Cells[index , 2];
    index := index + 1;
  end;
  RowPlanSutki := index;
end;
end.



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 05.09.2013 в 11:20.
quakush вне форума Ответить с цитированием
Старый 05.09.2013, 11:27   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, на нажатие какой кнопки возникает Access Violation - SpeedButton1 или SpeedButton2 ?

во-вторых, попробуйте поставить точки останова на входе в каждую из процедур и пройдитесь в отладчике пошагово. Так найдёте строчку, вызывающую exception. Дальше уже надо смотреть, что это за строчка и почему в ней возникает исключение.

в-третьих, какое отношение ваш Excel имеет к разделу "БД в Delphi"?! Вы считаете, что раз Вы читаете данные из Excel, то Excel - это СУБД?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2013, 06:34   #3
quakush
Пользователь
 
Регистрация: 23.08.2013
Сообщений: 13
По умолчанию

Открытие документа происходит нормально, а вторая кнопка для вывода данных в график или в файл как сейчас у меня. Ошибка и происходит при нажатии на вторую , в ней же процедура для чтения таблицы Excel. Может как-то по другому должен быть организован доступ. Что-то слышал про вариантные массивы, но информации толком не нашел, те операторы для создания массивов не опознаются компилятором. Может еще какие библиотеки подключать надо. Задача то простая, но с решением что то не складывается.Неужели никто этим не занимался?
quakush вне форума Ответить с цитированием
Старый 06.09.2013, 08:39   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ваш пост непродуктивен.

Цитата:
Ошибка и происходит при нажатии на вторую , в ней же процедура для чтения таблицы Excel.
Отладкой Вы заниматься явно не собираетесь.

Цитата:
Что-то слышал про вариантные массивы, но информации толком не нашел, те операторы для создания массивов не опознаются компилятором
Насчёт "операторов создания массивов" - вообще неясно, о чём Вы.
Да и вряд ли данное исключение в вашей программе связано с тем, что у Вас массивы статические...

Цитата:
Неужели никто этим не занимался?
тут много программистов, кто в своей жизни чем только не занимался... Вы какой ответ на свой вопрос ожидаете? "Да, занимался!" ?! Вам это поможет найти косяк в своём коде? Сама мысль о том, что кто-то занимался чтением данных из Excel ?!!



p.s. мне, например, не нравится вот эта строчка:
Цитата:
Код:
  VscrSutkiPlan[index] := Ex.Cells[index , 2];
попробуйте её закомментировать и выполнить программу...
Ну и ещё раз повторю - идите в отладку, она поможет найти причину вашей проблемы!

p.p.s. если Вы запакуете исходники проекта + ваш Excel файл в архив и выложите его на форум, то у Вас появится надежда, что кто-то другой залезет в отладку и найдёт причину возникновения исключения!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2013, 09:30   #5
quakush
Пользователь
 
Регистрация: 23.08.2013
Сообщений: 13
По умолчанию

Закомментировал все строки VscrSutkiPlan[index] := Ex.Cells[index , 2]; и ничего теперь не происходит, значит вся проблема в способе доступа, про который и хотелось бы узнать. Про отладку я еще пока читаю, но она покажет думаю то же самое.
quakush вне форума Ответить с цитированием
Старый 06.09.2013, 09:52   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Код:
 List := Ex.Worksheets.Count;
 Sheet:=Ex.WorkSheets.Item[List];
ГДЕ в каком месте вы пользуетесь переменной sheet ?
Зачем-то она была вам нужна.

Цитата:
Закомментировал все строки VscrSutkiPlan[index] := Ex.Cells[index , 2]; и ничего теперь не происходит
А теперь скажите чего вы хотели добиться данной строкой.
Перенести данные и указанной ячейки ЛИСТА Еxcel. в свой массив.
И посмотрите откуда вы пытаетесь их взять.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.09.2013, 10:16   #7
quakush
Пользователь
 
Регистрация: 23.08.2013
Сообщений: 13
По умолчанию

Может тогда подскажете как правильно считывать значения в ячейках. Например строчка
Код:
 Ex.WorkSheets.Item[List].Cells[10,1] := 'blabla';
работает замечательно, но когда делаешь цикл
Код:
 for index := 1 to 31 do
begin
VscrSutkiPlan[index] := Ex.WorkSheets.Item[list].Cells[index+6,2];
end;
то ошибка access violation in adress 00456360
quakush вне форума Ответить с цитированием
Старый 09.09.2013, 10:21   #8
quakush
Пользователь
 
Регистрация: 23.08.2013
Сообщений: 13
По умолчанию

Вернее дело даже не в цикле, даже обращение к одной ячейке вызывает ту же ошибку. Не могу понять почему этот механизм не работает в обратную сторону.
quakush вне форума Ответить с цитированием
Старый 09.09.2013, 10:31   #9
quakush
Пользователь
 
Регистрация: 23.08.2013
Сообщений: 13
По умолчанию

Все, разобрался. Такая простая операция, но никто не может дать вразумительного ответа.В учебниках для примера приводят только операции записи в Excel, так что приходится догадываться самому на ошибках. Тема закрыта.
quakush вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка в Excel Влада92 Помощь студентам 0 14.08.2013 18:48
Выборка данных с Excel $T@LKER PHP 9 30.10.2010 00:42
Выборка данных из Excel файла CraZZy RabbIt PHP 5 23.07.2010 03:27
Выгрузка Excel и выборка asale Общие вопросы Delphi 3 03.05.2010 12:11
Выборка из бд в Excel Dania PHP 3 22.12.2009 17:00