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

Тема в разделе "Lotus - Программирование", создана пользователем Ruska132, 16 мар 2016.

  1. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    Добрый день Уважаемые.
    Подскажите ПЖ а может будет даже пример.
    Есть представление его надо вывести в Word с выбором периода.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    почему в ворд?
     
  3. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    Пользователи хотят вывести именно в ворд, ну если с вордом сложно то буду навязывать им excel.
    у них есть установленная форма вот и хотят ее заполнить.
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Файл-Экспорт-
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    Ctrl-A, Edit -> Copy Selected As Table
    Ctl-V где оно надо
    ограничение будет по большим вьюшкам
    [DOUBLEPOST=1458120354,1458120245][/DOUBLEPOST]варианты сложнее http://codeby.net/forum/threads/40464/#post-218639
     
  6. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    А тогда не удастся вывести и заполнить шаблон.
     
  7. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    Данные вариант так же не подходить. мне надо кнопку в представлении "Выгрузить" - затем запрос периода. открыть шаблон и заполнить его данными с представления удовлетворяющими периода.
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    @Ruska132, тогда надо программировать.
    Если есть шаблон, то там можно сделать вычисляемые поля с алиасами ( https://blogs.technet.microsoft.com/tasush/2011/06/15/word-2010-2/ ).
    В лотусе делается агент, который собирает данные и заполняет некую структуру.
    Затем эта структура переносится в шаблон.
    Тот же принцип, что и с excel, только вместо обращения к ячейке идет обращение к вычисляемому полю.
    Примерно так:
    Код (LotusScript):
    wdoc.formfields(ListTag(dt)).Range.Text = "" & dt
    тут dt список, тэг списка - имя вычисляемого поля в ворде, а значение - значение =)
    Можно хоть класс, хоть тип сделать, не важно, главное принцип.
    Это на LS естественно, через COM.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    здесь выкладывал БД, кот. берет вьюшку и выгружает Excel файл, причем описание (что и откуда) задается доком настроек
    НО код достаточно увесистый (и не причесанный), требует POI
    есть вариант от @garrick - плагин
    выше ссылка на готовую БД для jasperreport (@oshmianski), как поставить jasper и его настроить - там же в ветке
    [DOUBLEPOST=1458124324,1458124273][/DOUBLEPOST]джаспер грузит во чтохошь
     
  10. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Вариантов "выплюнуть" содержимое базы Lotus Notes в какой-нибудь файл есть огромное множество. Вам этот Word потом править или распечатывать? Если распечатывать, то количество вариантов сильно увеличивается, Word при этом, соответственно, выбрасываем совсем.
    1. Нарисовать диалоговое окошко с запросом парметоров;
    2. Создать вьюху, которая умеет отбирать из базы документы по указанным параметрам;
    3. Заполняем шаблон данными (не обязательно Word'овый, в зависимости от того, что вам надо в конечном итоге)
    4. Отдаём что получилось пользователю.
    По поводу технологии заполнения шаблона есть масса вариантов, но надо точно понимать нужен ли вам именно Word. Если Word обязательно, то через OLE на VBA или в RTF через какой-нибудь шаблонизатор или через XML/XSL Transformer.
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    небольшой ОФФ
    замена текста в ворде (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 (символичный релиз ;) )
     
  12. garrick

    garrick Lotus team
    Lotus team

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

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    67
    Симпатии:
    0
    Что то сильно много умной информации, я думал будет проще. Мне надо заполнить таблицу, хотел бы использовать что уже получалось:
    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 простая таблица и все данные с одного документа.
     
  14. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    А в чём проблема-то?
     
  15. Ruska132

    Ruska132 Well-Known Member

    Регистрация:
    21 янв 2015
    Сообщения:
    67
    Симпатии:
    0

    проблема в том как организовать отбор в представление документов удовлетворяющий условию, и потом вывести их поочередно.
     
  16. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    никак.
    Только перед записью в Word проверять дату.
    Ну или делать поиск по базе, но тогда рисовать структуру отчета самому.
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    а вот вам и объясняют - не проще это :)
    а вот использовать шаблоны джаспера или воспользоваться POI http://www.tutorialspoint.com/apache_poi_word/apache_poi_word_tables.htm
    или использовать xdocreport
    вот в таком ключе http://stackoverflow.com/questions/...in-a-word-table-using-velocity-and-xdocreport
    достаточно простая задача с заделом на будущее, но таки - да придется потратить день на изучение темы
     
    #17 lmike, 17 мар 2016
    Последнее редактирование модератором: 17 мар 2016
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    в POI ваще кода - наразпоссать, в чем проблема использования нормальных инструментов с туториалами документацией, примерами...?
    вместо вопросов про проприетарный ворд КОМ
    вот он точно - не проще
     
  20. Ruska132

    Ruska132 Well-Known Member

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

Поделиться этой страницей