Aspose.Words For JAVA 动态制作多维度表格(涵2024最新无水印包)

news2024/11/23 13:18:25

 全网最全Aspose.Words For JAVA 高级使用教程:

CSDNicon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/133989664?spm=1000.2115.3001.5352

 运行截图:

  1.  所谓多维度表格通常包含多个维度, 每个维度都代表一种数据属性,多维度表格可以用于数据分析,通过不同的维度对数据进行拆分和聚合,以便更好的了解数据的分布和特征。
  2.  在本教程当中,表格是循环动态创建,多维度表示根据学院下每个专业的对口率进行统计, 小计为人数的求和还有专业对口率的平均值,总计为人数的总和还有整组数据的对口率求和。
  3. 这个表格不是创建出来样式再去填充数据,而是根据数据循环动态的创建出来表格,这样可灵活性高,用于多数据集合。

   总体的设计方法是

  •  创建模拟数据List<tabularData>
  •  添加表头及设置表头样式
  • 设置表格表体的格式
  • 根据集合循环添加数据行、小计行
  • 添加总计行
  • 结束表格
  • 移动光标至末尾

制作流程:

本章节所有都在一个类当中进行, 包含两个字类和多个方法。简单明了, 文末涵代码

1.Main 方法看整体流程:

        在main方法当中, 具体的创建文档和保存以及如何具体加载Aspose.Word For java 2024 SDK的步骤在:(全网最全Aspose.Words For JAVA 教程)https://blog.csdn.net/LiHaoHang6/article/details/133989664

2:创建数据对象

3.添加四列的动态表格总方法

3.1 添加表头并设置格式

3.2 设置表体的格式

 3.3 添加数据行

3.4 添加总计行

整体代码提供:

 另外可以关注这篇(全网最全Aspose.Words For JAVA 教程)https://blog.csdn.net/LiHaoHang6/article/details/133989664

import com.aspose.words.*;
import com.aspose.words.Shape;
import lombok.Data;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
 *   动态表格 方法类 测试
 * */
public class Demo3 {
    //表格中的总计比例 = (每个组织小计的比例相加/组织数)
    static double tableTotalRate = 0;
    public static void main(String[] args) throws Exception {
        // 创建文档
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        // 模拟数据
        List<tabularData> collegeDataList = getMocktabularData();
        //模拟表头
        String[] header = new String[]{"学院", "专业", "人数", "对口率"};
        addFourRowDataTable(builder, header, collegeDataList);

        // 保存文档
        String fileName = "output/AsposeWord1" + new SimpleDateFormat("MMddHHmmss").format(new Date()) + ".docx";
        doc.save(fileName);

    }
  /**********************************************************************************************************/

    /**
     * 添加四列的动态表格
     * */
    private static void addFourRowDataTable(DocumentBuilder builder,String[] header,List<tabularData> collegeDataList) throws Exception {
        // 添加表格
        builder.startTable();
        // 添加表头并设置格式
        addTableHeader(builder,header);
        //设置表体的格式
        setTableBodyFormat(builder);
        // 根据集合循环添加数据行
        for (tabularData collegeData : collegeDataList) {
            addDataRow(builder, collegeData);
        }
        // 添加总计行
        addTotalRow(builder, collegeDataList);
        // 结束表格
        builder.endTable();
        //移动光标至末尾
        builder.moveToDocumentEnd();
    }
    /**
     * 添加数据行
     * */
    private static void addDataRow(DocumentBuilder builder, tabularData collegeData) throws Exception {
        //开始表格
        builder.insertCell();
        builder.write(collegeData.getFirstName());
        //垂直向下合并
        builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
        // 第二层循环开始循环添加每个组织下的下层组织
        for (int i =0;i <collegeData.getTableBodyDataList().size(); i++){
            //因为第一列要作为水平合并,所以判断
            if (i!=0){
                builder.insertCell();
                builder.write("");
                builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
            }
            //添加组织
            builder.insertCell();builder.write(collegeData.getTableBodyDataList().get(i).getName());
            builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
            //添加组织内统计值
            builder.insertCell();builder.write(String.valueOf(collegeData.getTableBodyDataList().get(i).getCount()));
            builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
            //添加组织内比例
            builder.insertCell();builder.write(String.format("%.2f%%", collegeData.getTableBodyDataList().get(i).getRate()));
            builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
            builder.endRow();
        }
        // 添加小计行
        builder.insertCell();builder.write("");
        builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
        builder.insertCell();builder.write("小计");
        builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
        //人数总和
        builder.insertCell();builder.write(String.valueOf(collegeData.getSubtotalStudentCount()));
        builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
        //比例平均
        builder.insertCell();
        double dataRowRate =collegeData.getSubtotalMatchingRate()/collegeData.getTableBodyDataList().size();
        builder.write(String.format("%.2f%%",dataRowRate));
        builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
        //这里要把每次循环的小计值累加,以便最后求总计
        tableTotalRate+=dataRowRate;
        builder.endRow();
    }

    /**
     * 添加总计
     * */
    private static void addTotalRow(DocumentBuilder builder, List<tabularData> collegeDataList) throws Exception {
        //添加单元格
        builder.insertCell();builder.write("总计");
        //因为总计这一行没有那么多的单元格,所以要水平合并
        builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
        builder.insertCell();builder.write("");
        builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
        //将之前小计的人数求和
        int totalCount = collegeDataList.stream().mapToInt(tabularData::getSubtotalStudentCount).sum();

        builder.insertCell();
        builder.write(String.valueOf(totalCount));
        builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);

        builder.insertCell();
        builder.write(String.valueOf(String.format("%.2f%%",tableTotalRate/collegeDataList.size())));
        builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
        builder.endRow();
    }

    /**
     * 添加表头
     * */
    private static void addTableHeader(DocumentBuilder builder, String[] headers ) throws Exception {
        //段落的对齐方式设置为居中对齐
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);/**居中***/
        //方法将清除单元格的所有格式设置,包括字体、颜色、边框等。如果您只想清除特定的格式设置,可以使用其他适当的方法,例如clearFormatting()方法的重载版本,该版本接受一个参数,用于指定要清除的格式设置类型。
        builder.getCellFormat().clearFormatting();
        //设置单元格的宽度  磅(points)。
        builder.getCellFormat().setWidth(70.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.getCellFormat().setWrapText(false);
    }


    //下列代码提前模拟好了三个学院的数据,可以参考
    private static List<tabularData> getMocktabularData() {
        return Arrays.asList(
                new tabularData("大西洋赛区", Arrays.asList(
                        new TableBodyData("顿凯尔特人专业/高职", 500, 85.47),
                        new TableBodyData("篮网专业/高职", 400, 90.07),
                        new TableBodyData("尼克斯专业/高职", 300, 79.54),
                        new TableBodyData("76人专业/高职", 200, 83.27)
                )),
                new tabularData("中部赛区", Arrays.asList(
                        new TableBodyData("公牛专业/高职", 300, 85.47),
                        new TableBodyData("骑士专业/高职", 200, 90.07),
                        new TableBodyData("活塞专业/高职", 100, 79.54)
                )),
                new tabularData("太平洋赛区", Arrays.asList(
                        new TableBodyData("湖人专业/高职", 200, 83.27),
                        new TableBodyData("勇士专业/高职", 100, 85.47),
                        new TableBodyData("太阳专业/高职", 50, 90.07)
                ))
        );


    }
}
/*表格对象, tabularData和TableBodyData 的关系是一对多, 这样就可以满足表格的设计,一个院系下有多个专业*/
@Data
class tabularData {
    //表格第一列的名称
    private String firstName;
    private List<TableBodyData> tableBodyDataList;

    public tabularData(String firstName, List<TableBodyData> majorDataList) {
        this.firstName = firstName;
        this.tableBodyDataList = majorDataList;
    }

    //方法用于计算小计的人数总和
    public int getSubtotalStudentCount() {
        return tableBodyDataList.stream().mapToInt(TableBodyData::getCount).sum();
    }
    //方法用于计算小计的率总和
    public double getSubtotalMatchingRate() {
        return tableBodyDataList.stream().mapToDouble(TableBodyData::getRate).sum();
    }
}

/*表体对象*/
@Data
class TableBodyData {
    private String name;
    private int count;
    private double rate;
    public TableBodyData(String name, int count, double rate) {
        this.name = name;
        this.count = count;
        this.rate = rate;
    }
}

 运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1457814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目

前言 本节内容我们使用另外一种方式pipeline实现项目的流水线部署发布&#xff0c;Jenkins Pipeline是一种允许以代码方式定义持续集成和持续交付流水线的工具。通过Jenkins Pipeline&#xff0c;可以将整个项目的构建、测试和部署过程以脚本的形式写入Jenkinsfile中&#xff…

给label-studio 配置sam(segment anything)ml 记录

给label-studio 配置sam&#xff08;segment anything&#xff09;ml 后端记录 配置ml后台下载代码下载模型文件创建环境模型转换后端服务启动 配置label-studio 前端配置模型后端连接配置标注模板标注界面使用 参考链接 配置ml后台 下载代码 git clone https://github.com/H…

qt for python创建UI界面

现在很多库都有用到python,又想使用QT creater创作界面&#xff0c;来使用。 1.使用的版本 使用虚拟机安装Ubuntu22.04&#xff0c;Ubuntu使用命令行安装qt,默认安装的是QT5&#xff0c;不用来回调了&#xff0c;就用系统默认的吧&#xff0c;不然安装工具都要费不少事情。pyt…

展示用HTML编写的个人简历信息

展示用HTML编写的个人简历信息 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

【前端素材】几款实用的后台管理系统html模板(附带源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

政安晨:【完全零基础】认知人工智能(五)【超级简单】的【机器学习神经网络】 —— 数据训练

回顾 作为这个系列文章的最后一篇&#xff0c;咱们先回顾一下建立神经网络的整体步骤&#xff0c;以实现对机器学习神经网络的整体认知&#xff1a; 在人工智能领域中&#xff0c;机器学习神经网络的数据训练部分是指通过将大量的输入数据输入到神经网络中&#xff0c;利用反…

如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十一章 基础界面开发 (组件封装和使用)

前言 Vue 是前端开发中非常常见的一种框架&#xff0c;它的易用性和灵活性使得它成为了很多开发者的首选。而在 Vue2 版本中&#xff0c;组件的开发也变得非常简单&#xff0c;但随着 Vue3 版本的发布&#xff0c;组件开发有了更多的特性和优化&#xff0c;为我们的业务开发带…

IDEA报错:无法自动装配。找不到 ... 类型的 Bean。

今天怎么遇见这么多问题。 注&#xff1a;似乎只有在老版本的IDEA中这个报错是红线&#xff0c;新版的IDEA就不是红线了&#xff08;21.2.2是红的&#xff09; 虽然会报错无法自动装配&#xff0c;但启动后仍能正常执行 不嫌麻烦的解决做法&#xff1a;Autowired的参数reques…

Uniapp-开发小程序

文章目录 前言一、npm run xxx —— cross-env: Permission denied解决方法&#xff08;亲测有效&#xff09;其他解决方法&#xff1a; 二、macOS 微信开发者工具选择uniapp 用 vscode 开发 总结 前言 macOS下 uniapp 开发小程序。 一、npm run xxx —— cross-env: Permissi…

对比不同Layer输出,在解码阶段消除大模型幻觉

实现方式 对比最后一层出来的logit&#xff0c;和前面Layer出来的logit&#xff0c;消除差异过大的分布&#xff0c;从而降低幻觉&#xff1a; 最后一层Layer出来的logit容易的得到&#xff1b; 选择与最后一层的logit最不相似的分布的那层结果 实现原理 也是很简单的对比…

WSL安装Ubuntu22.04,以及深度学习环境的搭建

安装WSL 安装 WSL 2 之前&#xff0c;必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。 以管理员身份打开 PowerShell 并运行&#xff1a; dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart下载 Linux 内核更…

大数据技术之 Kafka

大数据技术之 Kafka 文章目录 大数据技术之 Kafka第 1 章 Kafka 概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 Kafka 基础架构 第 2 章 Kafka 快速入门2.1 安装部署2.1.1 集群规划2.1.2 集群部署2.1.3 集群启停脚本 2.2 Kafka 命令行操作…

Linux中信号机制

信号机制 信号的概念 概念&#xff1a;信号是在软件层次上对中断机制的一种模拟&#xff0c;是一种异步通信方式 所有信号的产生及处理全部都是由内核完成的信号的产生&#xff1a; 1 按键产生 2 系统调用函数产生&#xff08;比如raise&#xff0c; kill&#xff09; 3 硬件…

代码随想录刷题第36天

今天的题目都与重叠区间有关。第一题是无重叠区间https://leetcode.cn/problems/non-overlapping-intervals/description/&#xff0c;与昨天用箭射气球的逻辑相同&#xff0c;按左边界排序&#xff0c;找出重叠区间数量即可。 class Solution { public: static bool cmp(cons…

C#使用 AutoUpdater.NET 实现程序自动更新

写在前面 开发桌面应用程序的时候&#xff0c;经常会因为新增功能需求或修复已知问题&#xff0c;要求客户更新应用程序&#xff0c;为了更好的服务客户&#xff0c;通常会在程序启动时判断版本变更情况&#xff0c;如发现新版本则自动弹出更新对话框&#xff0c;提醒客户更新…

ART-Pi LoRa开发套件 不完全教程

1 前言 ART-Pi LoRa 开发套件(LSD4RFB-2EVKM0201)是利尔达科技与睿赛德科技联合出品的一套面向物联网开发者的 LoRa 产品原型设计工具包&#xff0c;搭配ART-Pi主板使用&#xff0c;支持利尔达全系 LoRa 节点与网关模块&#xff0c;拥有丰富的可选配件&#xff0c;用户 可按需…

普中51单片机学习(十一)

独立按键 独立按键原理 按键在闭合和断开时触电存在抖动现象 硬件消抖电路如下 实验代码 #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16;void delay(u16 i) {while(i--); } sbit ledP2^0; sbit k1P3^1;void keypro() {if(k10){delay(1…

C#分部类、分割类的用法,及用分割类设计一个计算器

目录 一、涉及到的知识点 1.分部类 2.分部类主要应用在以下两个方面 3.合理使用分部类分割类 4.事件处理程序 5.Math.Ceiling方法 6.Text.Contains() 7.pictureBox.Tag属性 二、实例 1.源码 2.生成效果 在开发一些大型项目或者特殊部署时&#xff0c;可能需要…

Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

导言 关于Django&#xff0c;我已经和大家分享了一些知识&#xff0c;考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码&#xff0c;已经和本文章进行了绑定。大家可以自行下载学习&#xff0c;考虑到一些伙伴是初学者&#xff0c;几年前&#…