主页:李指导CSDN博客
Aspose.Words 官网:https://products.aspose.com/words/
Aspose.Words For JAVA 官网教程1:Aspose.Words for Java 官网教程1
Aspose.Words For JAVA 官网教程2:Aspose.Words for Java 官网教程2
前言
Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。
Aspose API支持流行文件格式处理,并允许将各类文档导出或转换为固定布局文件格式和最常用的图像/多媒体格式。
Aspose.Words 为用户提供了广泛的功能。用户可以执行大量与文档相关的任务——从简单地将文档从一种受支持的格式转换为另一种格式并在转换过程中修改这些文档到业务任务,例如创建结构化和视觉上吸引人的文档或自动报告。
本章根据2024年最新.Cracked 资源包提供Aspose.Word For JAVA 最详细的文档使用教程, 资源提供文章末尾。
Aspose.Words For JAVA 结构
Aspose.Words的文档对象模型(DOM)是一个Word文档在内存中的映射,Aspose.Words的DOM可以通过编程读取、操作和修改Word文档的内容和格式。熟悉和掌握DOM的结构和相应的类型,是使用Aspose.Words灵活编程的基础。
我们接着来看看主要类及其功能:
Aspose.Words 类 | 类别 | 描述 |
Document | Document | Document对象是文档树的根节点,提供访问整个文档的入口 |
Section | Document | Section对象对应文档中的一节 |
Body | Document | 是一节中的主要文本容器 |
HeaderFooter | Document | 一节中的特殊页眉或者页脚文本容器 |
GlossaryDocument | Document | 代表一个Word文档中词汇表的根条目 |
BuildingBlock | Document | 代表一个词汇表文档,如构件,自动图文集或一个自动更正条目 |
Paragraph | Text | 一个文本段落,包含内联的节点 |
Run | Text | 一个格式一致的文本块 |
BookmarkStart | Text | 一个书签的起点标记 |
BookmarkEnd | Text | 一个书签的结束标记 |
FieldStart | Text | 一个特殊的字符,指定一个单词字段的开始 |
FieldSeparator | Text | 一个特殊的字符,指定单词字段的分隔 |
FieldEnd | Text | 一个特殊的字符,指定一个单词字段的结束 |
FormField | Text | 一个表单字段 |
SpecialChar | Text | 特殊字符类型,没有具体的字符类型 |
Table | Tables | Word文档中的表格 |
Row | Tables | 一个表格对象的行 |
Cell | Tables | 表格行的单元格 |
Shape | Shapes | Word文档中的图像,形状,文本框或者OLE对象 |
GroupShape | Shapes | 一组Shapes对象 |
Footnote | Annotations | 文档中包括文本的脚注或者尾注 |
Comment | Annotations | 文档中包含文本的注释 |
CommentRangeStart | Annotations | 一个相关的注释区域的开始 |
CommentRangeEnd | Annotations | 一个相关的注释区域的结束 |
SmartTag | Markup | 在一个段落内围绕一个或多个内嵌结构的智能标记 |
CustomXmlMarkup | Markup | 文档中的某些结构的自定义XML标记 |
StructuredDocumentTag | Markup | 文档中的一种结构化的文档标签(内容控制) |
OfficeMath | Math | 代表Office的数学对象,如函数,方程或者矩阵 |
上述这些类是叶子节点,没有子类了。我们接着看看树节点,包含子类的节点。
类 | 描述 |
Node | 所有节点类的抽象基类。提供了基本的功能 |
CompositeNode | 基本的节点类,可以包含其他节点对象, 提供了访问,插入,移除和选择子节点的功能 |
Story | 一个Word文档的文本存储在几个Stories. 它是section层stories的基类,包含Body和HeaderFooter子类 |
InlineStory | inline层节点的基类,包含一个story: Comment和Footnote. |
Inline | inline层节点的基类,由一个单独的格式一致的文本组成 |
DocumentBase | 一个文档里主要文档和词汇表文档的抽象父类 |
下面我们通过创建的SpringBoot项目,正式开始AsposeWord For Java 的教程。
目录
前言
项目介绍
一:SpringBoot 引入第三方 jar 包 (aspose-words-2024.01-jdk17.jar)
1.1 准备Jar包
1.2 添加pom文件
1.3 配置打包时加入第三方 sdk
1.4 配置编译时打包resource中的配置文件
二:文档的使用方法
2.1:创建/加载 文档
2.2 光标对文档的操作
2.3:比较文档
2.4:无格式要求 文本查找替换
2.5:有格式要求文本查找替换
2.6:设置页面布局
2.7:设置段落标题,并且区分
2.6:设置各级文本格式
2.8:使用HTML、设置文本格式
三:表格制作
3.1:添加三列单维度表格
3.2:添加四列单维度表格
3.3:动态添加四列多维度表格
3.4:向以有表格的模板添加数据
四:表格制作
4.1:插入圆环图
4.2:插入饼状图
4.3:插入单维纵向柱状图
4.4:插入单维横向柱状图
4.5:插入多维柱状图1
4.6:插入多维柱状图2
4.7:插入多维柱状图3
4.8:插入折线图
4.9:插入雷达图
4.10:插入词云图
五:进阶操作
5.1:向文档添加水印(文档每页循环添加)
项目介绍
本项目为根据Aspose.Words For JAVA跨平台类库的API来做文档处理的任务,在无需使用Microsoft Word的情况下根据Aspose.Words for Java的API参考文档和实际项目原型提供示例,其中包含了创建或加载文档、制作页面的样式、创建标题和段落、替换书签和渲染、创建不同的多维图形和制作表格等等技术,为您提供学习Apose.Words的最小的学习曲线,本项目基于SpringBoot项目提供API,以帮助开发人员更好地使用Aspose.Words for Java。
由于本程序规模不大,可供课程设计,毕业设计学习演示之用。
一:SpringBoot 引入第三方 jar 包 (aspose-words-2024.01-jdk17.jar)
因为SpringBoot工程的依赖都是通过maven管理,但是像AsposeWords这种无水印的包是不会在Maven仓库的,所以这里需要将本地的SDK引入工程当中。
1.1 准备Jar包
在resources中创建lib文件夹,将aspose-words-24.01-jdk17.jar包放进去,这里的jdk17不是强制要求,本工程是JDK8。在本文末端,提供了最新的无水印jar包,可以自取。
如果支持Maven形式的话,在resources目录下创建lib包,将jar包上传到lib目录下。如果有私服的话,最好上传到自己的私服当中。
1.2 添加pom文件
pom 配置如下,其中标签groupId、artifactId、version 是可以随意定义的,scope 声明打包时包从哪来(system 代表从本地文件系统抓取,需要配合标签 systemPath 一起使用),systemPath 标签声明包的位置。这里添加poi的pom和自己的poase的pom。
org.apache.poipoi3.9org.apache.poipoi-ooxml3.9org.apache.poipoi-ooxml-schemas3.9asposewordasposewordsdk1.0system${project.basedir}/src/main/resources/lib/aspose-words-java-23.01-jdk17-jie.jar
1.3 配置打包时加入第三方 sdk
上述配置只能保证本地调试可用,但是打包时不会把三方依赖一块打进去,会导致三方类找不到,所以必须在 pom 加入以下配置:
org.springframework.bootspring-boot-maven-plugintrue
1.4 配置编译时打包resource中的配置文件
src/main/java**/*.xmlfalsesrc/main/resources**/*.yml**/*.xml**/*.ttc**/*.txt**/*.propertiesfalse
二:文档的使用方法
2.1:创建/加载 文档
创建文档的方式有三种:
1.第一种是创建一个新的文档;
2.第二种是根据已有的模板加载文档;
3.第三种是根据流加载文档;
因为本文是通过已有的模板加载的文档所以下面会以第二种方式介绍,这样的好处就是可以提前将所要创建的报告的一些内容,如背景封面、前言等提前写进去。
【output/school_template.docx】为模板地址,模板自定义随便创建一个文档写点内容就行。
或者免费拿取我自己的模板:https://download.csdn.net/download/LiHaoHang6/88770440
这个main方法,是用来调用后面所有来操作文档的具体方法
import com.aspose.words.*;import java.text.SimpleDateFormat;import java.util.Date;/** * @Author: 李指导 * @Create: 2024/01/10 - 15:25 * @Version: v1.0 * Description: Aspose.Word For JAVA 自动生成报告程序 **/public class GenerateReport {public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//调用方法在这里//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}}
2.2 光标对文档的操作
这些是部分光标对文档的操作的方法,在后续的方法当中会经常使用到这些可直接通过DocumentBuilder来调用的操作方法,所以看到熟悉就行
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();/*操作文档的一些可直接调用的方法*///换行 插入一个新的段落builder.insertParagraph();//也是换行的意思builder.writeln();// 插入分页符(换页)builder.insertBreak(BreakType.PAGE_BREAK);// 光标移至文档开头builder.moveToDocumentStart();// 插入书签builder.startBookmark("MyBookmark");builder.writeln("This is the content inside the bookmark.");builder.endBookmark("MyBookmark");// 光标移至文档末尾builder.moveToDocumentEnd();//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
2.3:比较文档
/* * @Description: 比较文档 * */public static void cmpDocument(Document doc1,Document doc2) throws Exception{//忽略一些内容格式,可以根据自己的实际需求调节。CompareOptions options =new CompareOptions();options.setIgnoreFormatting(true);options.setIgnoreHeadersAndFooters(true);options.setIgnoreCaseChanges(true);options.setIgnoreTables(true);options.setIgnoreFields(true);options.setIgnoreComments(true);options.setIgnoreTextboxes(true);options.setIgnoreFootnotes(true);//涉及Microsoft Word“比较文档”对话框中的“显示更改”选项options.setTarget(ComparisonTargetType.NEW);doc1.compare(doc2, "user", new Date(),options);if (doc1.getRevisions().getCount() == 0){System.out.println("Documents are equal");}else{System.out.println("Documents are not equal");}}
2.4:无格式要求 文本查找替换
- 查找替换:替换文本是指将文档中的特定字符串用另一个字符串代替。
public static void setFindReplace(Document doc, DocumentBuilder builder, String searchText, String replaceText) throws Exception{// 在整个文档范围内查找 searchText,并将其替换为 replaceTextdoc.getRange().replace(searchText,replaceText);// 将光标移到文档的末尾builder.moveToDocumentEnd();}
2.5:有格式要求文本查找替换
public static void setFindReplace2(Document doc,DocumentBuilder builder, String searchText , String replaceText) throws Exception{// 创建一个查找替换器FindReplaceOptions options = new FindReplaceOptions();// 遍历文档中的所有段落NodeCollection paragraphs = doc.getChildNodes(NodeType.PARAGRAPH, true);for (Paragraph paragraph : (Iterable) paragraphs) {// 遍历段落中的所有运行节点NodeCollection runs = paragraph.getChildNodes(NodeType.RUN, true);for (Run run : (Iterable) runs) {// 判断文本是否包含要替换的文本if (run.getText().contains(searchText)) {// 获取当前运行节点的字体Font font = run.getFont();// 设置要替换的文本的字体格式font.setName("华文仿宋");font.setSize(20);//设置替换文本的颜色为红色font.setColor(new Color(199,42,60));//是否加粗font.setBold(false);// 设置居中对齐paragraph.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);// 设置下划线样式//font.setUnderline(Underline.SINGLE);// 设置下划线颜色//font.setUnderlineColor(new Color(63,145,227));//保留元字符//options.setPreserveMetaCharacters(true);// 执行替换run.setText(run.getText().replace(searchText, replaceText));}}}//将光标移动到文档末builder.moveToDocumentEnd();}
运行截图:
2.6:设置页面布局
想要写好文稿,排版和布局真的很太重要了!,在创建文档时设置页面布局是为了确保文档的外观和格式符合预期。页面布局设置涉及诸如纸张大小、页边距、方向等方面的参数,这些参数直接影响文档的排版和打印效果。
如果像 2.1一样,是用的单独的模板,加载模板之后去使用Aspose.Words, 那么所有的页面布局都可以在模版当中提前定义好,不需要代码来操作, 那么这个方法就不需要使用, 这个方法是针对于单独去新创建文档的时候来设置的。
setPages()方法当中并没有设置文字的格式,因为在后续的方法中,文字所表达的标题、文本格式会单独用方法来实现。
/** * @Description: 设置页面布局 */public static void setPages(DocumentBuilder builder,Document doc) throws Exception{//将页面设置重置为默认纸张大小、边距和方向。builder.getPageSetup().clearFormatting();//指定页面边框是包含还是不包含页脚。builder.getPageSetup().setBorderSurroundsFooter(true);//指定页面边框是包含还是不包含页眉。builder.getPageSetup().setBorderSurroundsHeader(true);//设置纸张布局,将纸张布局调整为A4builder.getPageSetup().setPaperSize(PaperSize.A4);//设置了表格行的边框线条样式为THICK,即较粗的线条//builder.getRowFormat().getBorders().setLineStyle(LineStyle.THICK);//这一行代码设置了表格行的高度规则为AUTO//builder.getRowFormat().setHeightRule(HeightRule.AUTO);//设置行间距: 1.0等于12点,1.5行=18点,1.3倍行间距=15点builder.getParagraphFormat().setLineSpacing(15);//设置行间距//getPageSetup(): 这是获取页面设置的方法,通过该方法你可以获得页面设置对象,进而设置页面的各种属性。//设置页面左边缘和正文左边界之间的距离(以磅为单位)。doc.getFirstSection().getPageSetup().setLeftMargin(72.0);//设置页面右边缘与正文右边界之间的距离(以磅为单位)。doc.getFirstSection().getPageSetup().setRightMargin(72.0);//设置页面上边缘与正文上边界之间的距离(以磅为单位)。doc.getFirstSection().getPageSetup().setTopMargin(72.0);//设置页面底部边缘与正文底部边界之间的距离(以磅为单位)。doc.getFirstSection().getPageSetup().setBottomMargin(80.0);}
运行截图:
2.7:设置段落标题,并且区分
/** 区分各级标题*/public static void setParagraphTitle(DocumentBuilder builder,Document doc,String title, Integer level){try {switch (level) {case 1:setTitle1(builder, title);break;case 2:setTitle2(builder, title);break;case 3:setTitle3(builder, title);break;// setText4,设置特殊标题,形状标题case 4:setTitle4(builder,doc,title);break;default:break;}} catch (Exception e) {Logger.getLogger("************制作标题"+title+"出现异常***********");throw new RuntimeException(e);}}/** * @Description: 设置段落标 一二三级。 * writeln 为每次会换行 write每次不换行 */public static void setTitle1(DocumentBuilder builder, String title) throws Exception {builder.getFont().setName("仿宋"); //字体builder.getFont().setColor(new Color(0,0,0)); //字体颜色builder.getFont().setSize(16); //三号字体 16号字大小builder.getFont().setBold(true); //标题加粗撒旦builder.getParagraphFormat().setFirstLineIndent(0); //首字不缩进builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT); //水平居中对齐; //左对齐builder.writeln(title);}public static void setTitle2(DocumentBuilder builder, String title) throws Exception {builder.getFont().setName("仿宋"); //字体builder.getFont().setColor(new Color(0,0,0)); //字体颜色builder.getFont().setSize(14); //字体大小builder.getFont().setBold(true); //标题加粗builder.getParagraphFormat().setFirstLineIndent(0); //首字不缩进builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT); //水平居中对齐; //左对齐builder.writeln(title);}public static void setTitle3(DocumentBuilder builder, String title) throws Exception {builder.getFont().setName("仿宋"); //字体builder.getFont().setColor(new Color(0,0,0)); //字体颜色builder.getFont().setSize(10); //字体大小builder.getFont().setBold(true); //标题加粗builder.getParagraphFormat().setFirstLineIndent(0); //首字不缩进builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT); //水平居中对齐; //左对齐builder.writeln(title);}public static void setTitle4(DocumentBuilder builder,Document doc,String title) throws Exception {//Shape shape = builder.insertShape(ShapeType.DIAGONAL_CORNERS_SNIPPED,RelativeHorizontalPosition.PAGE, 50,RelativeVerticalPosition.PAGE, 50,450, 30,WrapType.INLINE);Shape shape = builder.insertShape(ShapeType.DIAGONAL_CORNERS_SNIPPED,450, 37);//旋转shape.setRotation(0);//形状边框颜色shape.setStrokeColor(new Color(95, 140, 195));//形状体颜色shape.setFillColor(new Color(222, 235, 247));//在形状中插入文字Paragraph para = new Paragraph(doc);Run run =new Run(doc);run.setText(title);run.getFont().setName("仿宋");run.getFont().setSize(16); //三号字体 点数为16run.getFont().setColor(new Color(79, 128, 208));run.getFont().setBold(true); //标题加粗para.getParagraphFormat().setFirstLineIndent(0); //首字不缩进para.getParagraphFormat().setSpaceAfter(0.8);para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);para.appendChild(run);shape.appendChild(para);}
运行截图:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);/*区分设置各级标题*///设置一个 通过自定义的样式来创建的大标题(一个带有形状的标题) ,详情看运行截图setParagraphTitle(builder,doc,"这是最高级的标题",4);builder.insertParagraph();//设置一级标题setParagraphTitle(builder,doc,"这是第一个标题",1);//设置二级标题setParagraphTitle(builder,doc,"这是第二个标题",2);//设置三级标题setParagraphTitle(builder,doc,"这是第三个标题",3);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
2.6:设置各级文本格式
运行截图:
方法设置:
/** 区分各级文本*/public static void setText(DocumentBuilder builder,Object title, Integer level){try {switch (level) {// setText1 是一般用于文本第一句话,需要首行缩进2case 1:setText1(builder, title);break;// setText2 用于正常文本case 2:setText2(builder, title);break;// setText3 用于关键字 不同颜色区别case 3:setText3(builder, title);break;default:break;}} catch (Exception e) {Logger.getLogger("************制作标题"+title+"出现异常***********");throw new RuntimeException(e);}}/** * @Description: 使用DocumentBuilder 设置文本及格式 * writeln 为每次会换行 write每次不换行 * */public static void setText1(DocumentBuilder builder, Object title) throws Exception {// 清除原有设置builder.clearRunAttrs();builder.getParagraphFormat().clearFormatting();builder.getFont().setName("仿宋"); //字体builder.getFont().setColor(new Color(0,0,0)); //字体颜色builder.getFont().setSize(16); //字体大小builder.getFont().setBold(false); //标题加粗//首字缩进 2个字符 但是未生效 下方用\t\t来代替builder.getParagraphFormat().setFirstLineIndent(20.0);builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT); //水平居中对齐; //左对齐builder.write(String.valueOf("\t"+"\t"+title));}public static void setText2(DocumentBuilder builder, Object title) throws Exception {builder.getFont().setName("仿宋"); //字体builder.getFont().setColor(new Color(0,0,0)); //字体颜色builder.getFont().setSize(16); //字体大小builder.getFont().setBold(false); //标题加粗builder.getParagraphFormat().setFirstLineIndent(0); //首字不缩进//builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT); //水平居中对齐; //左对齐builder.write(String.valueOf(title));}public static void setText3(DocumentBuilder builder, Object title) throws Exception {builder.getFont().setName("仿宋"); //字体builder.getFont().setColor(new Color(80,121,206)); //字体颜色builder.getFont().setSize(16); //字体大小builder.getFont().setBold(false); //标题加粗builder.getParagraphFormat().setFirstLineIndent(0); //首字不缩进//builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT); //水平居中对齐; //左对齐builder.write(String.valueOf(title));}
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);/*区分设置各级标题*///设置一个 通过自定义的样式来创建的大标题,详情看运行截图setParagraphTitle(builder,doc,"这是最高级的标题",4);builder.insertParagraph();//设置一级标题setParagraphTitle(builder,doc,"这是第一个标题",1);/**在一级标题下的文本 首行缩进2**/setText1(builder,"雨下整夜我的爱溢出就像雨水,窗台蝴蝶像诗里纷飞的美丽章节");/**在一级标题下的文本 是关键字**/setText3(builder,"我想就这样牵着你的手不放开,爱能不能够永远单纯没有悲哀。");/**在一级标题下的文本 在紧接关键字后的文本**/setText2(builder,"最美的不是下雨天,是曾与你躲过雨的屋檐。");/*注意: 这里都没有进行换行,如果要换行使用builder.insertParagraph();*/builder.insertParagraph();setText1(builder,"我要一步一步往上爬,在最高点乘着叶片往前飞,任风吹干流过的泪和汗,总有一天我有属于我的天,");setText3(builder,"听妈妈的话别让她受伤,想快快长大才能保护她,缕缕的白发幸福总发芽,前世的魔法温暖中滋生,");setText2(builder,"请原谅我的自负,没人能说没人可说荣耀的背后刻着一道孤独。");//举一个完整的例子::builder.insertParagraph();setText1(builder,"我要一步一步往上爬, ");setText3(builder,"在最高点乘着叶片往前飞");setText2(builder,",任风吹干流过的泪和汗,总有一天我有属于我的天。");builder.insertParagraph();setText1(builder,"听, ");setText3(builder,"妈妈");setText2(builder,"的话别让她受伤,想");setText3(builder,"快快");setText2(builder,"长大才能保护她。");builder.insertParagraph();setText1(builder,"仁慈的 ");setText3(builder,"父");setText2(builder,"我已坠入,看不见");setText3(builder,"罪的国度");setText2(builder,"请原谅我的自负。");builder.insertParagraph();//设置二级标题setParagraphTitle(builder,doc,"这是第二个标题",2);//设置三级标题setParagraphTitle(builder,doc,"这是第三个标题",3);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
2.8:使用HTML、设置文本格式
也可以使用HTML格式来设置文本格式,这里只列出来方法,不进行演示了。
/** * @Description: 使用HTML 设置文本及格式 */public static void setText(DocumentBuilder builder, Object pragraph) throwsException{builder.insertHtml(" "+ pragraph +"
"); //设置字体格式}public static void setParagraph1(DocumentBuilder builder, Object pragraph) throwsException{builder.insertHtml(" "+ pragraph +"");}public static void setParagraph2(DocumentBuilder builder, Object pragraph) throwsException{builder.insertHtml(""+pragraph +""); //设置字体格式}public static void setParagraph3(DocumentBuilder builder,Object pragraph) throwsException{builder.insertHtml(""+ pragraph+""); //设置字体格式}
三:表格制作
官网教程:Table Overview|Aspose.Words for Java
本教程当中的表格制作都为制作好的成品,可直接调用, 如果需要了解具体表格制作每一步的含义,请关注博客:
3.1:添加三列单维度表格
原型:
方法设置:
/** *制作单唯独表格 * */public static void addTable(DocumentBuilder builder, Document doc, String[] headers, List rowData, Integer index) throws Exception {// 开始表格builder.startTable();// 设置表头格式添加表头addTableHeader(builder,headers);//设置表体格式setTableBodyFormat(builder);// 填充行数据for (GxyItemData data : rowData) {switch (index) {case 2:builder.insertCell();builder.write(data.getName());builder.insertCell();builder.write(data.getValue1());break;case 3 :builder.insertCell();builder.write(data.getName());builder.insertCell();builder.write(data.getValue1());builder.insertCell();builder.write(data.getValue3()+"%");break;case 4 :builder.insertCell();builder.write(data.getName());builder.insertCell();builder.write(data.getValue1());builder.insertCell();builder.write(data.getValue2());builder.insertCell();builder.write(data.getValue3()+"%");break;}builder.endRow();}// 结束表格builder.endTable();//移动光标至末尾builder.moveToDocumentEnd();}/** * 添加表头 * */private static void addTableHeader(DocumentBuilder builder, String[] headers ) throws Exception {builder.getFont().setBold(false);//段落的对齐方式设置为居中对齐builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);/**居中***///方法将清除单元格的所有格式设置,包括字体、颜色、边框等。如果您只想清除特定的格式设置,可以使用其他适当的方法,例如clearFormatting()方法的重载版本,该版本接受一个参数,用于指定要清除的格式设置类型。builder.getCellFormat().clearFormatting();//设置单元格的宽度磅(points)。builder.getCellFormat().setWidth(100.0);//这只单元格的高度磅(points)。builder.getRowFormat().setHeight(25.0);//设置单元格垂直builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);//单元格背景颜色设置builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(13, 112, 223));//单元格边框颜色设置builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));//设置字体颜色builder.getFont().setColor(new Color(255, 255, 255));//这行代码禁用单元格中的文本自动换行功能builder.getCellFormat().setWrapText(false);//这行代码启用单元格中文本的自动缩放以适应单元格大小。//builder.getCellFormat().setFitText(true);//这行代码设置行的高度规则为精确值。//builder.getRowFormat().setHeightRule(HeightRule.EXACTLY);//这行代码设置行的边框线样式为浮雕3D效果。//builder.getRowFormat().getBorders().setLineStyle(LineStyle.ENGRAVE_3_D);for (String header : headers) {builder.insertCell();builder.write(header);}builder.endRow();}/** * 设置表体的格式 * */public static void setTableBodyFormat(DocumentBuilder builder) throws Exception {//清除格式builder.getCellFormat().clearFormatting();//设置单元格垂直builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);//单元格背景颜色设置builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(209, 230, 250));//单元格边框颜色设置builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));//设置字体颜色builder.getFont().setColor(new Color(1, 1, 1));//拒绝字体加粗builder.getFont().setBold(false);//这行代码禁用单元格中的文本自动换行功能builder.getCellFormat().setWrapText(false);}
运行截图:
3.2:添加四列单维度表格
在上述3.1中的addTable()方法,根据case来选择不同列的表格创建, 方法里有2、3、4列,如果要创建一个为5列的单维度表格,可以自行添加。
3.3:动态添加四列多维度表格
原型:
所谓多维度表格通常包含多个维度, 每个维度都代表一种数据属性,多维度表格可以用于数据分析,通过不同的维度对数据进行拆分和聚合,以便更好的了解数据的分布和特征。
在本教程当中,表格是循环动态创建,多维度表示根据学院下每个专业的对口率进行统计, 小计为人数的求和还有专业对口率的平均值,总计为人数的总和还有整组数据的对口率求和。
总体的设计方法是:
- 创建模拟数据List
- 添加表头及设置表头样式
- 设置表格表体的格式
- 根据集合循环添加数据行、小计行
- 添加总计行
- 结束表格
- 移动光标至末尾
这里,我单独写了一篇文章,提供参考:
https://blog.csdn.net/LiHaoHang6/article/details/135849756
3.4:向以有表格的模板添加数据
运行效果:
四:表格制作
4.1:插入圆环图
运行截图:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();String[] label = new String[]{"男生人数","女生人数","未知人数"};double[] value = new double[]{75.0,21.5,3.6};//使用率的圆环图addDrawDoughnutChart(builder,ChartType.DOUGHNUT,"男女比例",true,label,value,true,new Color[]{new Color(147,205,221),new Color(250,192,144),new Color(230,224,236)});//使用数值的圆环图builder.insertParagraph();addDrawDoughnutChart(builder,ChartType.DOUGHNUT,"男女比例",false,label,value,true,new Color[]{new Color(147,205,221),new Color(250,192,144),new Color(230,224,236)});//使用默认颜色的圆环图builder.insertParagraph();addDrawDoughnutChart(builder,ChartType.DOUGHNUT,"男女比例",false,label,value,false,new Color[]{new Color(147,205,221),new Color(250,192,144),new Color(230,224,236)});//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
/** * 插入 圆环图或者饼图 ChartType.DOUGHNUT ChartType.PIE * 其他图形在该方法中不适用 * */public static void addDrawDoughnutChart(DocumentBuilder builder,Integer ChartType, String title, Boolean showPercent,String[] label, double[] value,Boolean colors,Color[] customColors) throws Exception {// 创建图形Shape shape = builder.insertChart(ChartType, 432, 252);// 设置图表形状的其他属性,如WrapSide、WrapType、VerticalAlignment等shape.setWrapSide(WrapSide.BOTH);shape.setWrapType(WrapType.TOP_BOTTOM);shape.setVerticalAlignment(VerticalAlignment.CENTER);shape.setHorizontalAlignment(HorizontalAlignment.CENTER);shape.setAllowOverlap(false);shape.getStroke().setColor(new Color(221, 221, 221)); // 设置线条颜色shape.getFill().setColor(new Color(222, 235, 247)); // 设置填充颜色Chart chart = shape.getChart();ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();//向形状中添加数据ChartSeries chartSeries = seriesColl.add(title, label, value);if (colors){for (int i = 0; i < label.length; i++) {// 设置系列的填充颜色为自定义颜色数组中的对应颜色chartSeries.getDataPoints().get(i).getFormat().getFill().setForeColor(customColors[i]);}}// 用于启用或禁用图表系列的数据标签seriesColl.get(0).hasDataLabels(true);// 根据参数 showPercent 决定是否显示百分比,如果为 true,则显示百分比;否则,显示Y轴值。ChartDataLabelCollection dataLabelCollection = seriesColl.get(0).getDataLabels();if (showPercent) {dataLabelCollection.setShowPercentage(true);// 则显示百分比} else {dataLabelCollection.setShowValue(true);// 显示Y轴值。}// 设置数据标签的分隔符为换行符,即每个标签显示在一行。dataLabelCollection.setSeparator("\r\n");dataLabelCollection.setShowLegendKey(true); // 是否显示图例dataLabelCollection.setShowCategoryName(true);//是否显示系列的名称在系列旁边dataLabelCollection.setShowLeaderLines(false);dataLabelCollection.setShowSeriesName(false);//是否将图形标题显示在系列名称中dataLabelCollection.setShowBubbleSize(false);// 设置段落格式的首行缩进为5个磅builder.getParagraphFormat().setFirstLineIndent(5);}
4.2:插入饼状图
运行截图:
main方法调用:
(因为饼状图和圆环图使用的方法是同一个方法,只需要将addDrawDoughnutChart方法第一个参数改为ChartType.PIE 即可。所以这里不再单独列出方法设置步骤)
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();String[] label = new String[]{"男生人数","女生人数","未知人数"};double[] value = new double[]{75.0,21.5,3.6};//使用率的饼状图addDrawDoughnutChart(builder,ChartType.PIE,"男女比例",true,label,value,true,new Color[]{new Color(147,205,221),new Color(250,192,144),new Color(230,224,236)});//使用数值的饼状图builder.insertParagraph();addDrawDoughnutChart(builder,ChartType.PIE,"男女比例",false,label,value,true,new Color[]{new Color(147,205,221),new Color(250,192,144),new Color(230,224,236)});//使用默认颜色的饼状图builder.insertParagraph();addDrawDoughnutChart(builder,ChartType.PIE,"男女比例",false,label,value,false,new Color[]{new Color(147,205,221),new Color(250,192,144),new Color(230,224,236)});//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
4.3:插入单维纵向柱状图
注:纵向柱状图代表率
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();List list = new ArrayList();GxyItemData data1 = new GxyItemData();data1.setName("A专业");data1.setValue4(new double[]{0.31});list.add(data1);GxyItemData data2 = new GxyItemData();data2.setName("B专业");data2.setValue4(new double[]{0.46});list.add(data2);GxyItemData data3 = new GxyItemData();data3.setName("C专业");data3.setValue4(new double[]{0.71});list.add(data3);GxyItemData data4 = new GxyItemData();data4.setName("D专业");data4.setValue4(new double[]{0.97});list.add(data4);//单维纵向柱状图,系列名称在最下方,颜色不可变addColumnChart(builder,"专业对口率",list,1);//单维纵向柱状图,系列名称在各柱状图下方,颜色可变addColumnChart(builder,"专业对口率",list,2);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
/** * 柱状图 * */public static void addColumnChart( DocumentBuilder builder, String title,List entity,Integer tagPosition) throws Exception {Shape shape = builder.insertChart(ChartType.COLUMN, 432, 252);Chart chart = shape.getChart();chart.getAxisX().getNumberFormat().setFormatCode("0.00%");chart.getAxisY().getNumberFormat().setFormatCode("0.00%");ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();//这里tagPosition判断,如果想要系列名称在形状最下方,则是1,这样形状的颜色是随机, 如果想要系列名称在柱状图下方,则是2,这样可以设置柱状图颜色if (tagPosition==1) {String[] categories = new String[]{" "};chart.getTitle().setText(title);//标题entity.forEach(c->{seriesColl.add(c.getName(), categories,c.getValue4());});} else if (tagPosition==2) {// 使用 Stream 提取 name 并将其添加到 String[] 数组中String[] namesArray = entity.stream().map(GxyItemData::getName).toArray(String[]::new);double[] mergedArray = entity.stream().flatMapToDouble(data -> DoubleStream.of(data.getValue4())).toArray();seriesColl.add(title, namesArray,mergedArray);}for (int i = 0; i {return Arrays.stream(s.getValue4()).max().getAsDouble();}).max().getAsDouble();ChartAxis axisY = chart.getAxisY();if (maxY <= 0.5d){axisY.getScaling().setMaximum(new AxisBound(0.5));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.55d){axisY.getScaling().setMaximum(new AxisBound(0.55));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.6d){axisY.getScaling().setMaximum(new AxisBound(0.6));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.65d){axisY.getScaling().setMaximum(new AxisBound(0.65));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.7d){axisY.getScaling().setMaximum(new AxisBound(0.7));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.75d){axisY.getScaling().setMaximum(new AxisBound(0.75));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.8d){axisY.getScaling().setMaximum(new AxisBound(0.8));axisY.getScaling().setMinimum(new AxisBound(0));}else if(maxY <= 0.9d){axisY.getScaling().setMaximum(new AxisBound(0.9));axisY.getScaling().setMinimum(new AxisBound(0));}else if (maxY <= 1.0d){axisY.getScaling().setMaximum(new AxisBound(1.0));axisY.getScaling().setMinimum(new AxisBound(0));}else if (maxY <= 2.0d){axisY.getScaling().setMaximum(new AxisBound(2.0));axisY.getScaling().setMinimum(new AxisBound(1.0));}else if (maxY <= 3.0d){axisY.getScaling().setMaximum(new AxisBound(3.0));axisY.getScaling().setMinimum(new AxisBound(1.5));}else if (maxY <= 4.0d){axisY.getScaling().setMaximum(new AxisBound(4.0));axisY.getScaling().setMinimum(new AxisBound(2.5));}else if (maxY <= 5.0d){axisY.getScaling().setMaximum(new AxisBound(5.0));axisY.getScaling().setMinimum(new AxisBound(4.0));}}
4.4:插入单维横向柱状图
注:横向柱状图代表数值
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();List list = new ArrayList();GxyItemData data1 = new GxyItemData();data1.setName("张三专业");data1.setValue4(new double[]{92});list.add(data1);GxyItemData data2 = new GxyItemData();data2.setName("李四专业");data2.setValue4(new double[]{16});list.add(data2);GxyItemData data3 = new GxyItemData();data3.setName("王五专业");data3.setValue4(new double[]{79});list.add(data3);GxyItemData data4 = new GxyItemData();data4.setName("妈的专业");data4.setValue4(new double[]{97});list.add(data4);//单维横向柱状图,按照数值进行倒叙addBarChart(builder,"专业对口率","专业名称",list,1);//单维横向柱状图,按照名称进行排序addBarChart(builder,"专业对口率","专业名称",list,2);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
/** * 横向柱状图,数值,不是率 * sortType 排序方式 * */public static void addBarChart( DocumentBuilder builder, String title,String seriesName,List entity,Integer sortType) throws Exception {Shape shape = builder.insertChart(ChartType.BAR, 432, 252);Chart chart = shape.getChart();chart.getTitle().setText(title);//标题ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();if (sortType==1){//因为把数据都放在数组之后向形状中添加是按照顺序的,这样就会导致原本第一条数据变成最后一条,这里先按照value4进行升序。这样先添加的就会是最后一条entity.sort(Comparator.comparingDouble(item ->Arrays.stream(item.getValue4()).sum()));}else if (sortType == 2) {Collections.sort(entity, Comparator.comparing(GxyItemData::getName));}String[] namesArray = entity.stream().map(GxyItemData::getName).toArray(String[]::new);double[] mergedArray = entity.stream().flatMapToDouble(data -> DoubleStream.of(data.getValue4())).toArray();seriesColl.add(seriesName, namesArray,mergedArray);for (int i = 0; i {return Arrays.stream(s.getValue4()).max().getAsDouble();}).max().getAsDouble();ChartAxis axisY = chart.getAxisY();if (maxY <= 1.0d){axisY.getScaling().setMaximum(new AxisBound(1.0));axisY.getScaling().setMinimum(new AxisBound(0));}else if (maxY <= 2.0d){axisY.getScaling().setMaximum(new AxisBound(2.0));axisY.getScaling().setMinimum(new AxisBound(1.0));}else if (maxY <= 3.0d){axisY.getScaling().setMaximum(new AxisBound(3.0));axisY.getScaling().setMinimum(new AxisBound(1.5));}else if (maxY <= 4.0d){axisY.getScaling().setMaximum(new AxisBound(4.0));axisY.getScaling().setMinimum(new AxisBound(2.5));}else if (maxY <= 5.0d){axisY.getScaling().setMaximum(new AxisBound(5.0));axisY.getScaling().setMinimum(new AxisBound(4.0));}}
4.5:插入多维柱状图1
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();//统一安排对比double[] onObeyRate = new double[]{57.58,86.39};//自主联系对比double[] autoJobRate = new double[]{42.42,13.61};createChart(builder,"实习方式对比","自主联系","统一安排","A平台","B平台",autoJobRate,onObeyRate);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
public static void createChart(DocumentBuilder builder, String caption, String title1, String title2, String schoolName1, String schoolName2, double[] valueArr1, double[] valueArr2)throws Exception {Shape shape = builder.insertChart(ChartType.COLUMN, 432, 252);Chart chart = shape.getChart();chart.getTitle().setText(caption);ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();seriesColl.add(title1,new String[]{schoolName1,schoolName2},valueArr1);seriesColl.add(title2,new String[]{"",""},valueArr2);Iterator iterator = seriesColl.iterator();while (iterator.hasNext()) {ChartSeries series = iterator.next();ChartDataLabelCollection dataLabelCollection = series.getDataLabels();dataLabelCollection.setShowValue(true);// 显示Y轴值。dataLabelCollection.setSeparator("\r\n");Iterator iterator1 = dataLabelCollection.iterator();while (iterator1.hasNext()) {ChartDataLabel chartDataLabel = iterator1.next();chartDataLabel.setShowValue(true);chartDataLabel.setShowPercentage(true);chartDataLabel.setShowPercentage(true);}}}
4.6:插入多维柱状图2
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();//将数据转换为图表接受的格式double[] thisMonths =new double[]{78.36,98.14,56.25,68.24};double[] lastMonths =new double[]{98.51,14.74,57.25,78.24};String[] names = {"三方协议","实习保险","专业匹配率","上岗率"};//多维柱状图createChart3(builder,"备案过程数据统计","11月","12月",names[0],names[1],names[2],names[3],thisMonths,lastMonths);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
public static void createChart3(DocumentBuilder builder, String caption, String title1, String title2, String name1, String name2,String name3,String name4, double[] valueArr1, double[] valueArr2)throws Exception {Shape shape = builder.insertChart(ChartType.COLUMN, 432, 252);Chart chart = shape.getChart();chart.getTitle().setText(caption);ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();seriesColl.add(title1,new String[]{name1,name2,name3,name4},valueArr1);seriesColl.add(title2,new String[]{"","","",""},valueArr2);Iterator iterator = seriesColl.iterator();while (iterator.hasNext()) {ChartSeries series = iterator.next();//将图表中的折现设置为平滑series.setSmooth(true);ChartDataLabelCollection dataLabelCollection = series.getDataLabels();dataLabelCollection.setShowValue(true);Iterator iterator1 = dataLabelCollection.iterator();while (iterator1.hasNext()) {ChartDataLabel chartDataLabel = iterator1.next();chartDataLabel.setShowValue(true);chartDataLabel.setShowPercentage(true);chartDataLabel.setShowPercentage(true);}}//数据标签显示在顶上chart.getLegend().setPosition(LegendPosition.TOP);chart.getTitle().setShow(true);chart.getTitle().setText(caption);//不覆盖 选择数据标题不覆盖在图形标题上 不然会字体重合chart.getTitle().setOverlay(false);chart.getLegend().setOverlay(false);builder.getParagraphFormat().setFirstLineIndent(2);}
4.7:插入多维柱状图3
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();String[] BATCHNAME = new String[] {"2022","2023","2024"};//此部分为模拟数据生产环境数据value4请按照BATCHNAME[]进行排序List list = new ArrayList();GxyItemData data = new GxyItemData();data.setName2("A院系->{99,98,97}");data.setValue4(new double[] {99,98,97});GxyItemData data2 = new GxyItemData();data2.setName2("B院系->{87,75,100}");data2.setValue4(new double[] {87,75,100});GxyItemData data3 = new GxyItemData();data3.setName2("C院系->{59,89,95}");data3.setValue4(new double[] {59,89,95});GxyItemData data4 = new GxyItemData();data4.setName2("D院系->{75,82,19}");data4.setValue4(new double[] {75,82,19});list.add(data);list.add(data2);list.add(data3);list.add(data4);setBarChart(builder,"各院系上岗率近三年对比",BATCHNAME,list,410,640);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
public static void setBarChart(DocumentBuilder builder,String title,String[] categories,List entity,double width,double height) throws Exception {Shape shape = builder.insertChart(ChartType.BAR, width, height);Chart chart = shape.getChart();chart.getTitle().setText(title);//标题ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();entity.forEach(c->{c.setValue4(c.getValue4()==null" /> iterator1 = dataLabelCollection.iterator();while (iterator1.hasNext()) {ChartDataLabel chartDataLabel = iterator1.next();chartDataLabel.setShowValue(true);//在图形当中显示值//chartDataLabel.setShowLegendKey(true); 在图形中显示出来横坐标的K//chartDataLabel.setShowLeaderLines(true); //添加引导线//chartDataLabel.setShowCategoryName(true); 在图形当中显示纵坐标值//chartDataLabel.setShowPercentage(true);//如果是百分比显示百分比值//chartDataLabel.setShowSeriesName(true);//在图形当中显示名字//chartDataLabel.setSeparator("/");// 分隔符,比如在图形当中既显示值又显示名字他们中间的分隔符//chartDataLabel.setShowBubbleSize(true);//显示纵坐标(数量);//chartDataLabel.setShowDataLabelsRange(true);}}ChartAxis axisY = chart.getAxisY();if (maxY <= 100d){axisY.getScaling().setMaximum(new AxisBound(100.0));axisY.getScaling().setMinimum(new AxisBound(1));}else if (maxY <= 200d){axisY.getScaling().setMaximum(new AxisBound(200.0));axisY.getScaling().setMinimum(new AxisBound(100));}else if (maxY <= 300d){axisY.getScaling().setMaximum(new AxisBound(300.0));axisY.getScaling().setMinimum(new AxisBound(20));}else if (maxY <= 400d){axisY.getScaling().setMaximum(new AxisBound(400.0));axisY.getScaling().setMinimum(new AxisBound(300));}elseif (maxY <= 500d){axisY.getScaling().setMaximum(new AxisBound(500.0));axisY.getScaling().setMinimum(new AxisBound(400));}elseif (maxY <= 600d){axisY.getScaling().setMaximum(new AxisBound(600.0));axisY.getScaling().setMinimum(new AxisBound(500));}elseif (maxY <= 1000d){axisY.getScaling().setMaximum(new AxisBound(1000.0));axisY.getScaling().setMinimum(new AxisBound(800));}elseif (maxY <= 1500d){axisY.getScaling().setMaximum(new AxisBound(1500.0));axisY.getScaling().setMinimum(new AxisBound(800));}elseif (maxY <= 2000d){axisY.getScaling().setMaximum(new AxisBound(2000.0));axisY.getScaling().setMinimum(new AxisBound(8000));}elseif (maxY <= 2500d){axisY.getScaling().setMaximum(new AxisBound(2500.0));axisY.getScaling().setMinimum(new AxisBound(1000));}elseif (maxY <= 3000d){axisY.getScaling().setMaximum(new AxisBound(3000.0));axisY.getScaling().setMinimum(new AxisBound(1000));}elseif (maxY <= 3500d){axisY.getScaling().setMaximum(new AxisBound(3500.0));axisY.getScaling().setMinimum(new AxisBound(1000));}elseif (maxY <= 4000d){axisY.getScaling().setMaximum(new AxisBound(4000.0));axisY.getScaling().setMinimum(new AxisBound(1000));}elseif (maxY <= 4500d){axisY.getScaling().setMaximum(new AxisBound(4500.0));axisY.getScaling().setMinimum(new AxisBound(1000));}
4.8:插入折线图
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();List list = new ArrayList();GxyItemData data = new GxyItemData();data.setIndex(00);data.setName("2021-2022");data.setName2("A院系");data.setValue2("15");data.setValue1("100");data.setValue4(new double[] {0.32,0.56,0.77});GxyItemData data2 = new GxyItemData();data2.setIndex(01);data2.setName("2021-2022");data2.setName2("B院系");data2.setValue2("90");data2.setValue1("200");data2.setValue4(new double[] {0.21,0.47,1.0});GxyItemData data3 = new GxyItemData();data3.setIndex(03);data3.setName("2021-2022");data3.setName2("C院系");data3.setValue2("80");data3.setValue1("300");data3.setValue4(new double[] {0.3,0.89,0.95});GxyItemData data4 = new GxyItemData();data4.setIndex(03);data4.setName("2021-2022");data4.setName2("D院系");data4.setValue2("100");data4.setValue1("300");data4.setValue4(new double[] {0.17,0.38,0.50});list.add(data);list.add(data2);list.add(data3);list.add(data4);String[] BATCHNAMES = new String[] {"2022","2023","2024"};//折线图,率维度addLineChart(builder,"近三年上岗率对比",BATCHNAMES,list,1);//折线图,数值维度builder.insertParagraph();addLineChart(builder,"近三年上岗率对比",BATCHNAMES,list,2);//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
/** * 折线图 * Integer tagPosition ==1为求率,Integer tagPosition ==2为求薪资 * */public static void addLineChart(DocumentBuilder builder, String title, String[] categories, List entity,Integer tagPosition) throws Exception {Shape shape = builder.insertChart(ChartType.LINE, 432, 252);shape.setWrapSide(WrapSide.BOTH);shape.setWrapType(WrapType.TOP_BOTTOM);shape.setVerticalAlignment(VerticalAlignment.CENTER);shape.setHorizontalAlignment(HorizontalAlignment.CENTER);shape.setAllowOverlap(false);shape.getStroke().setColor(new Color(221, 221, 221)); // 设置线条颜色shape.getFill().setColor(new Color(222, 235, 247)); // 设置填充颜色Chart chart = shape.getChart();chart.getTitle().setText(title);if (tagPosition==1){chart.getAxisX().getNumberFormat().setFormatCode("0.00%");chart.getAxisY().getNumberFormat().setFormatCode("0.00%");}ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();entity.forEach(c -> { c.setValue4(c.getValue4() == null " />
4.9:插入雷达图
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();List list = new ArrayList();GxyItemData data = new GxyItemData();data.setName("A院系");data.setValue4(new double[] {81,90,65,55,77});GxyItemData data2 = new GxyItemData();data2.setName("B院系");data2.setValue4(new double[] {84,75,25,64,45});GxyItemData data3 = new GxyItemData();data3.setName("C院系");data3.setValue4(new double[] {67,55,15,34,88});list.add(data);list.add(data2);list.add(data3);//数据标签String[] categories = new String[] { "对口率", "上岗率", "签到率", "绑定率", "完成率"};// 创建雷达图addDrawRadarChart(builder, categories, list,false );//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
/** * 插入雷达图 */public static void addDrawRadarChart(DocumentBuilder builder,String[] categories,List entity, Boolean showPercent) throws Exception {// 创建图形Shape shape = builder.insertChart(ChartType.RADAR, 452, 282);// 设置图表形状的其他属性,如WrapSide、WrapType、VerticalAlignment等shape.setWrapSide(WrapSide.BOTH);shape.setWrapType(WrapType.TOP_BOTTOM);shape.setVerticalAlignment(VerticalAlignment.CENTER);shape.setHorizontalAlignment(HorizontalAlignment.CENTER);shape.setAllowOverlap(false);shape.getStroke().setColor(new Color(221, 221, 221)); // 设置线条颜色shape.getFill().setColor(new Color(222, 235, 247)); // 设置填充颜色Chart chart = shape.getChart();ChartSeriesCollection seriesColl = chart.getSeries();seriesColl.clear();//添加数据entity.forEach(c->{chart.getSeries().add(c.getName(),categories,c.getValue4());});// 用于启用或禁用图表系列的数据标签seriesColl.get(0).hasDataLabels(true);// 根据参数 showPercent 决定是否显示百分比,如果为 true,则显示百分比;否则,显示Y轴值。ChartDataLabelCollection dataLabelCollection = seriesColl.get(0).getDataLabels();if (showPercent) {dataLabelCollection.setShowPercentage(true);// 则显示百分比} else {dataLabelCollection.setShowValue(true);// 显示Y轴值。}// 设置数据标签的分隔符为换行符,即每个标签显示在一行。dataLabelCollection.setSeparator("\r\n");//dataLabelCollection.setShowLegendKey(true); // 是否显示图例//dataLabelCollection.setShowCategoryName(true);//是否显示系列的名称在系列旁边dataLabelCollection.setShowLeaderLines(false);dataLabelCollection.setShowSeriesName(false);//是否将图形标题显示在系列名称中dataLabelCollection.setShowBubbleSize(false);// 设置段落格式的首行缩进为5个磅builder.getParagraphFormat().setFirstLineIndent(5);Color[] Colors = new Color[]{new Color(249,106,106, 99),new Color(249,213,109),new Color(91,155,213),new Color(106,249,102),new Color(234, 30, 10, 79),new Color(251,165,251),new Color(106,213,249),new Color(142,233,242),new Color(255,192,0),new Color(107,107,250),new Color(241, 131, 5),new Color(249,106,243),new Color(112,173,70),new Color(255,255,0),new Color(234, 174, 174)};for (int i = 0; i < seriesColl.getCount(); i++) {ChartSeries series = seriesColl.get(i);//单独设置每个系列的颜色series.getFormat().getStroke().setColor(Colors[i]);series.hasDataLabels(true);dataLabelCollection.setShowValue(true);if (showPercent){dataLabelCollection.getNumberFormat().setFormatCode("0.00%");}dataLabelCollection.setSeparator("\r\n");}}
4.10:插入词云图
运行效果:
五:进阶操作
5.1:向文档添加水印(文档每页循环添加)
运行效果:
main方法调用:
public static void main(String[] args) throws Exception {//通过Document空的构造函数,创建一个新的空的文档,如果有参数则是根据模板加载文档。Document doc = new Document("output/school_template.docx");//动态增加内容 获取光标,这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)DocumentBuilder builder = new DocumentBuilder(doc);//将光标移动到文档末端builder.moveToDocumentEnd();//分页builder.insertBreak(BreakType.PAGE_BREAK);//换行builder.insertParagraph();//向文档添加水印(文档每页循环添加)insertWatermarkText( doc, "CSDN 李指导、" );//文件命名String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";//文件保存doc.save(fileName);}
方法设置:
/** * 加文字水印方法 * CSDN 李指导、 * @param doc word文件流 * @param watermarkText 水印内容 */public static void insertWatermarkText(Document doc, String watermarkText) {// 居中insertWatermarkText( doc, watermarkText, new Function() {@Overridepublic Object apply(Shape watermark) {// Place the watermark in the page center.watermark.setRelativeHorizontalPosition( RelativeHorizontalPosition.PAGE );watermark.setRelativeVerticalPosition( RelativeVerticalPosition.PAGE );watermark.setWrapType( WrapType.NONE );watermark.setVerticalAlignment( VerticalAlignment.CENTER );watermark.setHorizontalAlignment( HorizontalAlignment.CENTER );return null;}} );// 顶部insertWatermarkText( doc, watermarkText, new Function() {@Overridepublic Object apply(Shape watermark) {watermark.setRelativeHorizontalPosition( RelativeHorizontalPosition.MARGIN );watermark.setRelativeVerticalPosition( RelativeVerticalPosition.MARGIN );watermark.setWrapType( WrapType.NONE );//我们需要自定义距离顶部的高度watermark.setVerticalAlignment( VerticalAlignment.TOP );watermark.setHorizontalAlignment( HorizontalAlignment.CENTER );//watermark.setTop(120);return null;}} );//尾部insertWatermarkText( doc, watermarkText, new Function() {@Overridepublic Object apply(Shape watermark) {watermark.setRelativeHorizontalPosition( RelativeHorizontalPosition.MARGIN );watermark.setRelativeVerticalPosition( RelativeVerticalPosition.MARGIN );watermark.setWrapType( WrapType.NONE );// 我们需要自定义距离顶部的高度watermark.setVerticalAlignment( VerticalAlignment.BOTTOM );watermark.setHorizontalAlignment( HorizontalAlignment.CENTER );// 设置距离顶部的高度// watermark.setTop(480);return null;}} );}/** * 插入文本水印 * */private static void insertWatermarkText(Document doc, String watermarkText, Function watermaskPositionConfigFunc) {Shape watermark = new Shape( doc, ShapeType.TEXT_PLAIN_TEXT );watermark.getTextPath().setText( watermarkText );// 这里设置为宋体可以保证在转换为PDF时中文不是乱码.watermark.getTextPath().setFontFamily( "WeiRuanYaHei" );//WeiRuanYaHei 宋体try {// 水印大小watermark.setWidth( 150 );watermark.setHeight( 30 );} catch (Exception e) {throw new RuntimeException( e );}// 左下到右上watermark.setRotation( -20 );//字体RGB颜色final String colorStr = "EE8262";watermark.getFill().setColor( new java.awt.Color( Integer.parseInt( colorStr, 16 ) ) );watermark.setStrokeColor( new java.awt.Color( Integer.parseInt( colorStr, 16 ) ) );watermaskPositionConfigFunc.apply( watermark );Paragraph watermarkPara = new Paragraph( doc );watermarkPara.appendChild( watermark );for (Section sect : doc.getSections()) {insertWatermarkIntoHeader( watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY );}}private static void insertWatermarkIntoHeader(Paragraph watermarkPara, Section sect, int headerType) {HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType( headerType );if (header == null) {header = new HeaderFooter( sect.getDocument(), headerType );sect.getHeadersFooters().add( header );}try {header.appendChild( watermarkPara.deepClone( true ) );} catch (Exception e) {throw new RuntimeException( e );}}
本博客将持续更新, 请点赞收藏转发,一键三连, 老板赚大钱
参考链接:
Aspose Documentation
最新无水印包(一键三联后私信免费取):Aspose.Word For JAVA 24.02 无水印