Excel

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Excel

Сообщение Alana » 13.09.2010 11:37:17

Искала, но подходящей темы не нашлось (либо плохо искала :roll: ). Цель вот какая - есть документ blank_z.xls. Он служит как заготовка, как пустая форма. Есть программа, которая соединяется с базой MySQL. Необходимо открыть этот файл .xls и записать в него данные в определенные ячейки из определенных полей с формы. В делфи это сделалось очень просто:
Код: Выделить всё
procedure TPrintForm.BitBtn1Click(Sender: TObject);
var
path: string;
Excel, Sheet: Variant;
begin
path:=ExtractFilePath(Application.ExeName)+'Reports/blank_z.xls';
Excel:=CreateOLEObject('Excel.Application');
Excel.WorkBooks.Open[path];
Excel.Visible:=true;

Excel.Range['B6']:=PrintForm.DBEdit1.Text;
Excel.Range['B7']:=PrintForm.DBEdit2.Text;
Excel.Range['G7']:=PrintForm.DBEdit3.Text;
Excel.Range['I7']:=PrintForm.DBEdit4.Text;
Excel.Range['K7']:=PrintForm.DBEdit5.Text;
Excel.Range['M7']:=PrintForm.DBEdit6.Text;
Excel.Range['C8']:=PrintForm.DBEdit7.Text;
Excel.Range['D9']:=PrintForm.DBEdit8.Text;
Excel.Range['I15']:=PrintForm.DBEdit9.Text;
end;

Первую часть открытия файла скопировала в проект Lazarus. Но ничего не работает. Ругается на переменную path.
Alana
новенький
 
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Re: Excel

Сообщение xcod » 13.09.2010 11:42:44

А как ругается?
и где
xcod
постоялец
 
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Re: Excel

Сообщение Alana » 13.09.2010 13:25:05

PrintUnit.pas(39,22) Error: Incompatible types: got "AnsiString" expected "LongInt"
А если в строке
Код: Выделить всё
Excel.WorkBooks.Open[path];

переменную path взять в квадратные скобки, то программа компилируется. Но при попытке запустить файл .xls выдает ошибку:
Изображение
Красиво, правда? :)
Alana
новенький
 
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Re: Excel

Сообщение Kitayets » 13.09.2010 14:09:29

2Alana

вместо:
Код: Выделить всё
Excel.WorkBooks.Open[path];

нужно:
Код: Выделить всё
Excel.WorkBooks.Open(path);
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Excel

Сообщение Alana » 13.09.2010 14:33:12

Kitayets писал(а):нужно:
Код: Выделить всё
Excel.WorkBooks.Open(path);

А если в строке:
Код: Выделить всё
Excel.WorkBooks.Open[path];

переменную path взять в круглые скобки, то программа компилируется. Но при попытке запустить файл .xls выдает ошибку:
Изображение
Alana
новенький
 
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Re: Excel

Сообщение Kitayets » 13.09.2010 14:49:40

извиняюсь, что не внимательно прочитал.

1. правильный вариант - с круглыми скобками
2. ругается, видимо потому, что не нравится кодировка строки (UTF-8).

попробуйте:
Код: Выделить всё
1. Excel.WorkBooks.Open(UTF8Decode(path));
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Excel

Сообщение GrayEddy » 13.09.2010 15:06:48

Кхе, опять грабли. Ну не поддерживает Lazarus (FreePascal) OLE (пока).
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Excel

Сообщение m_guest » 13.09.2010 15:17:49

Можно попробовать использовать сторонние компоненты вроде fpspreadsheet
m_guest
постоялец
 
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Re: Excel

Сообщение Alana » 13.09.2010 15:59:11

GrayEddy писал(а):Кхе, опять грабли. Ну не поддерживает Lazarus (FreePascal) OLE (пока).

Ну вот, как печально :( А мне очень excel нужен....
Alana
новенький
 
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Re: Excel

Сообщение WindOfPain » 13.09.2010 16:08:39

Как вариант, сделать dll библиотеку для работы с Excel в Turbo Delphi, и уже через нее из Lasarus ковыряться в Excel.
Аватара пользователя
WindOfPain
новенький
 
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Re: Excel

Сообщение Vadim » 13.09.2010 16:13:28

Alana писал(а):А мне очень excel нужен....

Записывайте свои данные в XML-файл. Он Экселем прекрасно открывается и даже UTF-8 его не смущает. ;)
Чтобы узнать, каким образом записывать данные, надо создать образец в Экселе с небольшим кол-вом аналогичных данных и необходимым оформлением. Потом сохранить как XML и посмотреть в любом текстовом редакторе, который поддерживает UTF-8, что и в каком порядке туда записалось. После чего можно просто записывать в текстовый файл с помощью Write\WriteLn, либо TStrringList.Add(...) и TStringList.SaveToFile(Имя_файла).
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Excel

Сообщение coyot.rush » 13.09.2010 16:27:54

читаем тут CSV http://ru.wikipedia.org/wiki/CSV
и тут Импорт и экспорт текстовых файлов http://office.microsoft.com/ru-ru/excel-help/HP010099725.aspx

Добавлено спустя 7 минут 9 секунд:
Vadim
Записывайте свои данные в XML-файл. Он Экселем прекрасно открывается и даже UTF-8 его не смущает. ;)
Чтобы узнать, каким образом записывать данные, надо создать образец в Экселе с небольшим кол-вом аналогичных данных и необходимым оформлением. Потом сохранить как XML и посмотреть в любом текстовом редакторе, который поддерживает UTF-8, что и в каком порядке туда записалось. После чего можно просто записывать в текстовый файл с помощью Write\WriteLn, либо TStrringList.Add(...) и TStringList.SaveToFile(Имя_файла).

Reverse Engineering очень увлекательное занятие :roll:
Команда из OpenOffice постоянно реферсит форматы MSO и все время находиться какие то проблемы при открытии :!:
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Excel

Сообщение Vadim » 13.09.2010 17:02:33

coyot.rush писал(а):Команда из OpenOffice постоянно реферсит форматы MSO и все время находиться какие то проблемы при открытии

Спорить не буду, так как никогда не делал извращенски сложных файлов. :) Однако те, что делал, в Excel все открывались без проблем. Опять же оговорюсь - мои файлы простые: заголовок, табличка, подвал, бордюрчики таблицы. С таким контентом проблем ни разу не возникало.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Excel

Сообщение Odyssey » 13.09.2010 17:26:08

CSV тут может не хватить. Самый простой и быстрый для реализации способ предложил Vadim. Я бы предложил дополнить его не генерацией, а банальной заменой по подстановочным символам. По шагам:
* Делаем резервную копию файла XLS и открываем его.
* В ячейку B6 вставляем текст, например "{DBEdit1}" (главное чтобы такого текста больше ни в какой ячейке не было)
* В B7 вставляем {DBEdit2}
* В G7 вставляем {DBEdit3}
* и т.д.
* сохраняем файл как XML (что-то типа Excel 2003 XML)

Потом из программы делаем что-то вроде:
Код: Выделить всё
var
  Path: string;
  ReportPath: string;
  ExcelData: TStringList;
  Buffer: string;
begin
  Path:=Utf8Decode(ExtractFilePath(Application.ExeName)+'Reports/blank_z.xml');
  ReportPath:=Utf8Decode(ExtractFilePath(Application.ExeName)+'Reports/temp_report.xml');
  ExcelData := TStringList.Create;
  ExcelData.LoadFromFile(path);
  Buffer := ExcelData.Text;
  Buffer := StringReplace(Buffer, '{DBEdit1}', PrintForm.DBEdit1.Text, []);
  Buffer := StringReplace(Buffer, '{DBEdit2}', PrintForm.DBEdit2.Text, []);
  Buffer := StringReplace(Buffer, '{DBEdit3}', PrintForm.DBEdit3.Text, []);
  // и т.д.
  ExcelData.Text := Buffer;
  ExcelData.SaveToFile(ReportPath);
  FreeAndNil(ExcelData);
  // открываем созданный файл в Excel
  ExecuteProcess('путь к excel', ReportPath);
end;

Код разумеется не тестировал и не оптимизировал, думаю идея понятна. В пути к excel можно попробовать указать просто excel.exe (или как он там называется, возможно он уже в path, вроде бы у меня такое было). Если не получится -- можно устанавливать в путь по умолчанию (C:\Program Files\...) и разрешать менять в настройках программы.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Excel

Сообщение evd » 13.09.2010 19:01:11

У меня вот такой код работает. FPC 2.4.0, Lazarus 0.9.29
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
path: string;
Excel, Sheet: OleVariant;
begin
  path:=ExtractFilePath(Application.ExeName)+'Reports\blank_z.xls';
  Excel:=CreateOLEObject('Excel.Application');
  try
    Excel.WorkBooks.Open(WideString(UTF8Decode(path)));
    Excel.Visible:=true;
    Excel.Range('B6'):='B6';
    Excel.Range('B7'):='B7';
    Excel.Range('G7'):='G7';
    Excel.Range('I7'):='I7';
  except
    on E:EOleException do
      ShowMessage(UTF8Encode(E.Message));
  end;
end;
Аватара пользователя
evd
новенький
 
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

Рейтинг@Mail.ru