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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2008, 14:23   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос из StringGrid в Excel

У меня есть код который сохраняет StringGrid в Excel файле. Сохраняет нормально. Так же у меня есть процедура импорта данных из Excel в StringGrid. Но тут у меня возникает проблема. Ккогда я нажимаю на кнопку импорта данных в StringGrid, то появялется длинное сообщение об ошибке, в которой говорится, что имя таблицы которую я хочу вставить в StringGrid не совпадает с той, что я сохранял. Мне надо чтобы было вот как: чтобы я сохранил в своей программе таблицу в Excel, а потом через какое то время я снова запустил свою программу и нажав кнопку импорта я смог получить ранее сохраненную таблицу для внесения новых данных. Кто нибудь знает как сделать чтобы данне из сохраненной таблицы при импорте вставились на свои места и ничего не потерялось? Ведь сохранять же он сохраняет нормально, а загружать почему то нормально не может((. Помогите кто чем может.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 24.07.2008, 14:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну и где текст ошибки?
и код где? В архивах ЦРУ за семью печатями?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.07.2008, 15:17   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Извиняюсь) Код забыл) Вот код (извините если оформил его не правильно):
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

(это программа сохраняет таблицу в Excel файле):
Код:
procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
   const AValue: string);
 var
   L3: Word;
 const
   {$J+}
   CXlsLabel3: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
   {$J-}
 begin
   L3 := Length(AValue);
   CXlsLabel3[1] := 8 + L3;
   CXlsLabel3[2] := ARow;
   CXlsLabel3[3] := ACol;
   CXlsLabel3[5] := L3;
   XlsStream.WriteBuffer(CXlsLabel3, SizeOf(CXlsLabel3));
   XlsStream.WriteBuffer(Pointer(AValue)^, L3);
 end;


 function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean;
 const
   {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
   CXlsEof: array[0..1] of Word = ($0A, 00);
 var
   FStream3: TFileStream;
   I3, J3: Integer;
 begin
   Result := False;
   FStream3 := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
   try
     CXlsBof[4] := 0;
     FStream3.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
     for i3 := 0 to AGrid.ColCount - 1 do
       for j3 := 0 to AGrid.RowCount - 1 do
         XlsWriteCellLabel(FStream3, I3, J3, AGrid.cells[i3, j3]);
     FStream3.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
     Result := True;
   finally
     FStream3.Free;
   end;
 end;

procedure TForm14.Excel1Click(Sender: TObject);
begin
 if SaveAsExcelFile(SG3, 'Таблица №3.xls') then
     MessageBox(0,'Таблица успешно сохранена!','Счетовод 2008 v.1.0',MB_ICONINFORMATION);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Это процедура импорта данных из Excel в StringGrid:

function xls_to_stringgrid(agrid:tstringgrid; axlsfile:string):boolean;
const
  xlcelltypelastcell=$0000000b;
var
  xlapp,sheet:olevariant;
  rangematrix:variant;
  x,y,k,r:integer;
begin
    result:=false; //создание ole-объекта
    xlapp:=createoleobject('excel.application');
    try
      //запуск Excel
      xlapp.visible:=false;
      //открытие книги
      xlapp.workbooks.open(axlsfile);
      //sheet:=xlapp.workbooks[1].worksheets[1];
      sheet:=xlapp.workbooks[extractfilename(axlsfile)].worksheets[1];
      sheet.cells.specialcells(xlcelltypelastcell,emptyparam).activate;
      x:=xlapp.activecell.row;
      y:=xlapp.activecell.column;
      agrid.RowCount:=x;
      agrid.ColCount:=y;
      rangematrix:=xlapp.range['a1',xlapp.cells.item[x,y]].value;
      k:=1;
      repeat
        for
          r:=1 to y do
          agrid.Cells[(r-1),(k-1)]:=rangematrix[k,r];
          inc(k,1);
          agrid.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 TForm14.sd1Click(Sender: TObject);
begin
 if xls_to_stringgrid(SG3,'Таблица №3.xls') then
  MessageBox(0,'Таблица успешно импортирована!','Счетовод 2008 v.1.0',MB_ICONINFORMATION);

end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Вот. Если будете исправлять ошибки прямо в коде, то обозначьте их каким нибудь цветом, чтобы я увидел.
Буду очень благодарен вам если сможете мне помочь)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

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

Любопытный код...
А почему бы тебе не сохранять в Экзель через excel.application, уж коли ты его всетки задействовал, или через ADO?
ИМХО, гемору меньше и надежнее...

Да и еще - ты бы прошелся по шагам (умеешь отлаживать проги?) да выявил бы на каком операторе проблемы...

Впрочем твоя ошибка в том что ты неверно указываешь полный путь к XLS.
Вот допустим так:
Код:
xls_to_stringgrid(Agrid,'c:\temp\a.xls');
I'm learning to live...

Последний раз редактировалось Stilet; 24.07.2008 в 15:46.
Stilet вне форума Ответить с цитированием
Старый 24.07.2008, 15:51   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Отлаживать программу я умею). Этот код рабочий, в смысле он компилируется и запускается.
Stilet, а ты можешь написать как пользоваться этим ADO? А то я не знаю. Если можешь, то напиши пожалуйста применительно к моему коду).
/////////////////
xls_to_stringgrid(Agrid,'c:\temp\a. xls');
//////////////////////////
Но ведь пользователю будет неудобно наверное каждый раз по необходимости заходить по этому пути? А почему именно папку "temp"? Почему не "program files " например?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 24.07.2008, 16:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А почему именно папку "temp"? Почему не "program files " например?
Это всего лишь пример. А где они у тебя лежат?
Цитата:
ты можешь написать как пользоваться этим ADO?
Помоему я уже тут описывал как подключиться к Excell через ADO в провайдере ODBC... Поищи по форуму.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.07.2008, 18:14   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

У меня они лежат в той же папке, что и программа. А по поводу поискать на форуме) Не могли бы вы дать ссылку, а то форум большой, могу не найти)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Borland C++ Builder - импорт из Excel в StringGrid nuser C++ Builder 3 10.01.2015 12:38
Excel и StringGrid в Delphi monushka Помощь студентам 28 28.10.2009 16:33
Excel и StringGrid... Roof Общие вопросы Delphi 2 18.09.2007 17:07
Формирование из excel в ASCII, у меня он формирует по одному клиенту а в Excel нескол Askat Общие вопросы Delphi 0 18.07.2007 06:28
Excel и StringGrid apx_angel Компоненты Delphi 2 20.02.2007 00:20