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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2012, 00:02   #1
2UnLiMiTeDD
 
Регистрация: 02.12.2010
Сообщений: 7
По умолчанию Delphi+Excel

Пишу прогу которая должна сохранять некие данные в excel на разных листах, но постоянно выдает одну и ту же ошибку:
Изображения
Тип файла: jpg Без имени-1.jpg (35.4 Кб, 52 просмотров)
2UnLiMiTeDD вне форума Ответить с цитированием
Старый 19.03.2012, 00:03   #2
2UnLiMiTeDD
 
Регистрация: 02.12.2010
Сообщений: 7
По умолчанию

Вот мой код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, Calendar, StdCtrls, Menus, XPMan, ComObj;

const n=10;

type
  baza0=record
    prod: string;
    cena: Currency;
    ves: Currency;
   end;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    Edit1: TEdit;
    Edit2: TEdit;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Label3: TLabel;
    Edit3: TEdit;
    Label5: TLabel;
    Edit4: TEdit;
    Button2: TButton;
    Memo1: TMemo;
    Edit5: TEdit;
    Label4: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  baza1: array[0..n-1] of single;
  baza: array[0..n-1] of baza0;
  i,j,z,x:byte;
  F:text;
  s:string;
  MsExcel: Variant;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
MsExcel := CreateOleObject('Excel.Application');
MsExcel.Workbooks.open('C:\Users\àíòîí\Desktop\ïàñõà\Zakazi1');
//MsExcel.DisplayAlerts:=False;
Assignfile(F,'baza.txt');
Reset(F);
For i:=0 to n-1 do
 baza1[i]:=0;
i:=0;
While not EOF(F) do
 begin
  readln(F,s);
  baza[i].prod:=s;
  combobox1.Items.Add(s);
  readln(F,s);
  baza[i].cena:=strtofloat(s);
  readln(F,s);
  baza[i].ves:=strtofloat(s);
  i:=i+1;
 end;
closefile(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If (baza1[combobox1.ItemIndex]=0) and (edit5.text<>'') then
 begin
  baza1[combobox1.ItemIndex]:=strtofloat(edit5.text);
  memo1.lines.Add(combobox1.Items[combobox1.itemindex]+'   '+edit5.text+'   '+floattostr(baza[combobox1.itemindex].ves*strtoint(edit5.Text)));
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
If (edit1.text<>'') and (edit2.text<>'') and (edit3.text<>'') and (edit4.text<>'') and (memo1.Text<>'') then
 begin
  MsExcel.ActiveWorkBook.Sheets.Item[edit3.text].Activate;
  MsExcel.Visible:=true;
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MsExcel.Visible:=false;
MsExcel.ActiveWorkBook.activate;
MsExcel.ActiveWorkBook.Sheets.Item[edit3.text].disactivate;
MsExcel.ActiveWorkbook.Save;
MsExcel.ActiveWorkbook.Close;
MsExcel.Application.Quit;
end;

end.

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

Последний раз редактировалось Serge_Bliznykov; 19.03.2012 в 00:29.
2UnLiMiTeDD вне форума Ответить с цитированием
Старый 19.03.2012, 01:36   #3
2UnLiMiTeDD
 
Регистрация: 02.12.2010
Сообщений: 7
По умолчанию

изменил обращение в конце теперь выдает мол неверный индекс, хотя в месте выбора листа проходит нормально, а в сохранении глючит...=(
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, Calendar, StdCtrls, Menus, XPMan, ComObj;

const n=10;

type
  baza0=record
    prod: string;
    cena: Currency;
    ves: Currency;
   end;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    Edit1: TEdit;
    Edit2: TEdit;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Label3: TLabel;
    Edit3: TEdit;
    Label5: TLabel;
    Edit4: TEdit;
    Button2: TButton;
    Memo1: TMemo;
    Edit5: TEdit;
    Label4: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  baza1: array[0..n-1] of single;
  baza: array[0..n-1] of baza0;
  i,j,z,x:byte;
  F:text;
  s:string;
  MsExcel: Variant;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
MsExcel := CreateOleObject('Excel.Application');
MsExcel.Workbooks.open('C:\Users\àíòîí\Desktop\ïàñõà\Zakazi1');
//MsExcel.DisplayAlerts:=False;
Assignfile(F,'baza.txt');
Reset(F);
For i:=0 to n-1 do
 baza1[i]:=0;
i:=0;
While not EOF(F) do
 begin
  readln(F,s);
  baza[i].prod:=s;
  combobox1.Items.Add(s);
  readln(F,s);
  baza[i].cena:=strtofloat(s);
  readln(F,s);
  baza[i].ves:=strtofloat(s);
  i:=i+1;
 end;
closefile(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If (baza1[combobox1.ItemIndex]=0) and (edit5.text<>'') then
 begin
  baza1[combobox1.ItemIndex]:=strtofloat(edit5.text);
  memo1.lines.Add(combobox1.Items[combobox1.itemindex]+'   '+edit5.text+'   '+floattostr(baza[combobox1.itemindex].ves*strtoint(edit5.Text)));
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
If (edit1.text<>'') and (edit2.text<>'') and (edit3.text<>'') and (edit4.text<>'') and (memo1.Text<>'') then
 begin
  MsExcel.WorkBooks[1].Sheets.Item[edit3.text].Activate;
  MsExcel.Visible:=true;
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MsExcel.Visible:=false;
MsExcel.Workbooks[1].Save;
MsExcel.Workbooks[1].Close;
MsExcel.Application.Quit;
end;

end.
2UnLiMiTeDD вне форума Ответить с цитированием
Старый 19.03.2012, 08:00   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Совсем нет времени читать то, что вы приводите в своем листинге, просто покажу вам свой рабочий пример! В глобальные
Код:
const
  EXCEL_FILE_EXT = '.xls';
Далее 2 функции, используйте 1 или 2 в зависимости от ваших нужд
Код:
//Функция сохранения StringGrid в Excel в каталог пользователя
function TForm1.GetExcelSaveAs: String;
begin
   Result:= SaveDialog1.FileName;
end;
Код:
//Функция сохранения StringGrid в Excel в каталог 'MyProject\'
function TForm1.GetExcelSave: String;
begin
   Result:= ExtractFilePath(Application.ExeName) + 'MyProject\' +
            'book1';
  if LowerCase(ExtractFileExt(Result)) <> EXCEL_FILE_EXT then
     Result := Result + EXCEL_FILE_EXT;
end;
Затем пользуемся функциями
Код:
// Сохранить в каталог по умолчанию
procedure TForm1.N5Click(Sender: TObject);
var
  ExcelApp, Sheet: variant;
  Col, Row: Word;
begin
  ForceDirectories(ExtractFilePath(ParamStr(0)) + 'MyProject');
// StringGrid -->> Excel
   ExcelApp:= CreateOleObject('Excel.Application');
   try
    ExcelApp.Visible:= False;
    ExcelApp.Workbooks.Add;
    Sheet:= ExcelApp.ActiveWorkBook.WorkSheets[1];
    for Col:= 0 to StringGrid1.ColCount -1 do
     for Row:= 0 to StringGrid1.RowCount -1 do
      Sheet.Cells[Row + 1, Col +1]:= StringGrid1.Cells[Col, Row];
    Sheet:= ExcelApp.ActiveWorkBook.WorkSheets[2];
    for Col:= 0 to StringGrid2.ColCount -1 do
     for Row:= 0 to StringGrid2.RowCount -1 do
      Sheet.Cells[Row + 1, Col +1]:= StringGrid2.Cells[Col, Row];
    ExcelApp.ActiveWorkbook.SaveAs(GetExcelSave);
   finally
    ExcelApp.Application.Quit;
    ExcelApp:= Unassigned;
    Sheet:= Unassigned;
   end;
end;
и при использовании SaveDialog
Код:
// -->> Сохранить как...
procedure TForm1.N6Click(Sender: TObject);
 var
  ExcelApp, Sheet: variant;
  Col, Row: Word;
begin
 if SaveDialog1.Execute then
  begin
// StringGrid -->> Excel
   ExcelApp:= CreateOleObject('Excel.Application');
   try
    ExcelApp.Visible:= False;
    ExcelApp.Workbooks.Add;
    Sheet:= ExcelApp.ActiveWorkBook.WorkSheets[1];
    for Col:= 0 to StringGrid1.ColCount -1 do
     for Row:= 0 to StringGrid1.RowCount -1 do
      Sheet.Cells[Row + 1, Col +1]:= StringGrid1.Cells[Col, Row];
    Sheet:= ExcelApp.ActiveWorkBook.WorkSheets[2];
    for Col:= 0 to StringGrid2.ColCount -1 do
     for Row:= 0 to StringGrid2.RowCount -1 do
      Sheet.Cells[Row + 1, Col +1]:= StringGrid2.Cells[Col, Row];
    ExcelApp.ActiveWorkbook.SaveAs(GetExcelSave);
   finally
    ExcelApp.Application.Quit;
    ExcelApp:= Unassigned;
    Sheet:= Unassigned;
   end;
  end;
end;
kta87 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Excel (сохранение записи в Excel) Кас Алина Общие вопросы Delphi 4 28.05.2010 09:17
как при импорте из Excel в delphi узнать сколько заполненных строк в книге Excel?чтобы организовать цикл betirsolt БД в Delphi 1 17.01.2010 18:51
Delphi и Excel Tanya2008 Общие вопросы Delphi 3 08.05.2009 12:56
Delphi ->Excel->График по таблице->Delphi Avalonix БД в Delphi 2 30.10.2008 14:04
Excel + Delphi fudzy79 Помощь студентам 3 10.03.2008 19:35