全网最全Aspose.Words For JAVA 高级使用教程:
CSDNhttps://blog.csdn.net/LiHaoHang6/article/details/133989664?spm=1001.2014.3001.5501
运行截图:
- 所谓多维度表格通常包含多个维度, 每个维度都代表一种数据属性,多维度表格可以用于数据分析,通过不同的维度对数据进行拆分和聚合,以便更好的了解数据的分布和特征。
- 在本教程当中,表格是循环动态创建,多维度表示根据学院下每个专业的对口率进行统计, 小计为人数的求和还有专业对口率的平均值,总计为人数的总和还有整组数据的对口率求和。
- 这个表格不是创建出来样式再去填充数据,而是根据数据循环动态的创建出来表格,这样可灵活性高,用于多数据集合。
总体的设计方法是
- 创建模拟数据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;
}
}