环境:Aspose.Words For Java 20.7 jar 、JAVA JDK8
问题,当我创建好表格之后发现表格创建后第一行表头和第二行表格的宽度无法统一,向大佬们请教。
原型文档如下:
image.png (69.3 KB)
我创建后的表格如下:
image.png (52.4 KB)
注明:因为第二列专业那里一般文字较多,所以我在第二行开始将单元格宽度进行了调整,不知道是不是这里错了。
请大佬们 帮我看下,最后和原型文档一致,第三第四列宽度可以较小,第一列和第二列的宽度希望可以调整。谢谢大佬们
代码附上:
import com.aspose.words.*;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class Demo3 {
public static void main(String[] args) throws Exception {
// 创建文档
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// 模拟数据
List<CollegeData> collegeDataList = getMockCollegeData();
// 添加表格
builder.startTable();
// 添加表头
addTableHeader(builder,new String[]{"学院", "专业", "人数", "对口率"});
//设置表体的格式
setTableBodyFormat(builder);
// 添加数据行
for (CollegeData collegeData : collegeDataList) {
addDataRow(builder, collegeData);
}
// 添加总计行
//addTotalRow(builder, collegeDataList);
// 结束表格
builder.endTable();
// 保存文档
String fileName = "output/AsposeWord1"+new SimpleDateFormat("MMddHHmmss").format(new Date())+".docx";
doc.save(fileName);
}
private static void addDataRow(DocumentBuilder builder, CollegeData collegeData) throws Exception {
builder.insertCell();
builder.write(collegeData.getCollegeName());
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
for (int i =0;i <collegeData.getMajorDataList().size(); i++){
System.out.println("II: "+i+" 数据: "+collegeData.getMajorDataList().get(i).getMajorName()+" " +
collegeData.getMajorDataList().get(i).getMatchingRate()+" "+
collegeData.getMajorDataList().get(i).getStudentCount());
if (i!=0){
builder.insertCell();
builder.write("");
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
}
builder.insertCell();builder.write(collegeData.getMajorDataList().get(i).getMajorName());
builder.getCellFormat().setWidth(200.0);
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.insertCell();builder.write(String.valueOf(collegeData.getMajorDataList().get(i).getStudentCount()));
builder.getCellFormat().setWidth(50.0);
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.insertCell();builder.write(String.format("%.2f%%", collegeData.getMajorDataList().get(i).getMatchingRate()));
builder.getCellFormat().setWidth(50.0);
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();builder.write("100%");
builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
builder.endRow();
}
private static void addTotalRow(DocumentBuilder builder, List<CollegeData> collegeDataList) throws Exception {
// 添加总计行
builder.insertCell().getCellFormat().setVerticalMerge(CellMerge.FIRST);
builder.write("总计");
int totalStudentCount = collegeDataList.stream().mapToInt(CollegeData::getSubtotalStudentCount).sum();
builder.insertCell();builder.write(String.valueOf(totalStudentCount));
builder.insertCell();builder.write("100%");
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(50.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<CollegeData> getMockCollegeData() {
return Arrays.asList(
new CollegeData("商学院", Arrays.asList(
new MajorData("XXX专业/高职", 500, 85.47),
new MajorData("XXX专业/高职", 400, 90.07),
new MajorData("XXX专业/高职", 300, 79.54),
new MajorData("XXX专业/高职", 200, 83.27)
)),
new CollegeData("旅游与艺术学院", Arrays.asList(
new MajorData("XXX专业/高职", 300, 85.47),
new MajorData("XXX专业/高职", 200, 90.07),
new MajorData("XXX专业/高职", 100, 79.54)
)),
new CollegeData("金融学院", Arrays.asList(
new MajorData("XXX专业/高职", 200, 83.27),
new MajorData("XXX专业/高职", 100, 85.47),
new MajorData("XXX专业/高职", 50, 90.07)
))
);
}
}
class CollegeData {
private String collegeName;
private List<MajorData> majorDataList;
public CollegeData(String collegeName, List<MajorData> majorDataList) {
this.collegeName = collegeName;
this.majorDataList = majorDataList;
}
public String getCollegeName() {
return collegeName;
}
public List<MajorData> getMajorDataList() {
return majorDataList;
}
public int getSubtotalStudentCount() {
return majorDataList.stream().mapToInt(MajorData::getStudentCount).sum();
}
}
class MajorData {
private String majorName;
private int studentCount;
private double matchingRate;
public MajorData(String majorName, int studentCount, double matchingRate) {
this.majorName = majorName;
this.studentCount = studentCount;
this.matchingRate = matchingRate;
}
public String getMajorName() {
return majorName;
}
public int getStudentCount() {
return studentCount;
}
public double getMatchingRate() {
return matchingRate;
}
}