Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Добавление данных с формы в Excel, и наоборот


Автор: ReGeDiT 20.6.2008, 20:57
Код
procedure TForm3.Button2Click(Sender: TObject);
const
  xlCellTypeLastCell = $0000000B; //Метка пустой страницы (вроде как :))
var
  row, col, num: Integer;
  XLApp, Sheet: OLEVariant;
begin

  // Добавление в базу
  Base := CreateOleObject('Excel.Application');
  Base.Visible := False;
  Base.Workbooks.Open(Path+'\DB.xls');
  Base.Activesheet.Cells.Item[1, 1].Value := 'Данные01';
  Base.Activesheet.Cells.Item[2, 1].Value := 'Данные02';
  Base.Activesheet.Cells.Item[3, 1].Value := 'Данные03';
  Base.Activesheet.Cells.Item[4, 1].Value := 'Данные04';
  Base.Activesheet.Cells.Item[5, 1].Value := 'Данные05';
  Base.Activesheet.Cells.Item[6, 1].Value := 'Данные06';
  Base.Activesheet.Cells.Item[7, 1].Value := 'Данные07';
  Base.Activesheet.Cells.Item[8, 1].Value := 'Данные08';
  Base.Activesheet.Cells.Item[9, 1].Value := 'Данные09';  Base.Activesheet.Cells.Item[10, 1].Value := 'Данные10';
  Base.Activesheet.Cells.Item[11, 1].Value := 'Данные11';

  Base.Activesheet.Cells.Item[1, 2].Value := Edit1.Text;
  Base.Activesheet.Cells.Item[2, 2].Value := Edit2.Text;
  Base.Activesheet.Cells.Item[3, 2].Value := Edit3.Text;
  Base.Activesheet.Cells.Item[4, 2].Value := Edit4.Text;
  Base.Activesheet.Cells.Item[5, 2].Value := Edit5.Text;
  Base.Activesheet.Cells.Item[6, 2].Value := Edit6.Text;
  Base.Activesheet.Cells.Item[7, 2].Value := Edit7.Text;
  Base.Activesheet.Cells.Item[8, 2].Value := Edit8.Text;
  Base.Activesheet.Cells.Item[9, 2].Value := Edit9.Text;
  Base.Activesheet.Cells.Item[10, 2].Value := Edit10.Text;
  Base.Activesheet.Cells.Item[11, 2].Value := Edit11.Text;

  Base.Workbooks.Close;

  // Добавление в базу вроде кое-как работает, хотя с её структурой мне ещё надо разбираться, не знаю как лучше её организовать, либо
  // на каждый лист по набору данных, либо всё на одном листе. Дайте совет, если кто может :)

  // Добавление записи журнал (а вот это не работает :( )

  Jrn := CreateOleObject('Excel.Application');
  Jrn.Visible := False;
  Jrn.Workbooks.Open(Path+'\JR.xls'); // Журнал данных
  Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[1]; // Ругается на это, пробовал и 0 и 1. Хотя там всего один лист.
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
  Row := Jrn.ActiveCell.Row; // Значение последнего столбца
  Col := Jrn.ActiveCell.Column; // Значение последней строки
  if Jrn.Activesheet.Cells.Item[1, 1].Value = '' then // Если база пустая, ставим номер 1, и добавляем следом данные
  begin
    Jrn.Activesheet.Cells.Item[1, 1].Value := '1';
    Jrn.Activesheet.Cells.Item[Col, Row + 1].Value := Edit2.Text;
    Jrn.Activesheet.Cells.Item[Col, Row + 4].Value := Edit5.Text;
    if Checkbox1.Checked = True then Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Да'
    else Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Нет'
  end
  else
  begin
    Jrn.Activesheet.Cells.Item[Col, Row].Value := Jrn.Activesheet.Cells.Item[Col-1, 1] + 1; // по идее, должен прибавлять к предыдущему номеру +1, но что-то мне очень подсказывает, что оно не работает...
    Jrn.Activesheet.Cells.Item[Col, Row + 1].Value := Edit2.Text;
    Jrn.Activesheet.Cells.Item[Col, Row + 4].Value := Edit5.Text;
    if Checkbox1.Checked = True then Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Да'
    else Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Нет'
  end;


Такой вот код. Помогите пожалуйтса сделать его рабочим, диплом горит smile

Приложение - Как выглядит журнал

Журнал:
Код
-------------------------------------------------------------------------
| # | Дата | Пустое поле | Пустое поле | Краткое содержание | Исполнено |
|------------------------------------------------------------------------
| 1 | 2008 | ----------- | ----------- | О выполнении дел:) | Да        |
| 2 | 2008 | ----------- | ----------- | О невыполнении дел | Нет       |
-------------------------------------------------------------------------


БД:
Код
----------------------
| Данные01 | Текст01 |
| Данные02 | Текст02 |
| Данные03 | Текст03 |
| Данные04 | Текст04 |
----------------------

Автор: Albinos_x 20.6.2008, 21:45
Цитата(ReGeDiT @  20.6.2008,  20:57 Найти цитируемый пост)
Jrn.Activesheet.Cells.Item[Col, Row].Value := Jrn.Activesheet.Cells.Item[Col-1, 1] + 1; // по идее, должен прибавлять к предыдущему номеру +1,

хм... вообще не поянл чего у Вас не получается... но если здесь хотите делать нуменацию, то забуваете обращаться к .Value , т.е.
Код

Jrn.Activesheet.Cells.Item[Col, Row].Value := Jrn.Activesheet.Cells.Item[Col-1, 1].Value + 1;

Автор: ReGeDiT 20.6.2008, 22:14
Здесь очень жутко ругается
Код
Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[0];


Код
First chance exception at $7C812A7B. Exception class EOleException with message 'Неверный индекс'. Process Project1.exe (4092)


smile Оба варианта

Код
Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[1];


Код
First chance exception at $7C812A7B. Exception class EOleException with message 'Неверный индекс'. Process Project1.exe (2892)


Автор: ReGeDiT 21.6.2008, 13:32
камрады, не уж то, никто не знает? smile

Автор: ReGeDiT 21.6.2008, 15:36
Так, всё заработало, кроме одного момента smile

Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Jrn.Activesheet.Cells.Item[Col-5, 1].Value + 1;

сильно очень ругается на то, что не может перевести OleVariant String в Double

смысл в том, чтобы к предудещему номеру плюсовался ещё 1

1
2
3
4

и т.п., т.е. в первом столбце в последующих строках был номер на единицу больше...

как можно это реализовать?

Автор: ReGeDiT 22.6.2008, 13:34
ЛЮДИ! Ну неужели никто не знает?

Автор: Albinos_x 22.6.2008, 23:19
Цитата(ReGeDiT @  20.6.2008,  22:14 Найти цитируемый пост)
Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[0];

статью читали: http://forum.vingrad.ru/topic-84634.html ???
там я писал, что отчёт в экселе и в ворде начинается с 1, а не с 0.
Цитата(ReGeDiT @  21.6.2008,  15:36 Найти цитируемый пост)
Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Jrn.Activesheet.Cells.Item[Col-5, 1].Value + 1;

попробуй так:
Код

rn.Activesheet.Cells.Item[Col-4, 1].Value := Integer(Jrn.Activesheet.Cells.Item[Col-5, 1].Value) + 1;

Автор: ReGeDiT 22.6.2008, 23:57
Цитата(Albinos_x @ 23.6.2008,  00:19)
попробуй так:
Код
Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Integer(Jrn.Activesheet.Cells.Item[Col-5, 1].Value) + 1;

Код

Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Integer(Jrn.Activesheet.Cells.Item[Col-5, 1].Value) + 1;


First chance exception at $7C812A7B. Exception class EVariantTypeCastError with message 'Could not convert variant of type (String) into type (Double)'. Process Project1.exe (2272)

Автор: Albinos_x 15.7.2008, 22:16
хм... а на каком шаге вылетает ошибка ... т.е. чему равен Col...
второе - проверьте, не дописывает ли excel перед вставленными цифрами апостроф (символ  ' ), если так, то предварительно удалите из строки лишние символы, а потом переводите в целочисленное число

Автор: Данкинг 15.7.2008, 22:24
Цитата(ReGeDiT @  21.6.2008,  16:36 Найти цитируемый пост)
как можно это реализовать? 

Это можно реализовать с помощью обычной переменной, которую наращивать для каждой новой строки. Зачем извращаться таким образом, как в твоём примере? smile А если делать по-твоему, то понятно, что выдаётся ошибка, ты же к строковому типу пытаешься число добавить.


Автор: Albinos_x 15.7.2008, 22:43
Данкинг, я так понимаю, что это вообще в цикле делается... не могу понять почему не используют стандартный счётчик

Добавлено через 22 секунды
может там более хитрая задумка

Добавлено через 27 секунд
)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)