本文简略概括了 Java 程序中如何操作 Word 目录的办法。别离以三个代码示例展现如何增加目录、读取目录、删除目录等。程序环境参考如下:
- Word 测试文档,版本.docx2013
- IDEA 编译环境,版本 2018
- Jdk 版本 1.8.0
- Word jar 包文件,free spire.doc.jar,版本 3.9.0
1. Java 增加 Word 目录
针对文档中是否对段落设置了纲要级别,别离可从不同办法来增加目录。
1.1 文档已设置纲要级别,通过域代码间接生成目录
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.HorizontalAlignment;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.fields.TableOfContent;
import com.spire.doc.fields.TextRange;
import java.awt.*;
public class AddTOC2 {public static void main (String[] args){
// 加载已设置纲要级别的测试文档
Document doc = new Document("sample.docx");
// 在文档最后面插入一个段落,写入文本并格式化
Paragraph parainserted = new Paragraph(doc);
TextRange tr= parainserted.appendText("目 录");
tr.getCharacterFormat().setBold(true);
tr.getCharacterFormat().setTextColor(Color.gray);
doc.getSections().get(0).getParagraphs().insert(0,parainserted);
parainserted.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
// 通过域代码增加目录表
TableOfContent toc = new TableOfContent(doc, "{\\o \"1-3\"\\h \\z \\u}");
doc.getSections().get(0).getParagraphs().get(0).appendTOC(1,3);
doc.updateTableOfContents();
// 保存文档
doc.saveToFile("目录 2.docx", FileFormat.Docx_2010);
}
}
1.2 文档未设置纲要级别,需手动设置纲要级别后生成目录
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.TextRange;
import java.awt.*;
public class AddToc {public static void main(String[]args){
// 加载测试文档
Document doc = new Document("测试文件.docx");
// 在文档最后面插入一个段落,写入文本并格式化
Paragraph parainserted = new Paragraph(doc);
TextRange tr= parainserted.appendText("目 录");
tr.getCharacterFormat().setBold(true);
tr.getCharacterFormat().setTextColor(Color.gray);
doc.getSections().get(0).getParagraphs().insert(0,parainserted);
parainserted.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
// 手动设置文档中指定段落的纲要级别
doc.getSections().get(0).getParagraphs().get(1).applyStyle(BuiltinStyle.Heading_1);
doc.getSections().get(0).getParagraphs().get(2).applyStyle(BuiltinStyle.Heading_2);
doc.getSections().get(0).getParagraphs().get(4).applyStyle(BuiltinStyle.Heading_2);
doc.getSections().get(0).getParagraphs().get(6).applyStyle(BuiltinStyle.Heading_2);
doc.getSections().get(0).getParagraphs().get(12).applyStyle(BuiltinStyle.Heading_2);
doc.getSections().get(0).getParagraphs().get(13).applyStyle(BuiltinStyle.Heading_3);
doc.getSections().get(0).getParagraphs().get(14).applyStyle(BuiltinStyle.Heading_3);
doc.getSections().get(0).getParagraphs().get(15).applyStyle(BuiltinStyle.Heading_3);
doc.getSections().get(0).getParagraphs().get(17).applyStyle(BuiltinStyle.Heading_1);
doc.getSections().get(0).getParagraphs().get(18).applyStyle(BuiltinStyle.Heading_2);
// 增加目录
doc.getSections().get(0).getParagraphs().get(0).appendTOC(1,3);
ParagraphStyle tocStyle1 = (ParagraphStyle) Style.createBuiltinStyle(BuiltinStyle.Toc_1, doc);
tocStyle1.setName("tocStyle1");
tocStyle1.getCharacterFormat().setFontName("宋体");
tocStyle1.getCharacterFormat().setBold(true);
tocStyle1.getCharacterFormat().setTextColor(Color.GRAY);
tocStyle1.getCharacterFormat().setFontSize(15) ;
doc.getStyles().add(tocStyle1);
// 更新目录表
doc.updateTableOfContents();
// 保存文档
doc.saveToFile("目录.docx",FileFormat.Docx_2010);
}
}
2. 读取目录
读取目录可采纳读取题目(heading)的办法。
import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class GetTitle {public static void main(String[] args)throws IOException {
// 加载 Word 测试文档
Document doc = new Document();
doc.loadFromFile("sample.docx");
// 保留题目内容到.txt 文档
File file = new File("GetTitle.txt");
if (file.exists())
{file.delete();
}
file.createNewFile();
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
// 遍历 section
for (int i = 0; i < doc.getSections().getCount(); i++)
{Section section = doc.getSections().get(i);
// 遍历 Paragraph
for (int j = 0; j < section.getParagraphs().getCount(); j++)
{Paragraph paragraph = section.getParagraphs().get(j);
// 获取题目
if (paragraph.getStyleName().matches("1"))// 段落为“题目 1”的内容
{
// 获取段落题目内容
String text = paragraph.getText();
// 写入文本到 txt 文档
bw.write("题目 1:"+ text + "\r");
}
// 获取题目
if (paragraph.getStyleName().matches("2"))// 段落为“题目 2”的内容
{
// 获取段落题目内容
String text = paragraph.getText();
// 写入文本到 txt 文档
bw.write("题目 2:" + text + "\r");
}
// 获取题目
if (paragraph.getStyleName().matches("3"))// 段落为“题目 3”的内容
{
// 获取段落题目内容
String text = paragraph.getText();
// 写入文本到 txt 文档
bw.write("题目 3:" + text+"\r");
}
// 获取题目
if (paragraph.getStyleName().matches("4"))// 段落为“题目 4”的内容
{
// 获取段落题目内容
String text = paragraph.getText();
// 写入文本到 txt 文档
bw.write("题目 4:" + text+"\r");
}
bw.write("\n");
}
}
bw.flush();
bw.close();
fw.close();}
}
注:在增加目录时,可将“无效款式”设置为“目录级别”显示(如下图),
方可采纳以上代码形式作为读取目录的办法,如在 Word 中没有进行对应设置,通过此办法获取目录的内容可能不残缺。
测试文档:
目录读取后果:
3. 删除目录
import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
public class RemoveTOC {public static void main(String[]args){
// 加载蕴含目录的 Word 文档
Document doc = new Document();
doc.loadFromFile("sample.docx");
// 获取 section
Section section = doc.getSections().get(0);
// 遍历段落
for (int i = 0; i < section.getParagraphs().getCount(); i++)
{Paragraph paragraph = section.getParagraphs().get(i);
if (paragraph.getStyleName().matches("TOC\\w+"))
{section.getParagraphs().removeAt(i);// 删除目录
i--;
}
}
// 保存文档
doc.saveToFile("RemoveTOC.docx", FileFormat.Docx_2013);
doc.dispose();}
}
原创 内容,转载请务必注明出处!!