Про Excel, Word...

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
или создание плагина вообще?
создание вообще. пробовал по ссылке, но то ли гранаты (клиент) у меня не той системы (версии, 9.0.1), то ли англицкий язык не родной...
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
340
создание вообще. пробовал по ссылке, но то ли гранаты (клиент) у меня не той системы (версии, 9.0.1), то ли англицкий язык не родной...
Для начала попробуйте это:
1. Настроить среду разработки
rcp.base_version для версии вашего клиента можно посмотреть в файле framework/rcp/rcplauncher.properties. В этом файле в свойстве rcp.base.location указан путь, который должен получиться в последней сторке п.2 (VM arguments) -Xbootclasspath/a:${rcp.home}\rcp\eclipse\plugins\com.ibm.rcp.base_${rcp.base_version}\rcpbootcp.jar;
2. Создать мастером простой пример "Hello, World"
3. Запустить этот пример в Lotus Notes (если правильно выполнен п.1, то должно получится);
4. Исправить сгенерённый мастером код по своему вкусу.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
очередной опус... ;)
заморочился я слезть в вордового движка (код ~10летней давности)
похотелки:
-получение списка спец тегов из ворд файла (это типа будущие поля)
-замена тегов на инфу из источника
-получение ПДФ

кандидат на такой шаблонизатор - xdocreport
по первому пункту я не нашел варианта в движке, но можно тупо воспользоваться POI (пример поиска)
второй пункт реализован полностью
а вот с третьим есть нюансы ;):
-POI там "не достаточно" (в версии xdocreport 1.0.6 - последняя на тек. момент ) и т.е. в POI урезана либа со "схемами". Качал
-саму сборку делал через... maven, версии 3 (такая в репах, на убунте). Первый тык в нос - отсут. переменная M2_HOME (веренее - она у мя указывала в никуда, версии 2 уже не было), а добавление M3_HOME действия не возымело. И да, собирать пришлось - ибо ссылки на бинарники не рабочие (спасибо гуглу, с его убиением проектов, сцумкидраные)
-я не мудрил с опциями мавена - ну влом было - просто собрал все (хотя и не нужно было). Либы, кот. пригодятся для конвертации
ooxml-schemas-1.1.jar
org.apache.poi.xwpf.converter.core-1.0.6-SNAPSHOT.jar
org.apache.poi.xwpf.converter.pdf-1.0.6-SNAPSHOT.jar
org.apache.poi.xwpf.converter.pdf.itext5-1.0.6-SNAPSHOT.jar
org.apache.poi.xwpf.converter.xhtml-1.0.6-SNAPSHOT.jar

еще используются commons-codec и commons-logging (в описании проекта встречается или ошибки в консоли java ;) )
либы от самого xdocreport
fr.opensagres.xdocreport.converter-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.converter.docx.docx4j-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.converter.docx.xwpf-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.converter.fop-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.converter.fop.docx-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.core-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.document-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.document.docx-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.itext.extension-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.itext5.extension-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.template-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.template.freemarker-1.0.6-SNAPSHOT.jar
fr.opensagres.xdocreport.template.velocity-1.0.6-SNAPSHOT.jar

разумеется, что velocity и POI должны быть установлены (jvm/lib/ext)​
-сесуриту - класслоадерами играются в либе и потому - надо править, запись в java.policy, в секции grant
permission java.lang.RuntimePermission "setContextClassLoader";

используется ли ФОП или нет - не смотрел (он может использоваться, но не во всех кэйсах), а вот itext - используется. И потому - установить надо и его, у меня он 2.1.7 при использовании учитывайте лицензию
по полученному результату:
более-менее совпадает оформление дока (а оно на наших доках очень коряво сделано)
-второй уровень idention не работает правильно (решения не искал). Табуляция не работает правильно
ниже картинки
*д.б.
convert-docx.png

*получили
convert-pdf.png

**д.б.
convert-docx1.png

**получили
convert-pdf1.png

-с таблицами, некоторыми (опять не искал причин) херотень
*д.б.
convert-docx2.png

*получили
convert-pdf2.png

**д.б.
convert-docx3.png

**получили
convert-pdf3.png
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
код
Java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import fr.opensagres.xdocreport.converter.ConverterTypeTo;
import fr.opensagres.xdocreport.converter.ConverterTypeVia;
import fr.opensagres.xdocreport.converter.Options;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
//import fr.opensagres.xdocreport.samples.docxandvelocity.model.Project;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
 
public class DocxProjectWithVelocity2PDF {
 
	public static void main(String[] args) {
		try {
			// 1) Load Docx file by filling Velocity template engine and cache
			// it to the registry
			InputStream in = DocxProjectWithVelocity2PDF.class
					.getResourceAsStream("ADD1_Приложение об услугах_.docx");
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(
					in, TemplateEngineKind.Velocity);
 
			// 2) Create context Java model
			IContext context = report.createContext();
			class Project{
				String name="";
				public Project(String s){name=s;}
				public String getName(){return name;}
			}
			Project project = new Project("XDocReport");
			context.put("comments", project);
			context.put( "comments", "aaa\tbbb\nccc\n\nddd\n\teeee\n\t\tfff\n\nggg\t\thhh" );
 
			// 3) Generate report by merging Java model with the Docx
			OutputStream out = new FileOutputStream(new File(
					"DocxProjectWithVelocity_Out.pdf"));
			// report.process(context, out);
			System.out.println("Genarate");
			Options options = Options.getTo(ConverterTypeTo.PDF).via(
					ConverterTypeVia.XWPF);
			System.out.println("Convert");
			report.convert(context, options, out);
			System.out.println("Done");
 
		} catch (IOException e) {
			e.printStackTrace();
		} catch (XDocReportException e) {
			e.printStackTrace();
		}
	}
}
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
небольшое пояснение к картинкам, там скрины вода и пдф отображалки, на вордовых поставлено отображение непечатных символов - чтобы "понимать" (или пытаться) причину различий
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
"иногда" возникает вопрос - как записать в Excel файл данные в формате даты ;)
т.к. речь идет о POI для него и метод
для java , а вот из LS, через LS2J "сложнее"
ниже по коду:
инициализация

Set me.CALENDAR=jSession.GetClass(CALENDAR_CLASS)
Set me.dateObj=me.CALENDAR.Createobject()
...
Set me.cellStyle = me.wb.createCellStyle()
Set me.createHelper = me.wb.getCreationHelper()
Call me.cellStyle.setDataFormat(me.createHelper.createDataFormat().getFormat(CS_DATEFORMAT))
блок заполнения ячеек
...
Call me.dateObj.set(Year(xVal),Month(xVal),Day(xVal))
Call cell.setCellValue(me.dateObj.getTime())
Call cell.setCellStyle(me.cellStyle)
Код:
Const HSSFCELL_CLASS={org/apache/poi/hssf/usermodel/HSSFCell}
Const CELLREF_CLASS={org/apache/poi/ss/util/CellReference}
Const SXSSFWORKBOOK_CLASS={org/apache/poi/xssf/streaming/SXSSFWorkbook}
Const SSCELL={org/apache/poi/ss/usermodel/Cell}
Const SSROW={org/apache/poi/ss/usermodel/Row}
Const SSSHEET={org/apache/poi/ss/usermodel/Sheet}
Const SSWORKBOOK={org/apache/poi/ss/usermodel/Workbook}
Const CALENDAR_CLASS={java/util/GregorianCalendar}'{java/util/Calendar}
Код:
Class ReportExcel As ReportObj
    Private SXSSFWorkBook As Javaclass
    Private CALENDAR As Javaclass
    Private cellStyle As Javaobject
    Private createHelper As Javaobject
    Private dateObj As Javaobject
    Private wb As Javaobject
    Private sh As Javaobject
    Private FileOS As Javaclass
    Private FileOSObj As Javaobject
    'Private bosClass As JavaClass
    'Private bos As Javaobject
    Private bClosed As Boolean
    Private sPath As String
    %REM
    *--------------------------------------------
        Sub New
        Description: Comments for Sub
    %END REM
    Sub New(sPath As String)
        Dim routineName As String
        routineName="New"
        On Error GoTo ErrH
    'your code here
        Set me.CALENDAR=jSession.GetClass(CALENDAR_CLASS)
        Set me.dateObj=me.CALENDAR.Createobject()
        Set FileOS = jSession.GetClass(FILEOUTPUTSTREAM_CLASS)
        Set FileOSObj= FileOS.CreateObject({(Ljava/lang/String;)V}, sPath)
'        Set me.bosClass=jsession.Getclass(BUFFEREDOUTPUTSTREAM_CLASS)
'        Dim s As String
'        s={(L} & OUTPUTSTREAM_CLASS & {;)V}
'        Print {output stream class>}s
'        Set me.bos=me.bosClass.Createobject(s,me.FileOSObj)
        Set me.SXSSFWorkBook = jSession.GetClass(SXSSFWORKBOOK_CLASS)
        'keep 100 rows In memory, exceeding rows will be flushed To disk
        Set me.wb = me.SXSSFWorkBook.CreateObject()'("(I)V", SXSSF_BUF)
        Set me.cellStyle = me.wb.createCellStyle()
        Set me.createHelper = me.wb.getCreationHelper()
        Call me.cellStyle.setDataFormat(me.createHelper.createDataFormat().getFormat(CS_DATEFORMAT))

        wb.setCompressTempFiles(True)
        Set me.sh=me.wb.createSheet()
        sh.setRandomAccessWindowSize(SXSSF_BUF)
        me.sPath=sPath
    Quit:
        Exit Sub
    ErrH:
        Error Err, RaiseError
        Resume Quit
    End Sub
Код:
        Dim row As Javaobject
        Set row=me.sh.createRow(me.crow)
        Dim i As Integer
        ForAll col In xRow.Columns
            Dim v
            v=col
            If DataType(col)=V_VARIANT Then v=Join(col,VAL_SEP)
            Call Me.newCellValue(row,v,i)
            i=i+1
        End ForAll
Код:
    Function newCellValue(row,xVal,ccol)
        Dim routineName As String
        routineName="newCellValue"
        On Error GoTo ErrH
        'your code here
        Dim cell As Javaobject
        Set cell=row.createCell(ccol)
        Dim celltype
        celltype=cell.CELL_TYPE_STRING
        'Print {DataType>} TypeName(xVal)
        If IsNumeric(xVal) Then celltype=cell.CELL_TYPE_NUMERIC
        If IsDate(xVal) Then
            'Dim dt As New NotesDateTime({})
            'dt.Lslocaltime=xVal
            Call me.dateObj.set(Year(xVal),Month(xVal),Day(xVal))
            Call cell.setCellValue(me.dateObj.getTime())
            Call cell.setCellStyle(me.cellStyle)
        Else
            If Not IsEmpty(xVal) Then
                Call cell.setCellType(celltype)
                Call cell.setCellValue(xVal)
            End If
        End If
        'Print {Cell type>} celltype
        newCellValue=xVal
Quit:
        Exit Function
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Function
 
Последнее редактирование:
  • Нравится
Реакции: batu5ai

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
ошибка закралась ;)
Call me.dateObj.set(Year(xVal),Month(xVal),Day(xVal))
д.б. Call me.dateObj.set(Year(xVal),Month(xVal)-1,Day(xVal))
потому как по докам - эта ф-ция принимает месяц 0-based
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
про POI примеры и объяснения
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
библиотека получения из Excel в объекты java ozlerhakan/poiji
есть модель Consumer для "объемных" данных
 
K

Kamapaky

Отвечу сам себе... Все варианты решения из интернета не срабатывали.
Посмотрел, что заставляет тормозить excel при открытии файла через Process Monitor - там было огромное количество обращений к драйверу принтера. Удалил принтер и все стало летать. Пока, конечно, это временное решение.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
Отвечу сам себе... Все варианты решения из интернета не срабатывали.
Посмотрел, что заставляет тормозить excel при открытии файла через Process Monitor - там было огромное количество обращений к драйверу принтера. Удалил принтер и все стало летать. Пока, конечно, это временное решение.
к чему этот ответ?
эта тема в разделе LS2J java, а решения, как понимаю, КОМ в винде
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
231
@lmike
Есть ли какой-то простой вариант вставить содержимое вордового документа в RTF, по аналогии с NotesUIDocument.Import?
И как вообще это сейчас делается, через DXL?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
@lmike
Есть ли какой-то простой вариант вставить содержимое вордового документа в RTF, по аналогии с NotesUIDocument.Import?
И как вообще это сейчас делается, через DXL?
вариантов несколько...
смотря что назвать содержимым ;)
Если есть текст в виде хтмл - делаем майм и вставляем в РТ
получить без ворда, более-менее адекватный по верстке - aspose
онже (aspose) может и , но не нотусевый ;) ...
без верстки есть антиворд
это очень простые методы, на мой взгляд (менее 100 строк кода, основными из кот. будут - возня с майм)
еще с маймом может вот помочь +
 
Последнее редактирование:
  • Нравится
Реакции: VladSh

garrick

Lotus Team
26.10.2009
1 367
152
BIT
340
Хозяйке на заметку (может быть уже баян, но сам недавно обнаружил)
 
  • Нравится
Реакции: alexas1

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
Хозяйке на заметку (может быть уже баян, но сам недавно обнаружил)
"не-не-не, Дэвид Блэйн, не хотим" ;)
поставить МСО чтиобы у него вызывать ЖС, который можно использовать ток через... (ну сами понимаете)
видел я это СриптЛаб "в гробе, у белых тапках"
там целый паровоз херни кот. надо заюзать перед тем как ч-л получишь
уж лучше гугл дергать, там хоть всё прозрачно и изначально на ЖС
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 980
611
BIT
427
щас коротко обскажу, позже "разверну"

Основные "затыки" при решении задач импорта/экспорта:
- "ограниченность" библиотек - это когда не всё можно бесшовно встроить в домину
- ограниченность jvm - увы , но до сих пор (учитывая переход на OpenJDK) платформа сильно отстаёт от развития jvm и это при том, что сама jvm развивается очень медленно
- утечки - это бич платформы и течёт она не только на вызовах jvm ;). Упавшая жвм "спокойно" уносит с собой сервер
- "дурные" привычки некоторых разработчиков "хвататься" за КОМ - надо чётко осознавать последствия таких решений и жаль - когда этого не происходит. Современные средства достаточно богаты для решения задач без КОМ

Вариант к которому я всё больше склоняюсь - интеграция
В чём суть - отправка запросов на обработку внешнему сервису и получение результата
В век виртуализации и контейнеров - вполне логичный шаг, конгломерат под названием домино превратился в кучку устаревшего хлама (по устройству сервисам библиотекам и подходам), да, в настоящее время ХЦЛ пытается это нивелировать, да - мы ждем В12 (а я лично еще и keep) НО - это будут надстройки в виде отдельных сервисов над движком БД типа key->value с RBAC (что на сегодняшний день, ещё актуально)

варианты: сервера интеграции (например Camel)

Что решается сложно/убого:
- РТ... для меня до сих пор "загадка" наличие такого архаизма в платформе, майм был бы более логичным, но... нет. Проблема - получить соответствующее отображение при выводе, да - создали неких экспорт в ПДФ, но про управляемость этого процесса я пока ничего не знаю
- сериализация/десериализация документов, она есть в ХМЛ, но есть нюансы, и нет простого/быстрого варианта для json (опять платформа отстаёт "на века")
 
  • Нравится
Реакции: Vertigo
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!