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

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

CSDNhttps://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

java 复制代码
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;
    }
}

运行结果:

相关推荐
坐吃山猪4 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫4 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao5 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区6 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT7 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy7 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss8 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续9 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben0449 小时前
ReAct模式解读
java·ai