Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Табличный документ на OWC.Spreadsheet (число прочтений - 5679 )
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Табличный документ на OWC.Spreadsheet
26. Марта 2008 :: 17:21
Печать  
Хочу обсудить возможность и нужность создания табличных документов в 1с при помощи компонент OWC.
Во вложении класс ТабличныйДокументЕксель и пример его использования.

Процитирую часть кода тут:
Код
Выбрать все
Процедура ПослеОткрытия()
	Таб=лФорма.СоздатьЭлементУправления("ТабличныйДокументЕксель","ФТаблица");
	Т=СоздатьОбъект("Таблица");
	Т.ИсходнаяТаблица("МакетОтчета");
	Т.ВывестиСекцию("Шапка");
	Таб.Инициализация(Т);
КонецПроцедуры

Процедура Сформировать()
	Параметры=СоздатьОбъект("Структура");
	Параметры.Вставить("Номер");
	Параметры.Вставить("Наименование");
	Параметры.Вставить("Количество");
	Для Сч=1 По 1000 Цикл
		Параметры.Номер=Сч;
		Параметры.Наименование="товар"+Сч;
		Параметры.Количество=14;
		Таб.ВывестиСекцию("Строка",Параметры);
	КонецЦикла;
	Таб.Показать();
КонецПроцедуры 


Плюсы:
  • Использование очень похоже на использование стандартного объекта "Таблица"
  • Макет отчета - стандартная 1с-вская таблица и редактируется штатными способами (формат ячеек в текущей реализации в OWC не передается, но такая возможность есть)
  • OWC.Spreadsheet может прятать/показывать строки/столбцы. Следовательно есть возможность организовать группировку строк и столбцов в таблицах a-la v8

Из минусов, пожалуй, только тормознутость - на 1000 строк ~1200мс против ~250мс такой-же отчет на мокселе.

Внимание, вопрос:
стоит ли возможность группировки строк потерь в производительности.
Или лучше эту технологию сдать в кунсткамеру.
  

OWCSpreadsheet.rar ( 5 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #1 - 26. Марта 2008 :: 17:22
Печать  
вот как это выглядит:
  

OWCSpreadsheet_screen.JPG ( 52 KB | Загрузки )
OWCSpreadsheet_screen.JPG

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Табличный документ на OWC.Spreadsheet
Ответ #2 - 26. Марта 2008 :: 18:01
Печать  
Степ, надо оптимизировать вывод строки
Код
Выбрать все
Секция=ТаблицаШаблон.ПолучитьСекцию(ИмяСекции);
 


Занимает 60% времени.
Я где-то в курилке тему создавал, как быстро выводить секции в таблицу.


Вот чего мне всегда не хватало - это формул в табличных документах.
Несколько раз думал о OWC11, но руки не дошли.
Ну, не знаю, может быть Uzhast когда-нибудь это в Yoksel добавит.

А через xml можно формулы для диапазонов задавать?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #3 - 26. Марта 2008 :: 18:16
Печать  
kms писал(а) 26. Марта 2008 :: 18:01:
Я где-то в курилке тему создавал, как быстро выводить секции в таблицу.

Ты вот это имеешь в виду?
ОК. Ща затарюсь пивом и попробую.

kms писал(а) 26. Марта 2008 :: 18:01:
А через xml можно формулы для диапазонов задавать?

можно.
Можно объявлять именованные области, стили ячеек хранить отдельно от данных ячеек и еще много всего можно.

kms писал(а) 26. Марта 2008 :: 18:01:
Вот чего мне всегда не хватало - это формул в табличных документах.

аналогично Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #4 - 26. Марта 2008 :: 18:55
Печать  
steban писал(а) 26. Марта 2008 :: 17:21:
Хочу обсудить возможность и нужность создания табличных документов в 1с при помощи компонент OWC.

Я в вопросах замены мокселя не объективен, так что имей это в виду  Смех Для того, чтобы твое решение можно было реально использовать надо решить множество разных проблем. Например, вопрос с форматированием. Тут тебе либо придется самому писать конвертер из Мокселя, либо использовать существующий конвертер. Стандартный конвертер из Мокселя в Эксель не подойдет из-за огромной кривизны. Значит, придется либо встроить в класс код из существующих обработок конвертации mxl2xl (очень медлено), либо взять сторонний готовый конвертер - например, Йоксель. Улыбка Но здесь нужно учесть, что в следующей версии Йокселя группировка строк и столбцов будет уже встроена.

Даже если решить проблемы с форматированием, возникнут другие проблемы. Например, у Excel форматирование отличается от такового в Мокселе. Например, различия есть в форматировании текста с переносами строки и в расчете высоты строки. Плюс выравнивание по выделенным ячейкам. Плюс ориентация текста не так обрабатывается. Ну и с внедренными объектами есть определенные заморочки. Например, некоторое форматирование внедренных объектов в Excel в принципе нельзя сохранить.

Ну и всякие мелочи типа расшифровок и печати тоже вполне смогут отравить жизнь Улыбка Так что, до готового решения, ИМХО, еще очень далеко.
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #5 - 26. Марта 2008 :: 19:35
Печать  
Uzhast писал(а) 26. Марта 2008 :: 18:55:
Например, вопрос с форматированием. Тут тебе либо придется самому писать конвертер из Мокселя, либо использовать существующий конвертер.

с учетом специфики задачи (а именно необходимостью заполнить таблицу стилей до вывода строк) можно написать свой.

Uzhast писал(а) 26. Марта 2008 :: 18:55:
в следующей версии Йокселя группировка строк и столбцов будет уже встроена.

а когда она выйдет?

Uzhast писал(а) 26. Марта 2008 :: 18:55:
Даже если решить проблемы с форматированием, возникнут другие проблемы. Например, у Excel форматирование отличается от такового в Мокселе. Например, различия есть в форматировании текста с переносами строки и в расчете высоты строки. Плюс выравнивание по выделенным ячейкам. Плюс ориентация текста не так обрабатывается.

Я и не рассчитываю что удастся сделать 100% совместимость с мокселем.

Uzhast писал(а) 26. Марта 2008 :: 18:55:
Ну и с внедренными объектами есть определенные заморочки

Внедренные объекты поддерживаться не будут из-за ограничений формата XMLSS.

Uzhast писал(а) 26. Марта 2008 :: 18:55:
Ну и всякие мелочи типа расшифровок и печати тоже вполне смогут отравить жизнь Улыбка

Печать решается через Excel. Он хавает XMLSS как родной.
По расшифровкам поясни, плиз.

Uzhast писал(а) 26. Марта 2008 :: 18:55:
Так что, до готового решения, ИМХО, еще очень далеко.

А никто и не говорит, что это "решение" Подмигивание. Это - драфт.
« Последняя редакция: 13. Апреля 2008 :: 21:19 - steban »  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #6 - 26. Марта 2008 :: 19:42
Печать  
steban писал(а) 26. Марта 2008 :: 19:35:
Uzhast писал(а) 26. Марта 2008 :: 18:55:
Например, вопрос с форматированием. Тут тебе либо придется самому писать конвертер из Мокселя, либо использовать существующий конвертер.

с учетом специфики задачи (а именно необходимостью заполнить таблицу стилей до вывода строк) можно написать свой.

Это только начало Улыбка

steban писал(а) 26. Марта 2008 :: 19:35:
Uzhast писал(а) 26. Марта 2008 :: 18:55:
в следующей версии Йокселя группировка строк и столбцов будет уже встроена.

а когда она выйдет?

Спрятывание/отображение диапазона строк/колонок я могу выпустить хоть завтра. Но хотелось бы сделать как в В8 с отображением структуры (плюсики, минусики, все дела...) Но если надо, могу сделать пререлиз только с управлением видимостью строк и колонок.

steban писал(а) 26. Марта 2008 :: 19:35:
Я и не рассчитываю что удастся сделать 100% совместимость с мокселем.

Значит, Моксель в очень небольшой степени можно будет использовать как систему подготовки макета.

steban писал(а) 26. Марта 2008 :: 19:35:
Uzhast писал(а) 26. Марта 2008 :: 18:55:
Ну и с внедренными объектами есть определенные заморочки

Внедренные объекты поддерживаться не будут из-за ограничений формата MSOXML.

А, кстати, с диаграммами та же фигня?

steban писал(а) 26. Марта 2008 :: 19:35:
Uzhast писал(а) 26. Марта 2008 :: 18:55:
Ну и всякие мелочи типа расшифровок и печати тоже вполне смогут отравить жизнь Улыбка

Печать решается через Excel. Он хавает MSOXML как родной.
По расшифровкам поясни, плиз.

Расшифровка - обычное агрегатное значение 1С (справочник, документ, список значений), которое открывается по двойному клику или передается в событие "ОбработкаЯчейкиТаблицы" Улыбка

steban писал(а) 26. Марта 2008 :: 19:35:
Uzhast писал(а) 26. Марта 2008 :: 18:55:
Так что, до готового решения, ИМХО, еще очень далеко.

А никто и не говорит, что это "решение" Подмигивание. Это - драфт.

Очень "черновой" драфт Улыбка
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #7 - 26. Марта 2008 :: 19:50
Печать  
Uzhast писал(а) 26. Марта 2008 :: 19:42:
steban писал(а) 26. Марта 2008 :: 19:35:
Uzhast писал(а) 26. Марта 2008 :: 18:55:
Ну и с внедренными объектами есть определенные заморочки

Внедренные объекты поддерживаться не будут из-за ограничений формата MSOXML.

А, кстати, с диаграммами та же фигня?

Внедренные объекты не поддерживаются никакие.

Uzhast писал(а) 26. Марта 2008 :: 19:42:
Расшифровка - обычное агрегатное значение 1С (справочник, документ, список значений), которое открывается по двойному клику или передается в событие "ОбработкаЯчейкиТаблицы" Улыбка

Гы. А я и не знал Подмигивание. Решаемо.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #8 - 13. Апреля 2008 :: 21:01
Печать  
Удалось добиться быстрой генерации XMLSS-файла.
Чуть медленнее мокселя, но меньше или сравнимо с временем загрузки XMLSS-файла компонентом OWC.Spreadsheet.
Написал на досуге компонент, объектная модель которого частично повторяет схему XMLSS и частично повторяет объектную модель Excel. Умеет загружать файл XMLSS во внутреннее представление, выполнять некоторые манипуляции с ячейками, копировать прямоугольные области с подстановкой заданных значений вместо шаблонных строк и сохранять в файл XMLSS.
Подробно описывать объектную модель не буду. Приведу часть диаграммы классов:
  

ClassDiagram2.gif ( 61 KB | Загрузки )
ClassDiagram2.gif

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #9 - 13. Апреля 2008 :: 21:10
Печать  
Рецепт приготовления отчетов такой:
- готовим шаблон в Excel и сохраняем его как XML-Spreadsheet ("Таблица XML" в русской версии офиса)
- пишем код, который выбирает данные отчета, загружает шаблон и путем копирования прямоугольных областей шаблона в новый лист заполняет выходную таблицу.
- лист с шаблоном потом можно удалить
- сохраняем полученный отчет в XMLSS-файл
- натравливаем на этот файл OWC.Spreadsheet

во вложении сама библиотечка и пример использования.
перед использованием нужно выполнить
Код
Выбрать все
regasm /tlb xmlss.dll 


нужен Microsoft .NET Framework 2.0
  

XMLSSTableDoc.rar ( 15 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #10 - 13. Апреля 2008 :: 21:13
Печать  
steban писал(а) 13. Апреля 2008 :: 21:10:
путем копирования прямоугольных областей шаблона в новый лист заполняет выходную таблицу

Это можно обернуть в КОП и предоставить прикладному прогеру интерфейс с методами ВывестиСекцию и ПрисоединитьСекцию.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #11 - 16. Апреля 2008 :: 12:44
Печать  
Блин.
Я изобрел велик Печаль
http://www.codeproject.com/KB/office/excelxmllibrary.aspx
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #12 - 16. Апреля 2008 :: 13:27
Печать  
а если такая штуковина:
Код
Выбрать все
regasm /tlb xmlss.dll  


у меня не прокатывает ("не найден файл", видно про regasm идёт речь). что делать?  Смущённый
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Табличный документ на OWC.Spreadsheet
Ответ #13 - 16. Апреля 2008 :: 13:41
Печать  
Код
Выбрать все
%SystemRoot%\Microsoft.NET\Framework\Версия\regasm /tlb xmlss.dll 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать