使用 docx4j 在 Word 文件中输出日期格式

Date output formatting in Word file with docx4j

我正在用这样的日期范围替换我的 Word 模板中的占位符

//...getting from and to dates
String format = "%1$-3tb %1$tY - %2$-3tb %2$tY";
dateString = String.format(format, from, to);
//...retrieving the Text object...
textElement.setValue(dateString);

控制台输出看起来不错:

Nov 2016 - Nov 2016
Jan 2016 - Jan 2016
Jul 2012 - Mär 2005

但是Word文件很丑:

两个问题:

  1. (附带问题)如果月份没有完全写出来,我怎样才能让月份有一个点:所以 "May" 应该保持这样,但是 "Nov" 应该变成 "Nov."
  2. (主要问题)如何解决水平间距问题?

附带问题的简单答案是:升级到 Java 9 或更高版本。

    YearMonth from = YearMonth.of(2012, Month.MAY);
    YearMonth to = YearMonth.of(2013, Month.NOVEMBER);

    String format = "%1$-3tb %1$tY - %2$-3tb %2$tY";
    String dateString = String.format(Locale.GERMAN, format, from, to);

    System.out.println(dateString);

Mai 2012 - Nov. 2013

Java 从最多四个来源获取其语言环境数据——包括不同语言中使用的月份缩写。在 Java 8 之前,默认值是 Java 自己的,但至少在 Java 8 中,Unicode 的公共区域设置数据存储库 CLDR 也与 Java 一起分发(不确定 Java 7)。 From Java 9 CLDR 数据是默认的,但是 Java 自己的作为 COMPAT 是可用的。系统 属性 java.locale.providers 控制要使用的语言环境数据。所以我曾预计将此 属性 设置为 CLDRCLDR,JRE 会在 Java 8 上工作,但在我的 Java 8 上它不会,似乎 CLDR Java 两个版本的数据不一样。

无论如何,虽然 Java 自己的德语月份缩写没有点,但在 CLDR 中 Java 9 中的德语月份缩写有点。最多四个字母的月份名称(Mai、Juni 和 Juli)全写,没有点。

Java 8 回答边题:java.time,现代Java日期和时间API允许我们定义自己的文本。例如:

    Map<Long, String> monthTexts = new HashMap<>(16);
    monthTexts.put(1L, "Jan.");
    monthTexts.put(2L, "Feb.");
    monthTexts.put(3L, "Mär.");
    monthTexts.put(4L, "Apr.");
    monthTexts.put(5L, "Mai");
    monthTexts.put(6L, "Jun.");
    monthTexts.put(7L, "Jul.");
    monthTexts.put(8L, "Aug.");
    monthTexts.put(9L, "Sep.");
    monthTexts.put(10L, "Okt");
    monthTexts.put(11L, "Nov.");
    monthTexts.put(12L, "Dez.");
    DateTimeFormatter monthFormatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.MONTH_OF_YEAR, monthTexts)
            .appendPattern(" u")
            .toFormatter();

    String dateString = from.format(monthFormatter) + " – " + to.format(monthFormatter);

    System.out.println(dateString);

Mai 2012 – Nov. 2013

Java 6 和 7 回答附带问题:获取 ThreeTen Backport 库并按照 Java 8 中的操作(link 在底部)。

题主我好像没看懂。如果您想要的是“到”月份垂直排列,我认为您的 docx 文档中需要两列而不是一列。您可以指定在这两个特定列之间不绘制垂直线,因此 reader 会将其视为一个。

链接