Как вставить текущее поле даты в docx с помощью apache POI

Я не могу понять, как вставить поля даты и времени в docx. Я полагаю, мне нужно использовать что-то вроде

run.getCTR().addNewFldChar().setFldCharType(STFldCharType.???) 

но я не знаю как.

Bellow — это SSCCE, в котором insertCurrentXxxxField() функции ведут себя не так, как нужно.

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class InsertCurrentDateAndTimeInDocxUsingApachePOI {

    public static void main(String[] args) throws IOException {

        XWPFDocument  document  = new XWPFDocument();
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun       run       = paragraph.createRun();

        run.setText("Current date:");
        insertCurrentDateField(run);

        run.setText(" current time:");
        insertCurrentTimeField(run);

        FileOutputStream out = new FileOutputStream(new File("CurrentDateAndTime.docx"));
        document.write(out);
    }

    private static void insertCurrentDateField(XWPFRun run){
        run.setText("${here should be the current date field DD.MM.YY}");
    }
    private static void insertCurrentTimeField(XWPFRun run){
        run.setText("${here should be the current time field HH:MM:SS}");
    }

}

person Mihai Cazac    schedule 28.01.2016    source источник
comment
Если вы добавите поле в Word и прочитаете этот файл с помощью Apache POI, а затем прочитаете значение, что вы увидите?   -  person Gagravarr    schedule 28.01.2016
comment
Хммм... Я этого не делал, и в настоящее время не знаю, как это сделать, это выходит далеко за рамки моей задачи. В любом случае, я потратил намного слишком много времени, пока не понял, как создать приличный документ, содержащий несколько таблиц и заголовков)   -  person Mihai Cazac    schedule 28.01.2016
comment
Кстати: run.getCTR().addNewFldChar() добавляет поле формы (FORMTEXT, FORMDROPDOWN, FORMCHECKBOX,...)   -  person Axel Richter    schedule 29.01.2016
comment
Спасибо, Аксель. Основная проблема для меня заключалась в том, чтобы найти такую ​​информацию (в том числе и для объяснения, которое вы мне дали в своем ответе). Я уверен, что он должен быть где-то, но я не смог его найти.   -  person Mihai Cazac    schedule 01.02.2016


Ответы (2)


В Word поля находятся в Paragraph, а не в Run. Но Run должен быть закрыт перед полем, а новый Run должен быть открыт после поля.

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class InsertCurrentDateAndTimeInDocxUsingApachePOI {

    public static void main(String[] args) throws IOException {

        XWPFDocument  document  = new XWPFDocument();
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun       run       = paragraph.createRun();

        run.setText("Current date:");
        insertCurrentDateField(paragraph);

        run = paragraph.createRun();
        run.setText(" current time:");
        insertCurrentTimeField(paragraph);

        FileOutputStream out = new FileOutputStream(new File("CurrentDateAndTime.docx"));
        document.write(out);
    }

    private static void insertCurrentDateField(XWPFParagraph paragraph){
        XWPFRun run = paragraph.createRun(); 
        paragraph.getCTP().addNewFldSimple().setInstr("DATE \\@ \"yyyy-MM-dd\" \\* MERGEFORMAT");
    }
    private static void insertCurrentTimeField(XWPFParagraph paragraph){
        XWPFRun run = paragraph.createRun();
        paragraph.getCTP().addNewFldSimple().setInstr("TIME \\@ \"HH:mm:ss\" \\* MERGEFORMAT");
    }

}
person Axel Richter    schedule 29.01.2016
comment
Большое спасибо за этот прекрасный ответ, а также за объяснение. Конечно, чтобы мой SSCCE работал так, как было заявлено изначально, нужно внести небольшие изменения в main(). - person Mihai Cazac; 01.02.2016

Вы можете использовать java.util.Calendar и java.text.DateFormat, чтобы получить текущую дату и время.


Пример кода:

    java.text.DateFormat dateFormat = new java.text.SimpleDateFormat("DD.MM.YY HH:mm:ss");
    java.text.DateFormat dateFormat1 = new java.text.SimpleDateFormat("DD.MM.YY");
    java.text.DateFormat dateFormat2 = new java.text.SimpleDateFormat("HH:mm:ss");
    java.util.Calendar cal = java.util.Calendar.getInstance();

    String currDateTime = dateFormat.format(cal.getTime()); 
    String currDate = dateFormat1.format(cal.getTime()); 
    String currTime = dateFormat2.format(cal.getTime()); 

    System.out.println(currDateTime);// e.g. 28.01.16 15:36:27
    System.out.println(currDate);// e.g. 28.01.16
    System.out.println(currTime);// e.g. 15:36:27
person mmuzahid    schedule 28.01.2016
comment
Спасибо за ваш пост, но он не делает именно то, что я хочу, я думаю, что я был недостаточно конкретен в майском вопросе: мне нужно видеть текущую дату и время, когда документ открывается / печатается, а не когда создается. - person Mihai Cazac; 28.01.2016