Жестокий облом от Borland...

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Svoja4ok
Сообщения: 27
Зарегистрирован: 18 окт 2006, 15:57

В своём первом топике на этом форуме я спрашивал, как мне сохранить массив в файл екселя, мне порекомендовали если я не хочу заморачиваться, записать в текстовый файл с разделителем табуляции и с расширением xls. Сначала так и сделал:

Код: Выделить всё

 procedure TForm3.N2Click(Sender: TObject);
var t: textfile;
    i:integer;
begin
if savedialog1.Execute then
 begin
 assignfile(t, savedialog1.FileName);
  rewrite(t);
  for i:=1 to stringgrid1.ColCount-1 do
   write(t, stringgrid1.cells[i,2],'');
  writeln(t);
  for i:=1 to stringgrid1.ColCount-1 do
   write(t, stringgrid1.cells[i,3],'');
  writeln(t);
  write(t, label2.caption,'',label3.caption,'',label4.caption);
  closefile(t);
Но напоролся на грабли в траве: открыв файл, экзель не только не раскидал всё по ячейкам, но и вместо букв были иероглифы... (Office 2003 Professional)

Тогда я решил разобраться с нормальным сохранением в екзель.. получилось так:

Код: Выделить всё


uses .........., comobj,........
.......
 procedure TForm3.N2Click(Sender: TObject);
var 
    i:integer;
    XL:Variant;
begin
if savedialog1.Execute then
  XL:= CreateOleObject('Excel.Application');
  XL.WorkBooks.Add;
  XL.WorkBooks[1].WorkSheets[1].Name:='test';
  for i:=1 to stringgrid1.ColCount-1 do begin
  XL.WorkBooks[1].Sheets[1].Cells[i,1]:=stringgrid1.cells[i,2];
  XL.WorkBooks[1].Sheets[1].Cells[i,1]:=stringgrid1.cells[i,3];
  XL.Workbooks[1].SaveAs(savedialog1.filename);
  end;
     XL.DisplayAlerts := False;
     XL.Quit;
     XL := Unassigned;
Но и тут меня ждал облом, при компиляции мне сказали что, компилятор не знает такого понятия ( Undeclared Identifer) как CreateOleObject, Workbooks, и всё что есть в этом коде связоное с екзелем.

Поковырявшись в инете я наткнулся на совсем печальное известие о том, что в Delphi 8 (а я на нем и пишу), в библиотеку ComObj не добавляли описание и методы работы с такими вещами....

Так чтоже мне теперь делать, господа? Есть мысль что можно засунуть в него библиотеку от 7-ого делфи, но встанет ли она?
Или попытаться простым (первым примером) способом всё таки сохранять...?

Подскажите пожалуйста....
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Попробуй экспортировать массив в DBF и открыть его Excel'ем
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Svoja4ok, ну вапче-то XL у тебя объявлен вариантом, а вариант не имеет таких свойств, так что компилятор прав. Надо либо делать приведение типа, либо копать в сторону интерфейсов экселя что-то типа XL: IExcelApplication...

ЗЫ. а если уж сохранять в текстовый формат, то имхо, лучше в качестве разделителя взять ";" и расширение дать CSV
Svoja4ok
Сообщения: 27
Зарегистрирован: 18 окт 2006, 15:57

Игорь Акопян писал(а):Svoja4ok, ну вапче-то XL у тебя объявлен вариантом, а вариант не имеет таких свойств, так что компилятор прав. Надо либо делать приведение типа, либо копать в сторону интерфейсов экселя что-то типа XL: IExcelApplication...
А можно чутка примеров? просто не доконца представляю как это должно выглядеть..
Игорь Акопян писал(а): ЗЫ. а если уж сохранять в текстовый формат, то имхо, лучше в качестве разделителя взять "]
Хм, раскидал по ячейкам, но почему-то первая строка выравнена по правому краю, вторая по левому, третья ваще по центру... И опять иероглифы..(((
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

неужели в Д8 убрали компоненты для работы с Офисом?
Изображение
Svoja4ok
Сообщения: 27
Зарегистрирован: 18 окт 2006, 15:57

CreateOleObject located in ComObj.pas has not been ported to
Borland.Vcl.ComObj.pas.
Точно уже не помню где нашёл...

и вот здеся народ обсуждал
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Svoja4ok, во-первых, тебе насоветовали не очень хорошо, а во-вторых ты реализовал не правильно :)
Лучше файлу дать расширение csv (comma separated values), а данные разделять запятыми или точкой с запятой (причём следить, чтобы в значениях, которые ты записываешь в файл не было не экранированных разделителей). Ты ещё разделял не табами, а пробелами. А с иероглифами у тебя проблема скорее всего из-за кодировки (наверное у файла DOS кодировка). Excel при открытии файла должен спрашивать в какой кодировке его открыть.
Даже самый дурацкий замысел можно воплотить мастерски
Svoja4ok
Сообщения: 27
Зарегистрирован: 18 окт 2006, 15:57

AiK, разделял как раз табами... просто сюда наверно как то подругому привёл. (кнопку Tab и кнопку Space перепутать сложно)... А можноли как- нибудь указать кодировку при записи файла? а то триклятый экзель ничего не спрашивает при открытии..
причём следить, чтобы в значениях, которые ты записываешь в файл не было не экранированных разделителей
всмысле не экранированных?

И всё же можно ли как нибудь сохранять в xls? или csv в моём случае надёжнее?
Svoja4ok
Сообщения: 27
Зарегистрирован: 18 окт 2006, 15:57

Народ! Ну дайте реальный ответ: как мне сохранить в файл екзель, чтобы он при открытии енто всё раскидал и были НЕ иероглифы?
Мне нужно просто сохранить файл по правилам екзеля, но не более того...
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Вот этот файлик сохрани на диск и открой в Exele:
[quote="sample1.txt"]
проверка]
и этот тоже
[quote="sample2.txt"]
ЇаRў_аЄ ]
Открывать через file->open. Разделитель правильный указать не забудь :)
NB: я кстати тоже наврал. С расширением csv диалог с выбором кодировки не высвечивается. Я ошибочно делал расширение cvs.
Даже самый дурацкий замысел можно воплотить мастерски
Ответить