如有对Aspose.Words For JAVA 命令不熟悉的可以跳转下方链接:
全网最全Aspose.Words For JAVA 高级使用教程(0基础学习):
2024最新无水印包(一键三联后私信免下载领取):Aspose.Word For JAVA 24.02 无水印
运行效果:
原始数据:
index | grade | name | value1 |
1 | 2020 | 智能制造学院 | 345 |
2 | 2020 | 数控技术学院 | 318 |
3 | 2020 | 信息工程学院 | 309 |
4 | 2020 | 艺术学院 | 228 |
5 | 2020 | 交通学院 | 219 |
6 | 2020 | 旅游学院 | 215 |
1 | 2021 | 师范学院 | 1251 |
2 | 2021 | 计算机学院 | 1089 |
3 | 2021 | 信息工程学院 | 735 |
4 | 2021 | 财经学院 | 641 |
5 | 2021 | 数控技术学院 | 602 |
6 | 2021 | 建筑学院 | 559 |
7 | 2021 | 旅游学院 | 441 |
8 | 2021 | 交通学院 | 401 |
9 | 2021 | 航海技术学院 | 371 |
10 | 2021 | 智能制造学院 | 368 |
1 | 2022 | 数控技术学院 | 434 |
2 | 2022 | 信息工程学院 | 149 |
3 | 2022 | 交通学院 | 30 |
4 | 2022 | 建筑学院 | 17 |
需求原理:
1: 可以看到从数据库当中查出来了不同年级学院的数据,根据row_number()开窗函数组内排序后得到index字段。
2:根据grade将数据自动划分到不同的表格当中。
实现步骤:
1: 先在文档中自定义一个表格,表格只有表头。 2: 代码中没有去查数据库,直接使用List<GxyItemData>对象模拟了数据。 3: 将list转为根据grade分组K的map,因为要按照K去动态复制多个表格。 4: 循环map.size,根据模板当中的表格,循环创建表格。比如map.size = 3,就是模拟数据当中的2020、2021、2022。那么就根据模板里面的表格再循环复制2个出来 5: 根据K值动态生成题注 6: 循环MAP 根据索引获得表格 之后将数据根据K写入到对应的表格当中。 7: 将一个表格移动到文档中以指定字符串开头的段落之后。具体来说,该方法从文档中找到指定索引的表格,然后找到以特定字符串开头的段落,并将表格插入到该段落后面。
模板表格:
代码实现:
@Data
public class GxyItemData {
private String grade;
private Integer Index;
private Integer indexs;
private String name;
private String name2;
private String value1;
private String value2;
private double value3;
private double[] value4;
private double[] value5;
private double value6;
private double value7;
private String value8;
public void setValue(String value){
this.value1 = value;
}
public String getValue(){
return this.value1;
}
public void setValue2(String value2) {
this.value2 = value2;
}
//public GxyItemData(String grade, String name, String name2, String value1, String value2, Double value3) {
// this.grade = grade;
// this.name = name;
// this.name2 = name2;
// this.value1 = value1;
// this.value2 = value2;
// this.value3 = value3;
//}
@Override
public String toString() {
return "GxyItemData{" +
"grade='" + grade + '\'' +
", name='" + name + '\'' +
", name2='" + name2 + '\'' +
", value1=" + value1 +
", value2=" + value2 +
", value3=" + value3 +
'}';
}
}
package **.utils.AsposeWord;
import com.aspose.words.*;
import com.**.dto.GxyItemData;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
/**
* ClassName: deriveTable
* Author: CSDN 李指导、
* Create: 2024/5/20 - 动态表格,根据动态题注生成
* Version: V1.0
*/
public class deriveTable {
public static int I = 0;
public static int Q = 0;
public static void main(String[] args) throws Exception {
/**创建文档**/
//如果参数有值,则是不创建新的文档,直接引用路径中的文档
Document doc = new Document("output/school_template.docx");
//如果要以动态形式创建一个文档,最常用的方式是使用DocumentBuilder来增加内容。
DocumentBuilder builder = new DocumentBuilder(doc);
//将光标移动到该处
builder.moveToDocumentEnd();
//循环动态添加表格
createTable(builder,doc,simulatedData(),"table1","表1-",0);
//生成文件名
String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";
//保存
doc.save(fileName);
}
/** 流程
* 1: 先在文档中自定义一个表格,表格只有表头。
* 2: 代码中没有去查数据库,直接使用List<GxyItemData>对象模拟了数据。
* 3: 将list转为根据grade分组K的map,因为要按照K去动态复制多个表格。
* 4: 循环map.size,根据模板当中的表格,循环创建表格。比如map.size = 3,就是模拟数据当中的2020、2021、2022。那么就根据模板里面的表格再循环复制2个出来
* 5: 根据K值动态生成题注
* 6: 循环MAP 根据索引获得表格 之后将数据根据K写入到对应的表格当中。
* 7: 将一个表格移动到文档中以指定字符串开头的段落之后。具体来说,该方法从文档中找到指定索引的表格,然后找到以特定字符串开头的段落,并将表格插入到该段落后面。
* */
public static void createTable(DocumentBuilder builder, Document doc,List<GxyItemData> gxyItemDataList,String bookmarkName,String notes,int index) throws Exception {
//将list转为根据grade分组K的map,因为要按照K去动态复制多个表格。
Map<String,List<GxyItemData>> gxyItemDataMap = getMapData(gxyItemDataList);
I =gxyItemDataMap.size()+1;
Q =gxyItemDataMap.size()+1;
//设置题注
String str = notes+"%s %s级";
//设置书签
builder.startBookmark(bookmarkName);
/*1: 动态复制表格模板 {根据Map的长度大小来复制每行单元格}*/
if (gxyItemDataMap.size()!=0){
for (int i =0;i<gxyItemDataMap.size()-1;i++){
addtable(doc); //动态生成表格
}
}
/*2: 根据K值动态生成题注*/
gxyItemDataMap.forEach((k,v)->{
I = I - 1;
try {
writeToTitle(doc,String.format(str,I,k),bookmarkName);
} catch (Exception e) {
e.printStackTrace();
}
});
/*3: 插入数据和将表移动到题注下*/
gxyItemDataMap.forEach((k,v)->{
Q = Q - 1;
try {
//向生成表内循环添加数据
addexcel(doc,index,v);
//将表移动到各题注下
tableTotitle(doc,String.format(str,Q,k),0);
} catch (Exception e) {
e.printStackTrace();
}
});
builder.moveToDocumentEnd();//光标结束
// moveToDocumentStart 光标开始的意思是, 光标移动到文档最开始的位置
}
public static Map<String,List<GxyItemData>> getMapData(List<GxyItemData> list){
//将集合添加至Map 指定参数作为key
Map<String,List<GxyItemData>> map = new HashMap();
map = list.stream().collect(Collectors.groupingBy(GxyItemData::getGrade,Collectors.toList()));
return map;
}
/**
* @Description: 将表格定位到指定标题下
* @Param: doc、startWith、index
*/
public static void tableTotitle(Document doc, String startWith, int index) throws Exception {
// 获取文档中所有表格节点
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
if (null==tables) {
return;
}
// 获取指定索引的表格
Node tableIndex = tables.get(index);
// 获取文档中所有段落节点
NodeCollection paras = doc.getChildNodes(NodeType.PARAGRAPH, true);
if (null == paras) {
return;
}
// 查找以指定字符串开头的段落
Paragraph insertPoint = null;
for (Node node : paras.toArray()) {
Paragraph p = (Paragraph)node;
if (null!=p && p.getText().startsWith(startWith)) {
insertPoint = p;
break;
}
}
// 如果找不到以指定字符串开头的段落,返回
if (null == insertPoint) {
return;
}
// 将表格插入到找到的段落之后
insertPoint.getParentNode().insertAfter(tableIndex,insertPoint);
}
/**
* @Description: 向已有表格模板插入数据
* @Param: doc、index、List<GxyItemData>
*/
public static void addexcel(Document doc, int index, List<GxyItemData> staff)throws Exception{
//根据索引获得表格
Table table = (Table) doc.getChild(NodeType.TABLE, index, true);
for (GxyItemData staf : staff) { // 替换变量
Node deepClone = table.getLastRow().deepClone(true); //得到最后一行
Range range = table.getLastRow().getRange();//得到值
range.replace("index",String.valueOf(staf.getIndex()));
range.replace("name", staf.getName());
range.replace("value",staf.getValue1());
table.getRows().add(deepClone);
}
Node deepClone = table.getLastRow().deepClone(true); //得到最后一行
Range range = table.getLastRow().getRange();//得到值
table.getLastRow().remove();
}
/**
* @Description: 插入标题到指定书签下
* @Param: doc、str
* @return:
* @Author: lizexin
* @Date: 2021/2/25
*/
public static void writeToTitle(Document doc, String str, String bookmarkName) throws Exception {
DocumentBuilder builder = new DocumentBuilder(doc);
StyleCollection styles = doc.getStyles();
builder.moveToBookmark(bookmarkName);
builder.getFont().clearFormatting();
builder.getFont().setBold(true);
builder.getFont().setName("宋体");
builder.getFont().setSize(8);
builder.getParagraphFormat().clearFormatting();
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); //水平居中对齐; //左对齐
/* builder.getParagraphFormat().setLineSpacing(10);
builder.getParagraphFormat().setStyle(styles.get(1));*/
//builder.write(str);
builder.write("\n"+str);
}
/**
* @Description: 动态复制表格
* @Param: doc
* @return:
*/
public static void addtable(Document doc) throws Exception{
//获取第一个表格
Table table = (Table)doc.getChild(NodeType.TABLE, 0, true);
//创建段落
Paragraph lastParagraph = new Paragraph(doc);
//第一个表格末尾加段落
table.getParentNode().insertAfter(lastParagraph, table);
Table cloneTable = (Table)table.deepClone(true);
table.getParentNode().insertAfter(cloneTable,lastParagraph);
}
public static List<GxyItemData> simulatedData(){
List<GxyItemData> list = new ArrayList<>();
GxyItemData data = new GxyItemData();
data.setIndex(1);
data.setGrade("2020");
data.setName("智能制造学院");
data.setValue1("345");
list.add(data);
GxyItemData data2 = new GxyItemData();
data2.setIndex(2);
data2.setGrade("2020");
data2.setName("数控技术学院");
data2.setValue1("318");
list.add(data2);
GxyItemData data3 = new GxyItemData();
data3.setIndex(3);
data3.setGrade("2020");
data3.setName("信息工程学院");
data3.setValue1("309");
list.add(data3);
GxyItemData data4 = new GxyItemData();
data4.setIndex(4);
data4.setGrade("2020");
data4.setName("艺术学院");
data4.setValue1("228");
list.add(data4);
GxyItemData data5 = new GxyItemData();
data5.setIndex(5);
data5.setGrade("2020");
data5.setName("交通学院");
data5.setValue1("219");
list.add(data5);
GxyItemData data6 = new GxyItemData();
data6.setIndex(6);
data6.setGrade("2020");
data6.setName("旅游学院");
data6.setValue1("215");
list.add(data6);
GxyItemData data7 = new GxyItemData();
data7.setIndex(1);
data7.setGrade("2021");
data7.setName("师范学院");
data7.setValue1("1251");
list.add(data7);
GxyItemData data8 = new GxyItemData();
data8.setIndex(2);
data8.setGrade("2021");
data8.setName("计算机学院");
data8.setValue1("1089");
list.add(data8);
GxyItemData data9 = new GxyItemData();
data9.setIndex(3);
data9.setGrade("2021");
data9.setName("信息工程学院");
data9.setValue1("735");
list.add(data9);
GxyItemData data10 = new GxyItemData();
data10.setIndex(4);
data10.setGrade("2021");
data10.setName("财经学院");
data10.setValue1("641");
list.add(data10);
GxyItemData data11 = new GxyItemData();
data11.setIndex(5);
data11.setGrade("2021");
data11.setName("数控技术学院");
data11.setValue1("602");
list.add(data11);
GxyItemData data12 = new GxyItemData();
data12.setIndex(6);
data12.setGrade("2021");
data12.setName("建筑学院");
data12.setValue1("559");
list.add(data12);
GxyItemData data13 = new GxyItemData();
data13.setIndex(7);
data13.setGrade("2021");
data13.setName("旅游学院");
data13.setValue1("441");
list.add(data13);
GxyItemData data14 = new GxyItemData();
data14.setIndex(8);
data14.setGrade("2021");
data14.setName("交通学院");
data14.setValue1("401");
list.add(data14);
GxyItemData data15 = new GxyItemData();
data15.setIndex(9);
data15.setGrade("2021");
data15.setName("航海技术学院");
data15.setValue1("371");
list.add(data15);
GxyItemData data16 = new GxyItemData();
data16.setIndex(10);
data16.setGrade("2021");
data16.setName("传统制造学院");
data16.setValue1("369");
list.add(data16);
GxyItemData data17 = new GxyItemData();
data17.setIndex(1);
data17.setGrade("2022");
data17.setName("数控技术学院");
data17.setValue1("434");
list.add(data17);
GxyItemData data18 = new GxyItemData();
data18.setIndex(2);
data18.setGrade("2022");
data18.setName("信息工程学院");
data18.setValue1("149");
list.add(data18);
GxyItemData data19 = new GxyItemData();
data19.setIndex(3);
data19.setGrade("2022");
data19.setName("交通学院");
data19.setValue1("30");
list.add(data19);
GxyItemData data20 = new GxyItemData();
data20.setIndex(4);
data20.setGrade("2022");
data20.setName("建筑学院");
data20.setValue1("17");
list.add(data20);
return list;
}
}
如果有看不懂的操作,或者不清楚的方法,可以跳转到下方链接:
全网最全Aspose.Words For JAVA 高级使用教程(文末涵2024最新无水印包)-CSDN博客
模板、已经Aspose.Words For Java 无水印包 联系博主免下载领取。