Aspose.Words For JAVA 高级多维动态表格自动生成教程

如有对Aspose.Words For JAVA 命令不熟悉的可以跳转下方链接:

全网最全Aspose.Words For JAVA 高级使用教程(0基础学习):

CSDN​编辑https://blog.csdn.net/LiHaoHang6/article/details/133989664?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/LiHaoHang6/article/details/133989664?spm=1001.2014.3001.5501

2024最新无水印包(一键三联后私信免下载领取):Aspose.Word For JAVA 24.02 无水印


运行效果:

原始数据:

indexgradenamevalue1
12020智能制造学院345
22020数控技术学院318
32020信息工程学院309
42020艺术学院228
52020交通学院219
62020旅游学院215
12021师范学院1251
22021计算机学院1089
32021信息工程学院735
42021财经学院641
52021数控技术学院602
62021建筑学院559
72021旅游学院441
82021交通学院401
92021航海技术学院371
102021智能制造学院368
12022数控技术学院434
22022信息工程学院149
32022交通学院30
42022建筑学院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 无水印包 联系博主免下载领取。

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李指导、

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值