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

  • Автор темы Ruska132
  • Дата начала
R

Ruska132

Добрый день Уважаемые.
Подскажите ПЖ а может будет даже пример.
Есть представление его надо вывести в Word с выбором периода.

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
Ctrl-A, Edit -> Copy Selected As Table
Ctl-V где оно надо
ограничение будет по большим вьюшкам
[DOUBLEPOST=1458120354,1458120245][/DOUBLEPOST]варианты сложнее https://codeby.net/threads/40464/#post-218639
 
R

Ruska132

Ctrl-A, Edit -> Copy Selected As Table
Ctl-V где оно надо
ограничение будет по большим вьюшкам

Данные вариант так же не подходить. мне надо кнопку в представлении "Выгрузить" - затем запрос периода. открыть шаблон и заполнить его данными с представления удовлетворяющими периода.
 

savl

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

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

lmike

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

garrick

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
небольшой ОФФ
замена текста в ворде (docx)
код агента и либа (написано на коленке и "грязно")
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
1 367
152
BIT
364
Тут как-то возникла проблема - надо было вставить поля в 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 (символичный релиз ;) )
ПОИ пи....?
Вот не надо больше номер версии увеличивать, просто далее дописывать циферки справа в необходимой последовательности. :)
 
R

Ruska132

Что то сильно много умной информации, я думал будет проще. Мне надо заполнить таблицу, хотел бы использовать что уже получалось:
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 851
27
BIT
0
никак.
Только перед записью в Word проверять дату.
Ну или делать поиск по базе, но тогда рисовать структуру отчета самому.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
и вот так заполнить таблицу
WrdDoc.Tables.Item(2).Cell(WrdDoc.Tables.Item(2).Rows.Count, 1).Range.Text=docSotrTmp.поля(0)
а вот вам и объясняют - не проще это :)
а вот использовать шаблоны джаспера или воспользоваться POI
или использовать xdocreport
вот в таком ключе
достаточно простая задача с заделом на будущее, но таки - да придется потратить день на изучение темы
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
использование джаспер как пример
там подключаются в БД, но джаспер понимает и CSV . - просто выгрузить из вьюшки в CSV)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
в POI ваще кода - наразпоссать, в чем проблема использования нормальных инструментов с туториалами документацией, примерами...?
вместо вопросов про проприетарный ворд КОМ
вот он точно - не проще
 
R

Ruska132

Мне показалось там все за мудрено и слишком умно.
Создам диалог с выбором периода, и буду пробегаться по представлению и если подходит буду выводить в ворд.
 
Мы в соцсетях:

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