Spire.Doc is a professional Word .NET library specifically designed for developers to create, read, write, convert and print Word document files. Get free and professional technical support for Spire.Doc for .NET, Java, Android, C++, Python.

Fri Jun 21, 2019 1:46 am

您好

如何读取已建好word目录内容,谢谢!

linc0124
 
Posts: 1
Joined: Fri Jun 21, 2019 1:40 am

Fri Jun 21, 2019 6:28 am

Hello,

你好,感谢咨询。
由于我们Spire.DOC产品创建的TOC目录是在域中,而微软创建的TOC目录是在控件中,因此根据TOC目录创建的不同方式,有下面两种方法参考去获取目录内容,如果测试有任何疑问,请提供你的测试文档以便我们进一步调查。你可以通过邮件(support@e-iceblue.com)发送给我们.
针对微软创建的TOC目录:
Code: Select all
 Document doc = new Document(@"微软创建TOC.docx");
 //定义list
 List<string> content = new List<string>();
 foreach (Section sec in doc.Sections)
 {
     //遍历body下面所有对象
     foreach (DocumentObject obj in sec.Body.ChildObjects)
     {
         //查找控件对象以TOC获取内容
         if (obj is StructureDocumentTag)
         {
             StructureDocumentTag sdt = obj as StructureDocumentTag;
             //遍历控件下所有对象
             foreach (DocumentObject sdtobj in sdt.ChildObjects)
             {
                 if (sdtobj is Paragraph)
                 { 
                     //添加内容到list
                     Paragraph p = sdtobj as Paragraph;
                     content.Add(p.Text);
                 }
             }
         }
     }
 }

针对Spire.Doc创建的TOC目录:
Code: Select all
Document doc = new Document();
doc.LoadFromFile(@"Spire创建TOC.docx", Spire.Doc.FileFormat.Docx2013);
//定义list
List<string> content = new List<string>();
foreach (Section section in doc.Sections)
{
   //遍历body下面所有对象
    foreach (DocumentObject obj in section.Body.ChildObjects)
  {
    if(obj is Paragraph)
     {
       Paragraph para=obj as Paragraph;
        //查找含有TOC域的段落
       foreach (DocumentObject tr in para.ChildObjects)
       {
         if (tr.DocumentObjectType == DocumentObjectType.TOC || tr.DocumentObjectType == DocumentObjectType.Field)
          {
             //添加内容到list
             content.Add(para.Text);
             break;
          }
        }
      }
    }
 }

Sincerely,
Lisa
E-iceblue support team
User avatar

Lisa.Li
 
Posts: 1261
Joined: Wed Apr 25, 2018 3:20 am

Mon Jun 24, 2019 3:08 am

Hello,

您好,
抱歉打扰,请问之前提供的示例代码有帮助到你吗?能否给予我们一些反馈呢?提前感谢。

Sincerely,
Lisa
E-iceblue support team
User avatar

Lisa.Li
 
Posts: 1261
Joined: Wed Apr 25, 2018 3:20 am

Wed Mar 18, 2020 1:51 am

对于已生成的word目录,怎么更改其文本格式,不动它的排版?

Liyuanyuan
 
Posts: 13
Joined: Tue Mar 17, 2020 1:12 pm

Wed Mar 18, 2020 5:55 am

Liyuanyuan 您好,

感谢您的咨询。
请参照下面的代码来更改目录文本的格式(如字体和文字大小),附件是我的输入文档和结果文档。
Code: Select all
    static void Main(string[] args)
    {
        Document doc = new Document();
        doc.LoadFromFile("目录.docx");
        foreach (Section section in doc.Sections)
        {
            //遍历body下面所有对象
            foreach (DocumentObject obj in section.Body.ChildObjects)
            {
                if (obj is Paragraph)
                {
                    Paragraph para = obj as Paragraph;
                    //通过样式名来确定是否是目录文本
                    switch(para.StyleName){
                        //一级标题
                        case "TOC1":
                            ChangeFont(para, "黑体", 14);
                            break;
                        //二级标题
                        case "TOC2":
                            ChangeFont(para, "黑体", 12);
                            break;
                        //三级标题
                        case "TOC3":
                            ChangeFont(para, "黑体", 10);
                            break;
                        //其余级别类推
                    }
                }
            }
        }
        doc.SaveToFile("结果.docx", FileFormat.Docx);
    }

    public static void ChangeFont(Paragraph para, string fontName, int fontSize)
    {
        foreach (DocumentObject obj in para.ChildObjects)
        {
            //如果对象类型为TextRange
            if (obj.DocumentObjectType == DocumentObjectType.TextRange)
            {
                TextRange tr = (TextRange)obj;
                //更改字体和文字大小
                tr.CharacterFormat.FontName = fontName;
                tr.CharacterFormat.FontSize = fontSize;
            }
        }
    }

如果这不是您想要的,请提供您的输入文档和您期望得到的结果文档,我们会做进一步的调查。你可以通过邮件将其发送给我们(support@e-iceblue.com)。

Sincerely,
Rachel
E-iceblue support team
User avatar

rachel.lei
 
Posts: 1571
Joined: Tue Jul 09, 2019 2:22 am

Wed Mar 18, 2020 11:13 am

谢谢,解决了我的问题。给朵小花花

Liyuanyuan
 
Posts: 13
Joined: Tue Mar 17, 2020 1:12 pm

Thu Mar 19, 2020 1:38 am

您好,

感谢您的反馈。
如果您后面遇到了与我们产品相关的任何问题,欢迎随时与我们联系。
祝您一切顺利!

Sincerely,
Rachel
E-iceblue support team
User avatar

rachel.lei
 
Posts: 1571
Joined: Tue Jul 09, 2019 2:22 am

Thu Aug 06, 2020 9:00 am

请问JAVA如何获得doc的目录及页码

zmcnxd19870728
 
Posts: 3
Joined: Thu Aug 06, 2020 8:57 am

Thu Aug 06, 2020 11:27 am

zmcnxd19870728 您好,

感谢您的咨询。
对于微软创建的目录,请参考下面的代码进行读取目录文本及对应的页码。
Code: Select all
        Document doc = new Document("微软创建.docx");
        List<String> content = new ArrayList<>();
        for (Section sec : (Iterable<? extends Section>) doc.getSections()) {
            //遍历body下面所有对象
            for (DocumentObject obj : (Iterable<? extends DocumentObject>) sec.getBody().getChildObjects()) {
                //查找控件对象以TOC获取内容
                if (obj instanceof StructureDocumentTag) {
                    StructureDocumentTag sdt = (StructureDocumentTag) obj;
                    //遍历控件下所有对象
                    for (DocumentObject sdtobj : (Iterable<? extends DocumentObject>) sdt.getChildObjects()) {
                        if (sdtobj instanceof Paragraph) {
                            //添加内容到list
                            Paragraph p = (Paragraph) sdtobj;
                            content.add(p.getText());
                        }
                    }
                }
            }
        }

而对于Spire创建的目录,则请参考如下代码。
Code: Select all
 Document doc = new Document();
        doc.loadFromFile("Spire创建.docx");
        List<String> content = new ArrayList<>();
        for (Section sec : (Iterable<? extends Section>) doc.getSections()) {
            //遍历body下面所有对象
            for (DocumentObject obj : (Iterable<? extends DocumentObject>) sec.getBody().getChildObjects()) {
                if (obj instanceof Paragraph) {
                    Paragraph para = (Paragraph) obj;
                    //查找含有TOC域的段落
                    for (DocumentObject tr : (Iterable<? extends DocumentObject>) para.getChildObjects()) {
                        if (tr.getDocumentObjectType() == DocumentObjectType.TOC || tr.getDocumentObjectType() == DocumentObjectType.Field) {
                            //添加内容到list
                            content.add(para.getText());
                            System.out.println(para.getText());
                            break;
                        }
                    }
                }
            }
        }

如果这不能很好的满足您的需求,请给提供您的输入文档给我们参考。我们将做进一步的调查。

Sincerely,
Rachel
E-iceblue support team
User avatar

rachel.lei
 
Posts: 1571
Joined: Tue Jul 09, 2019 2:22 am

Mon Aug 10, 2020 3:23 am

请问如何检索关键字获取它出现在哪些页中

zmcnxd19870728
 
Posts: 3
Joined: Thu Aug 06, 2020 8:57 am

Mon Aug 10, 2020 6:24 am

另外如何获取指定页的文本呢

zmcnxd19870728
 
Posts: 3
Joined: Thu Aug 06, 2020 8:57 am

Mon Aug 10, 2020 7:36 am

您好,

Word文档是流式布局,它的内部实际上是没有行和页的布局信息的。也就是说,Word文档内部数据没有页的概念。因此,检索关键字并获取它所在的页码是不可行的。不过您可以像下面的代码那样获得关键字所在的段落和节。如果您还有别的疑问,欢迎随时联系我们。
Code: Select all
        Document document = new Document();
        document.loadFromFile("file/test.docx");
        //查找关键字
        TextSelection[] textSelections = document.findAllString("Spire.Doc", true, false);
        for (TextSelection selection : textSelections) {
            //获取关键字所在段落和节
            Paragraph ownerPara = (Paragraph)selection.getAsOneRange().getOwner();
            Section ownerSection = (Section)ownerPara.getOwner().getOwner();
        }


Sincerely,
Rachel
E-iceblue support team
User avatar

rachel.lei
 
Posts: 1571
Joined: Tue Jul 09, 2019 2:22 am

Return to Spire.Doc

cron