Excel

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

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

Alana
новенький
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Excel

Сообщение Alana »

Искала, но подходящей темы не нашлось (либо плохо искала :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.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

А как ругается?
и где
Alana
новенький
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Сообщение Alana »

PrintUnit.pas(39,22) Error: Incompatible types: got "AnsiString" expected "LongInt"
А если в строке

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

Excel.WorkBooks.Open[path];

переменную path взять в квадратные скобки, то программа компилируется. Но при попытке запустить файл .xls выдает ошибку:
Изображение
Красиво, правда? :)
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

2Alana

вместо:

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

Excel.WorkBooks.Open[path];

нужно:

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

Excel.WorkBooks.Open(path);
Alana
новенький
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Сообщение Alana »

Kitayets писал(а):нужно:

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

Excel.WorkBooks.Open(path);

А если в строке:

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

Excel.WorkBooks.Open[path];

переменную path взять в круглые скобки, то программа компилируется. Но при попытке запустить файл .xls выдает ошибку:
Изображение
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

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

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

попробуйте:

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

1. Excel.WorkBooks.Open(UTF8Decode(path));
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

Кхе, опять грабли. Ну не поддерживает Lazarus (FreePascal) OLE (пока).
m_guest
постоялец
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Сообщение m_guest »

Можно попробовать использовать сторонние компоненты вроде fpspreadsheet
Alana
новенький
Сообщения: 24
Зарегистрирован: 08.09.2010 16:29:13

Сообщение Alana »

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

Ну вот, как печально :( А мне очень excel нужен....
Аватара пользователя
WindOfPain
новенький
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Сообщение WindOfPain »

Как вариант, сделать dll библиотеку для работы с Excel в Turbo Delphi, и уже через нее из Lasarus ковыряться в Excel.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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

Сообщение coyot.rush »

читаем тут 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 и все время находиться какие то проблемы при открытии :!:
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

Спорить не буду, так как никогда не делал извращенски сложных файлов. :) Однако те, что делал, в Excel все открывались без проблем. Опять же оговорюсь - мои файлы простые: заголовок, табличка, подвал, бордюрчики таблицы. С таким контентом проблем ни разу не возникало.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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\...) и разрешать менять в настройках программы.
Аватара пользователя
evd
новенький
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда
Контактная информация:

Сообщение evd »

У меня вот такой код работает. 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;
Ответить