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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.05.2012, 10:30
hsimpson hsimpson вне форума
Прохожий
 
Регистрация: 28.05.2012
Сообщения: 4
Репутация: 10
По умолчанию Экспорт из StringGrid в Excel (TXLSFile)

Добрый день
Начал осваивать компонент TXLSFile и столкнулся вот с какой проблемой:

История следующая:
1. открываю файл Excel, из него экспортирую базу данных в StringGrid
2. в StringGrid провожу некие коррекции базы данных
3. базу обратно экспортирую из StringGrid в исходный файл Excel, записываю и файл закрываю
4. финиш

...все очень посто, но вот шаг №3 меня неприятно удивил.
Дело в том, что почему-то экспорт происходит, но без исправлений, внесенных в StringGrid.
Т.е. записывается в файл то, что было из этого файла получено ранее.

Тестовый проект в прикрепленном архиве

1. жмем на "Старт"
2. дважды кликаем по строке в StringGrid
3. меняем статус заказа (или не меняем)
4. жмем "Запись"

Спасибо за внимание.
Вложения
Тип файла: rar 1.rar (15.0 Кбайт, 16 просмотров)
Ответить с цитированием
  #2  
Старый 28.05.2012, 10:51
hsimpson hsimpson вне форума
Прохожий
 
Регистрация: 28.05.2012
Сообщения: 4
Репутация: 10
По умолчанию

На всякий случай публикую код:
Код:
unit Unit1;

interface

uses
  ShellAPI, XLSFile, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, RzGrids, RzButton, StdCtrls, RzCmboBx, ExtCtrls, RzPanel,
  XLSExportComp;

type
  TForm1 = class(TForm)
    RzStringGrid38: TRzStringGrid;
    RzPanel10: TRzPanel;
    Label92: TLabel;
    Label37: TLabel;
    RzBitBtn25: TRzBitBtn;
    RzComboBox45: TRzComboBox;
    RzBitBtn1: TRzBitBtn;
    XLSExportRzStringGrid38: TXLSExportStringGrid;
    procedure RzButton1Click(Sender: TObject);
    procedure RzStringGrid38DblClick(Sender: TObject);
    procedure RzBitBtn25Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  xf: TXLSFile;
  R, C, N: integer;
  S, L: string;

implementation

{$R *.dfm}


procedure OpenFileInOSShell(AFile: string);
begin
ShellExecute(0, 'open', PChar(AFile), nil, nil, SW_SHOW);
end;

procedure TForm1.RzButton1Click(Sender: TObject);
begin
xf:= TXLSFile.Create;
xf.OpenFile('db.xls');
L:='не пусто';
N:=0;
with xf.Workbook.Sheets[0] do begin//определение количества заполненных строк в базе
while L<>'' do begin
S:=Cells[N, 1].Value;
L:=Cells[N, 0].Value;
N:=N+1;
end;
RzStringGrid38.ColCount:=21;
RzStringGrid38.RowCount:=N-1;
end;
for R:=1 to N do begin
for C:=0 to 20 do begin
with xf.Workbook.Sheets[0] do L:=Cells[R,C].Value;
RzStringGrid38.Cells[C,R-1]:=L;
end;
end;
xf.Destroy;
end;

procedure TForm1.RzStringGrid38DblClick(Sender: TObject);
begin
RzPanel10.Visible:=true;
Label37.Caption:=RzStringGrid38.cells[0,RzStringGrid38.row];
if (RzStringGrid38.cells[20,RzStringGrid38.row]='в производстве') or (RzStringGrid38.cells[20,RzStringGrid38.row]='') then RzComboBox45.ItemIndex:=0;
if RzStringGrid38.cells[20,RzStringGrid38.row]='сдан на склад' then RzComboBox45.ItemIndex:=1;
if RzStringGrid38.cells[20,RzStringGrid38.row]='отменен' then RzComboBox45.ItemIndex:=2;
end;

procedure TForm1.RzBitBtn25Click(Sender: TObject);
begin
RzStringGrid38.cells[20,RzStringGrid38.row]:=RzComboBox45.Text;//изменение статуса заказа
RzStringGrid38.cells[2,RzStringGrid38.row]:=datetostr(date);//дата изменения статуса
RzStringGrid38.cells[5,RzStringGrid38.row]:=timetostr(time);//время изменения статуса
xf:= TXLSFile.Create;
xf.OpenFile('db.xls');
with xf.Workbook.Sheets[0] do XLSExportRzStringGrid38.ExportData(0, 3, 0);
xf.SaveAs('db.xls');
xf.Destroy;
RzPanel10.Visible:=false;
end;
end.
Админ: Пользуемся тегами для оформления кода!

Последний раз редактировалось Admin, 28.05.2012 в 13:53.
Ответить с цитированием
  #3  
Старый 28.05.2012, 12:52
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от hsimpson
xf.OpenFile('db.xls');
with xf.Workbook.Sheets[0] do XLSExportRzStringGrid38.ExportData(0, 3, 0);
xf.SaveAs('db.xls');
вообще нихпанятно зачем открывать файл если экспортируеш из стринггрида
во вторых чо за порно с with?
в третьих в итоге ты тупо открываеш файл и сохраняеш егоже без изменений
Ответить с цитированием
  #4  
Старый 28.05.2012, 13:15
hsimpson hsimpson вне форума
Прохожий
 
Регистрация: 28.05.2012
Сообщения: 4
Репутация: 10
По умолчанию

Начальник, не будь таким строгим
Я самоучка...
Давай разберемся:


1. ..."вообще нихпанятно зачем открывать файл если экспортируеш из стринггрида"...
Файл я открываю перед экспортом потому, что он должным образом отформатирован. И в файле не только этот лист. Мне так удобнее с организационной точки зрения.

2. ... "во вторых чо за порно с with?"...
Да вроде не порно... Я работаю с первым листом книги.

3. ..."в третьих в итоге ты тупо открываеш файл и сохраняеш егоже без изменений"...
Да я знаю, что так и происходит Я не пойму, как из стринггрида выгрузить в имеющийся файл.
Ответить с цитированием
  #5  
Старый 28.05.2012, 13:49
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от hsimpson
Да вроде не порно... Я работаю с первым листом книги.
правда чтоли? тогда опиши по русски что происходит в этой строке

и на будущее, забудь про with вообще,тогда хотябы будеш видеть что происходит

ps
не думай что ктото будет устанавливать 2пакета компонентов чтобы написать тебе код

Последний раз редактировалось robt, 28.05.2012 в 13:55.
Ответить с цитированием
  #6  
Старый 28.05.2012, 14:46
hsimpson hsimpson вне форума
Прохожий
 
Регистрация: 28.05.2012
Сообщения: 4
Репутация: 10
По умолчанию

Начал описывать и осознал, что номер листа указывается в экспорте.
Действительно, with оказалась из разряда "порно"...
Спасибо.
Однако, насколько я понимаю, это из области глупостей, не влияющих на конечный результат.
Ответить с цитированием
  #7  
Старый 28.05.2012, 16:02
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от hsimpson
Однако, насколько я понимаю, это из области глупостей, не влияющих на конечный результат.
with
напрямую влияет на читаемость и понимание кода и обычно в худшую сторону, никах оптимизаций кода и плюсов он не дает вообще
лучше сто раз скопипастить имя объекта для обращения к свойствам чем разгребать потом чОпроисходит в рамках with
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter