提问者:小点点

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


我正在用这样的日期范围替换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

两个问题:

  1. (附带问题)如果月份没有完全写出来,我怎么能让它们有一个点:所以“五月”应该保持这样,但是“十一月”应该变成“十一月”。
  2. (主要问题)如何解决水平行间距问题?

共1个答案

匿名用户

侧面问题的简单答案是:升级到Java9或更高版本。

    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-2013年11月

Java从最多四个来源获取其语言环境数据——包括不同语言中使用的月份缩写。在Java8之前和之前,默认是Java自己的,但至少在Java8 Unicode的公共语言环境数据存储库,CLDR,也与Java一起分发(不确定Java7)。从Java9开始,CLDR数据是默认的,但Java自己的数据可以作为COMPAT使用。系统属性java. locale.提供者控制使用哪些语言环境数据。所以我期望将此属性设置为CLDRCLDR,JRE将在Java8上工作,但在我的Java8上它没有,似乎CLDR数据在两个Java版本中不一样。

无论如何,虽然爪哇自己的德语月份缩写没有点,但在CLDRJava9中的德语月份缩写是有点的。最多四个字母(Mai、Juni和Juli)的月份名称是完整的,没有点。

Java8对附带问题的回答: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-2013年11月

Java6和7对附带问题的回答:获取三个反向库,按照Java8(底部链接)进行操作。

对于主要问题,我不认为我理解它。如果你想要的是“to”月份垂直排列,我认为你需要在docx文档中使用两列而不是一列。您可以指定在这两列之间不绘制垂直线,以便读者将其视为一列。

  • CLDR-Unicode通用区域设置数据存储库
  • Oracle教程:Date Time解释如何使用java. time
  • Java规范请求(JSR)310,其中首次描述了java. time
  • 三个反向移植项目,将java. time反向移植到Java6和7(三个用于JSR-310)。
  • ThreeTenABP,Android版的ThreeTenBackport
  • 问题:如何在Android项目中使用ThreeTenABP,并有非常详尽的解释。