Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/67: Рейтинг темы: голосов - 67, средняя оценка - 4.76
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75

Работа с ячейкой OpenOffice Calc

30.08.2013, 18:50. Показов 13965. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу считать из файла .xls значение конкретной ячейки в элемент Memo. При этом, работать нужно не с Excel, а с Calc. Подскажите, как реализовать, если кто с этим сталкивался. В сети нашел примеры, которые открывают файл, но мне это не нужно. Про работу с ячейкой ничего не нашел
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.08.2013, 18:50
Ответы с готовыми решениями:

Открытие таблицы OpenOffice Calc
Хочу открыть таблицу, созданную под OpenOffice, считать от туда значение ячейки в элемент Memo. Я сделал это для таблицы, созданной в Excel...

LibreOffice calc Заменить часть ячейки другой ячейкой
Добрый день, мне нужна помощь. Есть большая таблица, нужно найти и заменить некоторые элементы, примерно как на скриншоте: ...

OpenOffice Calc и C#
Как создать эл. таблицу Как записать в какую-нибудь ячейку данные Делаю на MS VS 2005, ссылки на сборки добавил cli_*****.dll ...

22
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
30.08.2013, 22:57
Цитата Сообщение от СергейКРС Посмотреть сообщение
При этом, работать нужно не с Excel, а с Calc
Что за Calc?
0
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
31.08.2013, 07:25  [ТС]
openoffice calc - аналог microsoft office excel
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
31.08.2013, 14:03
СергейКРС, в чем проблема?

Delphi
1
2
3
4
5
6
7
8
9
10
var Sheet, Cell : Variant;
 
  // Как открыть или создать новый файл - тебе известно? Это будет Document...
  // Дальше получаем лист и ячейку, с которой надо работать:
 
  Sheet := Document.getSheets.getByIndex(0);
  Cell := Sheet.getCellByPosition(5, 2); // 5 столбец 2 строка
 
  Cell.Value := '100'; // Пишем в ячейку
  Edit1.Text := Cell.Value; // Или читаем из ячейки
2
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
31.08.2013, 14:43  [ТС]
Спасибо. Я не совсем понимаю, как именно открыть существующий файл Document.xls. Не подскажете, как это сделать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
31.08.2013, 15:23
Вот так, например (у меня OpenOffice 3.4.1, этот код только что отработал)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var
  OO : Variant;
 
function MakePropertyValue(PropName, PropValue:string):variant;
var Struct: variant;
begin
    Struct := OO.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
    Struct.Name := PropName;
    Struct.Value := PropValue;
    Result := Struct;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Document : Variant;
  Desktop: Variant;
  Sheet, Cell: Variant;
  vArr : Variant;
  FileName : string;
begin
  OO := CreateOleObject('com.sun.star.ServiceManager');
  Desktop := OO.createInstance('com.sun.star.frame.Desktop');
  FileName := 'D:\test\book1.xls';
 
  vArr := VarArrayCreate([0, 1], varVariant);
  vArr[0] := MakePropertyValue('FilterName', 'MS Excel 97');
  Document := Desktop.LoadComponentFromURL('file:///' + FileName, '_blank', 0, vArr);
 
  Sheet := Document.getSheets.getByIndex(0);
  Cell := Sheet.getCellByPosition(5, 2); // 5 столбец 2 строка
  Edit1.Text := Cell.Value;
end;
2
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.08.2013, 15:41
Цитата Сообщение от UI Посмотреть сообщение
Cell := Sheet.getCellByPosition(5, 2);
Небольшая поправка - здесь 6 столбец и 3 строка. В OpenOffice элементы коллекций индексируются, начиная с нуля.
0
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
31.08.2013, 15:56  [ТС]
У меня возникла одна сложность: если в ячейке записано не число, а строка, то в Edit1 возвращается 0. Как это можно устранить? И можно сделать так, чтобы не открывалось окно OpenOffice Calc? Спасибо.

Добавлено через 49 секунд
Да, я с этим уже разобрался. Спасибо

Добавлено через 1 минуту
Но вот с последними двумя вопросами нужна помощь
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.08.2013, 16:00
Цитата Сообщение от СергейКРС Посмотреть сообщение
У меня возникла одна сложность: если в ячейке записано не число, а строка, то в Edit1 возвращается 0. Как это можно устранить?
Вместо метода Value() следует вызвать String():
Delphi
1
Edit1.Text := Cell.String;
1
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
31.08.2013, 16:08  [ТС]
Не подскажете, как сделать так, чтобы при компиляции не открывалось окно OpenOffice Calc? Работа с программой должна идти так, чтобы ничего лишнего (в том числе окно OpenOffice Calc) не открывалось. Спасибо за помощь.
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.08.2013, 16:32
Это я с ходу не подскажу. Надо в объектной модели поискать...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
31.08.2013, 16:39
СергейКРС, измени строки 25-26 моего кода на:
Delphi
1
2
3
  vArr := VarArrayCreate([0, 2], varVariant);
  vArr[0] := MakePropertyValue('FilterName', 'MS Excel 97');
  vArr[1] := MakePropertyValue('Hidden', True);
, а заголовок MakePropertyValue перепиши вот так:

Delphi
1
2
function MakePropertyValue(PropName : string;
                           PropValue : Variant) : Variant;
Всё остальное - без изменений...
Цитата Сообщение от Mawrat Посмотреть сообщение
здесь 6 столбец и 3 строка. В OpenOffice элементы коллекций индексируются, начиная с нуля.
Ну, это само собой разумеется... Я и начинаю с нуля: нулевой, первый и второй
2
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
31.08.2013, 17:09  [ТС]
А я уже начал химичить с видимостью окон:
Delphi
1
2
ShowWindow(FindWindow(nil, 'C:\1.xls - OpenOffice Calc'), sw_show);
ShowWindow(FindWindow(nil, 'C:\1.xls - OpenOffice Calc'), sw_hide);
Спасибо.

Добавлено через 7 минут
Цитата Сообщение от UI Посмотреть сообщение
FileName := 'D:\test\book1.xls';
Можно что-нибудь прописать вместо этой строки, чтобы открывался файл, лежащий в одной папке с проектом? Чтобы можно было скинуть на другой ПК папку с проектом и не пришлось раскидывать файлы по папкам.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
31.08.2013, 17:15
Delphi
1
FileName := ExtractFilePath(Application.ExeName) + 'book1.xls';
1
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.08.2013, 17:57
Здесь ещё надо добавить команду выхода из приложения Calc. В отношении Excel это так делается:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
uses
  ComObj;
 
var
  exApp : Variant;
...
begin
...
  exApp := CreateOleObject('Excel.Application');
...
  exApp.Quit;
...
end;
Возможно, UI знает, как из Calc выйти.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
31.08.2013, 18:24
Delphi
1
2
  Document.Close(true);
  Document := Null;
закрывает Calc (как, впрочем, и любой другой компонент OO)
2
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
01.09.2013, 10:21  [ТС]
Столкнулся с еще одной сложностью: поиск значения ячейки в столбце. Не подскажете, как реализовать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
01.09.2013, 13:52
Что имеется в виду под "поиском"? Организация цикла по содержимому столбца, или вызов Find & Replace Dialog-а? Первое делается элементарно, второе - сложнее, где-то валялся у меня код, работающий с диалогами ОО, надо посмотреть...
0
 Аватар для СергейКРС
8 / 8 / 10
Регистрация: 03.03.2011
Сообщений: 75
01.09.2013, 15:25  [ТС]
Я хочу брать из одного столбца таблицы число, затем искать это число в другом столбце, а при нахождении - выводить нужные данные из найденной строки. Вот только мне не понятно, как правильно в цикле это организовать. О существовании некоторых команд я просто не догадываюсь. Грубо говоря, должно быть примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
...
procedure TForm1.FormCreate(Sender: TObject);
begin
f:=1;
end;
...
Cell1 := Sheet.getCellByPosition(5, f);    //тут хранится значение, которое будем искать
For i:=1 to RecCount-1 do          //i:=1, т.к. первая строка у меня пуста, а в ОО нумерация начинается с 0
  begin
    Cell2 := Sheet.getCellByPosition(0, i);   //в этом столбце будем искать искомое значение
    If Cell2=Cell1 then f:=[U]№ строки[/U] ([B]как определить № строки - не знаю[/B])
  end;
В процессе работы я буду нажимать на кнопку несколько раз и с каждым нажатием должен производиться новый поиск и переход все ниже и ниже по строкам. Из ячеек, которые лежат в одной строке с найденной ячейкой я буду вытаскивать разные данные. Чтобы было немного понятнее, прилагаю таблицу, с которой работаю.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
02.09.2013, 18:17
СергейКРС, смотри:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
var
  ControlCell : Variant;
  Cell2 : Variant;
  i : Integer;
begin
  ControlCell := Sheet.getCellByPosition(5, f);
  i := 0;
  repeat
    inc(i);
    Cell2 := Sheet.getCellByPosition(0, i);
  until (i = RecCount) or (Cell2.String = ControlCell.String);
  // тут можешь проверять, найдено ли что-то. Если i = RecCount, то ничего не найдено...
 
  F := i;
  ControlCell := Sheet.getCellByPosition(5, f);
  Document.CurrentController.Select(ControlCell);
end;
Понажимай кнопку несколько раз. Это надо было?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2013, 18:17
Помогаю со студенческими работами здесь

Прокрутка в OpenOffice Calc
В программе OpenOffice Calc очень неудобно реализована прокрутка страницы (листа). Можно ли сделать ее плавной?

Отчет на OpenOffice Calc
Дайте пожалуста рабочий пример открытия файла XLS или ODS редактирования нескольких ячеек и сохранение под другим именем. или...

Автоматизация в OpenOffice.org.Calc
Довброе время суток всем участникам форума! Обращаюсь к Вам с прозбой помочь в написании макроса. Суть макроса в том что он должен...

Макрос для OpenOffice Calc
Ситуация такая например есть строка: товар (его качества) Цена. Необходимо все что в скобках перенести в другую ячейку ну и скобки удалить....

Запись данных в OpenOffice.Calc 4.1.1
Всем привет,кто знает как связать C# и OpenOffice Calc? Мне нужно с программы отправить туда данные в определенные ячейки и сохранить файл,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru