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

时间:2018-09-17 12:19:16

标签: java 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文件很丑陋:
enter image description here

两个问题:

  1. (另一个问题),如果月份未完全写出,我该如何使一个月加点:所以“ May”应保持原样,而“ Nov”应变为“ Nov”。
  2. (主要问题)如何解决水平间距问题?

1 个答案:

答案 0 :(得分:1)

对附带问题的简单回答是:升级到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);
  

2012年5月-2013年11月

Java从多达四个来源获取其语言环境数据(包括不同语言中使用的月份缩写)。直到Java 8(包括Java 8),默认值都是Java自己的,但至少在Java 8中,Unicode的通用语言环境数据存储库CLDR也随Java一起分发(不确定Java 7)。在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);
  

2012年5月– 2013年11月

Java 6和7回答了一个问题:获取ThreeTen Backport库并按照Java 8的方法进行操作(底部的链接)。

对于主要问题,我认为我听不懂。如果您想要的是“至”个月垂直排列,我认为您在docx文档中需要两列而不是一列。您可以指定在这两个特定的列之间不画垂直线,以便读者将其视为一个。

链接