Выгрузить представление в word

Ruska132

Well-known member
21.01.2015
66
0
#1
Добрый день Уважаемые.
Подскажите ПЖ а может будет даже пример.
Есть представление его надо вывести в Word с выбором периода.

Подскажите ПЖ.
 

Ruska132

Well-known member
21.01.2015
66
0
#7
Ctrl-A, Edit -> Copy Selected As Table
Ctl-V где оно надо
ограничение будет по большим вьюшкам
Данные вариант так же не подходить. мне надо кнопку в представлении "Выгрузить" - затем запрос периода. открыть шаблон и заполнить его данными с представления удовлетворяющими периода.
 

savl

Lotus team
28.10.2011
2 136
105
#8
@Ruska132, тогда надо программировать.
Если есть шаблон, то там можно сделать вычисляемые поля с алиасами (
Для просмотра контента необходимо: Войти или зарегистрироваться
).
В лотусе делается агент, который собирает данные и заполняет некую структуру.
Затем эта структура переносится в шаблон.
Тот же принцип, что и с excel, только вместо обращения к ячейке идет обращение к вычисляемому полю.
Примерно так:
Код:
wdoc.formfields(ListTag(dt)).Range.Text = "" & dt
тут dt список, тэг списка - имя вычисляемого поля в ворде, а значение - значение =)
Можно хоть класс, хоть тип сделать, не важно, главное принцип.
Это на LS естественно, через COM.

Наверняка есть решения и на java, но я не искал.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 598
275
#9
здесь выкладывал БД, кот. берет вьюшку и выгружает Excel файл, причем описание (что и откуда) задается доком настроек
НО код достаточно увесистый (и не причесанный), требует POI
есть вариант от @garrick - плагин
выше ссылка на готовую БД для jasperreport (@oshmianski), как поставить jasper и его настроить - там же в ветке
[DOUBLEPOST=1458124324,1458124273][/DOUBLEPOST]джаспер грузит во чтохошь
 

garrick

Lotus team
26.10.2009
910
61
#10
Вариантов "выплюнуть" содержимое базы Lotus Notes в какой-нибудь файл есть огромное множество. Вам этот Word потом править или распечатывать? Если распечатывать, то количество вариантов сильно увеличивается, Word при этом, соответственно, выбрасываем совсем.
  1. Нарисовать диалоговое окошко с запросом парметоров;
  2. Создать вьюху, которая умеет отбирать из базы документы по указанным параметрам;
  3. Заполняем шаблон данными (не обязательно Word'овый, в зависимости от того, что вам надо в конечном итоге)
  4. Отдаём что получилось пользователю.
По поводу технологии заполнения шаблона есть масса вариантов, но надо точно понимать нужен ли вам именно Word. Если Word обязательно, то через OLE на VBA или в RTF через какой-нибудь шаблонизатор или через XML/XSL Transformer.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 598
275
#11
небольшой ОФФ
замена текста в ворде (docx) http://stackoverflow.com/questions/22268898/replacing-a-text-in-apache-poi-xwpf/22269035#22269035
код агента и либа (написано на коленке и "грязно")
Java:
import lotus.domino.*;
 
public class JavaAgent extends AgentBase {
 
	public void NotesMain() {
 
	  try {
		  Session session = getSession();
		  AgentContext agentContext = session.getAgentContext();
		  // (Your code goes here)
		  String[] arrFrom= {"<SPA_POSITION>","<SPA_WHOM>"}, arrTo= {"Генерал","Кузнецов"};
		  String path="C:/Documents and Settings/mikelocal/Local Settings/Temp/notesD6014A/";
		  String fnameIN=path+"ADD18_.docx";
		  String fnameOUT=path+"output.docx";
		  //XWPFTest.Test(fnameIN, fnameOUT);
		  XWPFUtils.replaceFromArray(arrFrom, arrTo, fnameIN, fnameOUT);
	  } catch(Exception e) {
		  e.printStackTrace();
	   }
   }
}
Java:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
//http://stackoverflow.com/questions/22268898/replacing-a-text-in-apache-poi-xwpf
public class XWPFUtils {
	public static void replaceFromArray(String []arrFrom, String[] arrTo, String fnameIN, String fnameOUT) {
		XWPFDocument doc=null;
		try {
			doc = new XWPFDocument(OPCPackage.open(fnameIN));
		} catch (InvalidFormatException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		for (XWPFParagraph p : doc.getParagraphs()) {
			List<XWPFRun> runs = p.getRuns();
			if (runs != null) {
				for (XWPFRun r : runs) {
					paragraphReplace(arrFrom,arrTo,r);
				}
			}
			for (XWPFTable tbl : doc.getTables()) {
				for (XWPFTableRow row : tbl.getRows()) {
					for (XWPFTableCell cell : row.getTableCells()) {
						for (XWPFParagraph p1 : cell.getParagraphs()) {
							for (XWPFRun r : p1.getRuns()) {
								paragraphReplace(arrFrom,arrTo,r);
							}
						}
					}
				}
			}
		}
		try {
			doc.write(new FileOutputStream(fnameOUT));
			System.out.println("Done");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			/*				if (pkg!=null)
				try {
					pkg.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			 */			}
 
	}
	private static void paragraphReplace( String[] arrFrom, String[] arrTo, XWPFRun r) {
		String text = r.getText(0);
		if (text != null) {
			for(int i=0; i<arrFrom.length;i++) {
				if (text.contains(arrFrom[i])) {
					text = text.replace(arrFrom[i], arrTo[i]);
					System.out.println("Replacement:"+arrFrom[i]+"|"+arrTo[i]);
					r.setText(text, 0);
				}
			}
		}
	}
}
[DOUBLEPOST=1458146019,1458145731][/DOUBLEPOST]подразумевается что в "нормальном" варианте д.б. не массив, а ArrayList или HashMap (зависит от задачи)
POI 3.14 (символичный релиз ;) )
 

garrick

Lotus team
26.10.2009
910
61
#12
Тут как-то возникла проблема - надо было вставить поля в header или footer (уж и не помню куда точно). Сам Word умеет встявлять туда свои поля, например номер страницы, но не позволяет вставлять пользовательские поля. Или не текущая на тот момент версия не позволяла, но в общем никак не получалось. В результате безуспешной борьбы с этим безобразием было найдено решение, которое в принципе можно использовать для заполнения всего документа не задействовав при этом сам Word.
  1. В Word'e готовится шаблон документа с полями, у которых должно быть заполнено свойство "Текст по умолчанию" значением типа $name;
  2. Сохраняем шаблон в формате RTF;
  3. Открываем в простом текстовом редакторе типа notepad (я предаочитаю Notepad++), доавляем аналогичный текст в "труднодоступные места";
  4. При формировании документа, заполняем RTF файл данными с помощью Apache Velocity (можно импользовать любой "шаблонизатор", заменив $name на нотацию наименования полей вашего шаблонизатора);
  5. Открываем готовый документ в Word'е и делаем довольное лицо. :)
[DOUBLEPOST=1458201308,1458201201][/DOUBLEPOST]
POI 3.14 (символичный релиз ;) )
ПОИ пи....?
Вот не надо больше номер версии увеличивать, просто далее дописывать циферки справа в необходимой последовательности. :)
 

Ruska132

Well-known member
21.01.2015
66
0
#13
Что то сильно много умной информации, я думал будет проще. Мне надо заполнить таблицу, хотел бы использовать что уже получалось:
Dim WrdApp, WrdDoc As Variant
Dim docSotrTmp As NotesDocument
.....
открытие шаблона
....
Set WrdApp = CreateObject("Word.Application")
Call WrdApp.Documents.Add(шаблон)
Set WrdDoc = WrdApp.ActiveDocument

и вот так заполнить таблицу
WrdDoc.Tables.Item(2).Cell(WrdDoc.Tables.Item(2).Rows.Count, 1).Range.Text=docSotrTmp.поля(0)

такой просто способ мне бы очень как подошел.
в Worde простая таблица и все данные с одного документа.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#16
никак.
Только перед записью в Word проверять дату.
Ну или делать поиск по базе, но тогда рисовать структуру отчета самому.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 598
275
#17
и вот так заполнить таблицу
WrdDoc.Tables.Item(2).Cell(WrdDoc.Tables.Item(2).Rows.Count, 1).Range.Text=docSotrTmp.поля(0)
а вот вам и объясняют - не проще это :)
а вот использовать шаблоны джаспера или воспользоваться POI
Для просмотра контента необходимо: Войти или зарегистрироваться

или использовать xdocreport
вот в таком ключе http://stackoverflow.com/questions/...in-a-word-table-using-velocity-and-xdocreport
достаточно простая задача с заделом на будущее, но таки - да придется потратить день на изучение темы
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 598
275
#18

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 598
275
#19
в POI ваще кода - наразпоссать, в чем проблема использования нормальных инструментов с туториалами документацией, примерами...?
вместо вопросов про проприетарный ворд КОМ
вот он точно - не проще
 

Ruska132

Well-known member
21.01.2015
66
0
#20
Мне показалось там все за мудрено и слишком умно.
Создам диалог с выбором периода, и буду пробегаться по представлению и если подходит буду выводить в ворд.