为有中文需求的客户提供多渠道中文技术支持.

Tue Jul 26, 2022 8:30 am

请问如何实现下面的效果
1.
2.
2.1.
2.2.
2.1. // 这里重新开始编号

Voimulax
 
Posts: 6
Joined: Tue Jul 26, 2022 8:21 am

Tue Jul 26, 2022 9:18 am

您好,

感谢您的咨询。

首先,您列举的情况,是没法实现的。原因如下。根据您的描述,需要重新开始编号。那么就要从新的2.1这里开始使用新的列表样式才能满足重新编号的需求。因为使用相同列表样式名,是不可能直接重新编号的。但是,在即使使用新的列表样式(与第一个样式一模一样只是用了新的名字),也会呈现下面的结果:
Code: Select all
1.
    1.1
2.
    2.1
    2.2
    1.1
    1.2

也就是重置了当前等级的编号,但父等级的编号仍然从1开始。这是因为第二个列表样式本身并没有使用过等级为1的编号,直接从等级为2开始编号时,父等级只能默认从1开始。因此想实现您举例这个情况是不行的。只有考虑多级编号时不在前缀重复父等级编号的情况。也即:
Code: Select all
1.
    1.
2.
    1.
    2.
    1.
    2.

此情况下参考代码如下:
Code: Select all
    public static void createListStyle(Document document,String styleName){
        //创建list样式
        //设置为数字编号类型
        ListStyle numberList = new ListStyle(document, ListType.Numbered);
        numberList.setName(styleName);
        /**
         * 一级样式
         *
         */
        //设置前缀和后缀
        numberList.getLevels().get(0).setNumberPrefix("");
        numberList.getLevels().get(0).setNumberSufix(".");
        //设置编号样式为中文数字
        numberList.getLevels().get(0).setPatternType(ListPatternType.Arabic);
        /**
         * 二级样式
         *
         */
        //若改为下面这行,则会呈现为 2.1  2.2
        //numberList.getLevels().get(1).setNumberPrefix("\u0000.");
        numberList.getLevels().get(1).setNumberPrefix("");
        numberList.getLevels().get(1).setNumberSufix(".");
        numberList.getLevels().get(1).setPatternType(ListPatternType.Arabic);

        document.getListStyles().add(numberList);
    }
    public static void main(String[] args) throws Exception {
        //加载Word文档
        Document document = new Document();
        Section sec = document.addSection();
        Paragraph paragraph = sec.addParagraph();
        paragraph.appendText("Lists");
        paragraph.applyStyle(BuiltinStyle.Title);
        paragraph = sec.addParagraph();
        paragraph.appendText("Numbered List:").getCharacterFormat().setBold(true);

        createListStyle(document,"listStyle1");
        createListStyle(document,"listStyle2");
        //添加段落并应用样式
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 1");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(0);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(0);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.1");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(1);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.2");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(1);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.3");
        //此处用另一个样式名 即可让序号从新的开始
        paragraph.getListFormat().applyStyle("listStyle2");
        paragraph.getListFormat().setListLevelNumber(1);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.4");
        paragraph.getListFormat().applyStyle("listStyle2");
        paragraph.getListFormat().setListLevelNumber(1);

        //保存文档
        document.saveToFile("output.docx", FileFormat.Docx);
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Tue Jul 26, 2022 10:54 am

微信截图_20220726184949.png

但是WORD里面是可以实现的,请问后续会支持吗

Voimulax
 
Posts: 6
Joined: Tue Jul 26, 2022 8:21 am

Wed Jul 27, 2022 1:33 am

您好,

从您截图来看似乎确实在Word中可以支持此效果。我这边尝试了一下,暂时没有测试出在Word中如何达到此效果。可能是我忽略了什么。能否请您将这份样例文档分享给我呢?感谢您的协助。
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Wed Jul 27, 2022 2:25 am

经过研究发现,确实普通多级列表是没有这种效果的,但是如果新建一个多级列表,并将它链接到某个样式上,就会有这样的效果
链接方式如下:
微信截图_20220727101654.png


使用这种新建的多级列表就可以实现我上面所展现的效果,链接到正文,就是正文有这样的效果,链接到标题就是标题有这样的效果
具体到Open XML里面的结构,我猜想和abstractNumId、lvlOverride的配置有关,需要两个Numbering实例的abstractNumId一致,且子Numbering实例每个级别都加上了lvlOverride
微信截图_20220727102122.png


实际WORD文档你们这上传不了,你再试下按照我说的能否还原出来吧

Voimulax
 
Posts: 6
Joined: Tue Jul 26, 2022 8:21 am

Wed Jul 27, 2022 10:07 am

您好,

感谢您的分享。按照您截图的步骤,我创建了一个新的style,并依次将它的各个Level链接到标题1,2,3...
但非常抱歉,我仍然没有试出您这个效果。我想您还是将您创建好的文档分享给我们好一些。论坛上传的话您可以将文档打包为zip,如果仍然不行的话,您可以直接将文档通过邮件发送到support@e-iceblue.com。感谢您的协助。
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Wed Jul 27, 2022 11:01 am

文档如下,你下载下来把后缀名改成.docx然后就可以打开了
编号.zip

Voimulax
 
Posts: 6
Joined: Tue Jul 26, 2022 8:21 am

Thu Jul 28, 2022 10:26 am

您好,

根据您的文档我大概琢磨了一下。应该是需要重新设置style2的Level0的起始编号。具体代码如下。

Code: Select all
    public static void createListStyle(Document document, String styleName, int[] startAt) {
        //创建list样式
        //设置为数字编号类型
        ListStyle numberList = new ListStyle(document, ListType.Numbered);
        numberList.setName(styleName);
        String[] pres = {"\u0000", "\u0001", "\u0002", "\u0003", "\u0004", "\u0005", "\u0006", "\u0007"};
        for (int i = 0; i < 9; i++) {
            String preFix = "";
            for (int j = 0; j < i; j++) {
                preFix += pres[j] + ".";
            }
            //设置前缀和后缀
            numberList.getLevels().get(i).setNumberPrefix(preFix);
            numberList.getLevels().get(i).setNumberSufix(".");
            numberList.getLevels().get(i).setStartAt(startAt[i]);
            //设置编号样式为中文数字
            numberList.getLevels().get(i).setPatternType(ListPatternType.Arabic);
        }
        document.getListStyles().add(numberList);
    }

    public static void main(String[] args) throws Exception {
        //加载Word文档
        Document document = new Document();
        Section sec = document.addSection();
        Paragraph paragraph = sec.addParagraph();
        paragraph.appendText("Lists");
        paragraph.applyStyle(BuiltinStyle.Title);
        paragraph = sec.addParagraph();
        paragraph.appendText("Numbered List:").getCharacterFormat().setBold(true);
        int[] startAt1 = {1, 1, 1, 1, 1, 1, 1, 1, 1};
        createListStyle(document, "listStyle1", startAt1);
        //添加段落并应用样式
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 1");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(0);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(0);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.1");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(1);
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.2");
        paragraph.getListFormat().applyStyle("listStyle1");
        paragraph.getListFormat().setListLevelNumber(1);

        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.3");
        //设置style2的Level1编号从2开始 以便于父层级编号正确
        int[] startAt2 = {2, 1, 1, 1, 1, 1, 1, 1, 1};
        createListStyle(document, "listStyle2", startAt2);
        paragraph.getListFormat().applyStyle("listStyle2");
        paragraph.getListFormat().setListLevelNumber(1);
        paragraph.getListFormat().isRestartNumbering(true);
        paragraph.getListFormat().getCurrentListLevel().setStartAt(1);

        paragraph.updateListValue();
        paragraph = sec.addParagraph();
        paragraph.appendText("List Item 2.4");
        paragraph.getListFormat().applyStyle("listStyle2");
        paragraph.getListFormat().setListLevelNumber(1);

        //保存文档
        document.saveToFile("output.docx", FileFormat.Docx);
    }
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Fri Jul 29, 2022 2:44 am

你的解决方法确实能模拟出我想要的效果,但是感觉只能算个临时方案,原理也不是Word展现类似效果的原理

Voimulax
 
Posts: 6
Joined: Tue Jul 26, 2022 8:21 am

Fri Jul 29, 2022 8:37 am

您好,

感谢您的回复。

确实这个方案有一点生硬。但暂时没有其他好想法,后续我再研究一下Word的处理模式,如果能用产品达到一样的效果我再反馈给您。
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Fri Jul 29, 2022 9:20 am

我临时先用OpenXML实现了,期待你们后续的进展

Voimulax
 
Posts: 6
Joined: Tue Jul 26, 2022 8:21 am

Fri Jul 29, 2022 10:21 am

好的,有方案我会及时反馈给您。
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Return to 中文技术支持