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

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

CSDNicon-default.png?t=N7T8https://blog.csdn.net/LiHaoHang6/article/details/133989664?spm=1001.2014.3001.5501

 运行截图:

  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;
    }
}

 运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcgisForJS如何使用ArcGIS Server发布的切片地图服务?

文章目录 0.引言1.准备海量地理数据2.ArcGIS Server发布切片地图服务3.ArcgisForJS使用ArcGIS Server发布的切片地图服务 0.引言 ArcGIS Server是一个由Esri开发的地理信息系统&#xff08;GIS&#xff09;服务器软件&#xff0c;它提供了许多功能&#xff0c;包括发布切片地图…

Python实战:统计字符串中的英文字母、空格、数字及其他字符出现的个数

Python实战&#xff1a;统计字符串中的英文字母、空格、数字及其他字符出现的个数 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &…

Servlet使用过程中常见问题总结

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Servlet使用过程中常见问题总结 前言:笔者在学习Servlet的过程中遇到了很多问题,这里总结一下 1.乱码问题 如果我们在响应报文中传输中文"你好",那么在浏览器之中显示…

Redis中的AOF重写到底是怎么一回事

首先我们知道AOF和RDB都是Redis持久化的方法。RDB是Redis DB&#xff0c;一种二进制数据格式&#xff0c;这样就是相当于全量保存数据快照了。AOF则是保存命令&#xff0c;然后恢复的时候重放命令。 AOF随着时间推移&#xff0c;会越来越大&#xff0c;因为不断往里追加命令。…

Java基于SpringBoot+Vue的图书馆管理系统,附源码,数据库

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

一款跳转警告HTML单页模板源码

一款跳转警告HTML单页模板,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码如下 <!DOCTYPE html> <html> <!--QQ沐编程 www.q…

HarmonyOS—使用预览器查看应用/服务效果

DevEco Studio为开发者提供了UI界面预览功能&#xff0c;可以查看应用/服务的UI界面效果&#xff0c;方便开发者随时调整界面UI布局。预览器支持布局代码的实时预览&#xff0c;只需要将开发的源代码进行保存&#xff0c;就可以通过预览器实时查看应用/服务运行效果&#xff0c…

统计图玫瑰图绘制方法

统计图玫瑰图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 还有一种玫瑰图的绘制也较难&#xff0c;今提供玫瑰图的绘制方法供参考。 本方法采用C语言的最基本功能&#xff1a; &am…

axure9.0 工具使用思考

原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】…

Kafka3.x进阶

来源&#xff1a;B站 目录 Kafka生产者生产经验——生产者如何提高吞吐量生产经验——数据可靠性生产经验——数据去重数据传递语义幂等性生产者事务 生产经验——数据有序生产经验——数据乱序 Kafka BrokerKafka Broker 工作流程Zookeeper 存储的 Kafka 信息Kafka Broker 总…

预告 | 飞凌嵌入式即将亮相第八届瑞芯微开发者大会(RKDC2024)

2024年3月7~8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;将在福州举办&#xff0c;本届大会以“AI芯片AI应用AloT”为主题&#xff0c;邀请各行业的开发者共启数智化未来。 本届大会亮点颇多&#xff0c;不仅有13大芯片应用展示、9场产品和技术论坛…

洛谷 【算法1-2】排序

【算法1-2】排序 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 鄙人不才&#xff0c;刷洛谷&#xff0c;迎蓝桥&#xff0c;【算法1-2】排序 已刷&#xff0c;现将 AC 代码献上&#xff0c;望有助于各位 P1271 选举学生会 【深基9.例1】选举学生会 - 洛谷 题目 解答…

YOLOv9 | 利用YOLOv9训练自己的数据集 -> 推理、验证(源码解读 + 手撕结构图)

一、本文介绍 本文给大家带来的是全新的SOTA模型YOLOv9的基础使用教程&#xff0c;需要注意的是YOLOv9发布时间为2024年2月21日&#xff0c;截至最近的日期也没有过去几天&#xff0c;从其实验结果上来看&#xff0c;其效果无论是精度和参数量都要大于过去的一些实时检测模型&…

智能水浸传感器拆解指导,水浸传感器有哪些种类?

很多朋友听说过智能水浸传感器&#xff0c;当我们的厨房或者卫生间发生漏水&#xff0c;只要提前安装放置好一个水浸传感器&#xff0c;哪怕我们身处外地也能发现并及时处理。除此之外&#xff0c;数据中心、机房、仓库、实验室、工厂、档案馆等也是智能水浸传感器的常见应用场…

如何图片无损放大?分享两个无损放大方法

在数字化时代的洪流中&#xff0c;我们时常被细微之处的美丽所打动——那些精致的画面&#xff0c;那些清晰的细节。然而&#xff0c;随着图片的放大&#xff0c;我们常常面临一个难题&#xff1a;清晰度的损失。此时&#xff0c;图片无损放大软件能够在不损失图片质量的前提下…

宝塔面板安装了mysql5.7和phpMyadmin,但是访问phpMyadmin时提示502 Bad Gateway

操作流程截图如下&#xff1a; 原因是没有选择php版本 选择php版本 下一页找到phpMyAdmin&#xff0c;选择设置 目前只有纯净态&#xff0c;说明没有php环境&#xff0c;前去安装php环境 点击安装&#xff0c;选择版本&#xff0c;这里选择的是7.4版本&#xff0c;编译安…

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使每个算法可以相互替代&#xff0c;使算法本身和使用算法的客户端分割开来&#xff0c;相互独立。 策略模式的角色&#xff1a; 策略接口角色IStrategy&#xff1a;用来约束一系列具体…

抖音爬虫批量视频提取功能介绍|抖音评论提取工具

抖音爬虫是指通过编程技术从抖音平台上获取视频数据的程序。在进行抖音爬虫时&#xff0c;需要注意遵守相关法律法规和平台规定&#xff0c;以确保数据的合法获取和使用。 一般来说&#xff0c;抖音爬虫可以实现以下功能之一&#xff1a;批量视频提取。这个功能可以用于自动化地…

【C++精简版回顾】7.析构函数

1.析构函数 class MM { public:MM() {}MM(const char* a) {name new char[strlen(a)1];strcpy(name, a);cout << name << endl;}~MM() {delete[] name;name nullptr;cout << "调用析构函数" << endl;} private:char* name; }; int main(…

论文摘要翻译 ,论文摘要怎么翻译成英文?

论文摘要翻译在学术论文写作中扮演着至关重要的角色&#xff0c;它如同明灯&#xff0c;引领着读者快速理解论文的核心观点与目的。那么&#xff0c;如何才能将论文摘要翻译得恰到好处呢&#xff1f;这其中又蕴含着怎样的奥秘&#xff1f; 专家指出&#xff0c;摘要作为正式论文…