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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2009, 20:04   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию Корректное сохранение в Excel

Добрый вечер! Вообщем возник такой вопрос. В программе происходит работа с Excel. Вот процедура сохранения StringGrid-a в Excel:
Код:
//сохранение
function SaveAsExcelFile1(StringGrid1:TStringGrid; FileName:string):Boolean;
const
 xlWBATWorksheet = -4167;
var
 Row,Col:integer;
 GridPrevFile:string;
 XLApp,Sheet:OLEVariant;
begin
 Result:=False;
 XLApp:=CreateOleObject('Excel.Application');
 try
  XLApp.Visible:=False;
  XLApp.Workbooks.Add(xlWBATWorkSheet);
  Sheet:=XLApp.Workbooks[1].WorkSheets[1];
  Sheet.Name:='My Sheet Name';
  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];
  try
    XLApp.Workbooks[1].SaveAs(FileName);
    Result:=True;
  except
  end;
 finally
   if not VarIsEmpty(XLApp) then
   begin
     XLApp.DisplayAlerts:=False;
     XLApp.Quit;
     XLApp:=Unassigned;
     Sheet:=Unassigned;
   end;
 end;
end;

procedure TForm8.BitBtn3Click(Sender: TObject);
begin
begin
 if SaveDialog1.Execute then
  SaveAsExcelFile1(StringGrid1,SaveDialog1.FileName); 
end;
end;
и открытие:
Код:
//открытие
function xls_to_StringGrid1(StringGrid1:TStringGrid; axlsfile:string):Boolean;
const
 XlCellTypeLastCell=$0000000b;
var
 XLapp,Sheet:Olevariant;
 RangeMatrix:Variant;
 x,y,k,r:integer;
begin
  Result:=false;
  XLapp:=CreateOleObject('excel.application');
  try
    XLapp.Visible:=false;
    XLapp.Workbooks.Open(axlsfile);
    Sheet:=XLapp.Workbooks[1].Worksheets[1];
    Sheet.cells.specialcells(XLCellTypeLastCell,emptyparam).Activate;
    x:=XLapp.Activecell.Row;
    y:=XLapp.Activecell.Column;
    StringGrid1.RowCount:=x;
    StringGrid1.ColCount:=y;
    RangeMatrix:=XLapp.Range['a1',XLapp.Cells.Item[x,y]].Value;
    k:=1;
    repeat
      for
        r:=1 to y do
        StringGrid1.Cells[r-1,k-1]:=RangeMatrix[k,r];
        inc(k,1);
        StringGrid1.RowCount:=k+1;
        until k>x;
        RangeMatrix:=Unassigned;
    finally
    if not Varisempty(XLapp) then
      begin
       XLapp.Quit;
       XLapp:=Unassigned;
       Sheet:=Unassigned;
       Result:=True;
      end;
    end;
  end;

procedure TForm8.BitBtn2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
  xls_to_StringGrid1(StringGrid1,OpenDialog1.FileName); 
end;
Но при открытии состояние таблицы изменяется . Мне нужно, чтобы сетка не изменялась а данные загружались как надо. На рисунке 1 StringGrid перед загрузкой, а на рисунке 2 StringGrid с загруженными данными. Вопрос: как сделать, чтобы структура сетки оставалась неизменной, а вставлялись только данные? Заранее спасибо за ответы.

P.S. Уважаемые модераторы! Прощу прощения за то, что не в том разделе разместил тему. Хотел создать ее в "Общие вопросы Delphi", но ошибся. Прошу вас, перенесите тему и не закрывайте пожалуйста ее.
Изображения
Тип файла: jpg 1.jpg (26.3 Кб, 142 просмотров)
Тип файла: jpg 2.jpg (18.0 Кб, 136 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 19.07.2009 в 20:07. Причина: Ошибся разделом
artemavd вне форума Ответить с цитированием
Старый 19.07.2009, 20:57   #2
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Невникал, но убери работу со строками и столбцами StrinGrid'а:
Код:
function xls_to_StringGrid1(StringGrid1:TStringGrid; axlsfile:string):Boolean;
const
 XlCellTypeLastCell=$0000000b;
var
 XLapp,Sheet:Olevariant;
 RangeMatrix:Variant;
 x,y,k,r:integer;
begin
  Result:=false;
  XLapp:=CreateOleObject('excel.application');
  try
    XLapp.Visible:=false;
    XLapp.Workbooks.Open(axlsfile);
    Sheet:=XLapp.Workbooks[1].Worksheets[1];
    Sheet.cells.specialcells(XLCellTypeLastCell,emptyparam).Activate;
    x:=XLapp.Activecell.Row;
    y:=XLapp.Activecell.Column;
    RangeMatrix:=XLapp.Range['a1',XLapp.Cells.Item[x,y]].Value;
    k:=1;
    repeat
      for
        r:=1 to y do
        StringGrid1.Cells[r-1,k-1]:=RangeMatrix[k,r];
        inc(k,1);
        until k>x;
        RangeMatrix:=Unassigned;
    finally
    if not Varisempty(XLapp) then
      begin
       XLapp.Quit;
       XLapp:=Unassigned;
       Sheet:=Unassigned;
       Result:=True;
      end;
    end;
  end;
Или строки оставь.

Последний раз редактировалось Evgeniy26; 19.07.2009 в 21:05.
Evgeniy26 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СОХРАНЕНИЕ данных из StringGrid в Excel monushka Общие вопросы Delphi 4 17.05.2012 18:56
Сохранение имен столбцов при импорте данных из Delphi в Excel an4ik Общие вопросы Delphi 3 07.03.2009 15:23
корректное отображение импортированных данных в формулах Excel petrov_ja Помощь студентам 1 03.03.2009 00:27
Корректное сохранение Ico Nester Общие вопросы Delphi 1 25.12.2008 19:50
Сохранение текущего листа Excel в отдельный файл IpS Microsoft Office Excel 10 04.10.2008 13:45