运行的同样的代码为什么我的表格会突然变成这样子,另外一个是正常的
不正常表格:
正常表格:
代码中没有看出来任何问题
@Override
public int replacing(ReplacingArgs args) throws Exception {
    // 获取文档对象
    Document doc = (Document) args.getMatchNode().getDocument();
    DocumentBuilder builder = new DocumentBuilder(doc);
    // 打印捕获的内容
    Node matchNode = args.getMatchNode();
    System.out.println("Captured Node Text: " + matchNode.getText());
    // 定位到占位符
    builder.moveTo(args.getMatchNode());
    // 获取表头和数据
    List<String> headers = (List<String>) tableData.get("header"); // 表头
    List<List<Object>> tableDataList = (List<List<Object>>) tableData.get("tableDataList");// 数据集
    //合计数据
    Map summaryRowMap = (Map) tableData.get("summaryRowMap");
    if (summaryRowMap != null) {
        DocumentTableUtil.addTableAndAddSummaryRow(builder, headers, tableDataList, summaryRowMap);
    }else{
        DocumentTableUtil.addTable(builder, headers, tableDataList);
    }
    //删除占位符
    args.getMatchNode().remove();
    return ReplaceAction.SKIP; // 跳过默认替换
}
/**
 */
public class DocumentTableUtil {
    public static Table addTable(DocumentBuilder builder, List headers, List<List<Object>> rowData) throws Exception {
        // 开始表格
        Table table = builder.startTable();
        // 添加表头
        List<Double> columnWidths = new ArrayList<>();
        if (headers != null && !headers.isEmpty()) {
            addTableHeader(builder, headers, columnWidths);
        }
        if(CollectionUtils.isNotEmpty(rowData)){
            // 填充行数据
            for (int i = 0; i < rowData.size(); i++) {
                List<Object> list = rowData.get(i);
                //设置表体格式
                setTableBodyFormat(builder);
                if(CollectionUtils.isNotEmpty(list)){
                    for (int j = 0; j < list.size(); j++) {
                        builder.insertCell(); // 插入单元格
                        builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(columnWidths.get(j)));
                        Object object = list.get(j);
                        builder.write(object != null ? object.toString() : "");
                    }
                    builder.endRow();
                }
            }
        }
        builder.endTable();
        //返回表格对象
        return table;
    }
    //添加表格并且合计行
    public static Table addTableAndAddSummaryRow(DocumentBuilder builder, List headers, List<List<Object>> rowData, Map summaryRowMap) throws Exception {
        // 开始表格
        Table table = builder.startTable();
        // 设置表头格式添加表头
        // 添加表头
        // 添加表头
        List<Double> columnWidths = new ArrayList<>();
        if (headers != null && !headers.isEmpty()) {
            addTableHeader(builder, headers, columnWidths);
        }
        if (CollectionUtils.isNotEmpty(rowData)) {
            // 填充行数据
            for (int i = 0; i < rowData.size(); i++) {
                List<Object> list = rowData.get(i);
                //设置表体格式
                setTableBodyFormat(builder);
                if (CollectionUtils.isNotEmpty(list)) {
                    for (int j = 0; j < list.size(); j++) {
                        builder.insertCell(); // 插入单元格
                        builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(columnWidths.get(j)));
                        Object object = list.get(j);
                        builder.write(object != null ? object.toString() : "");
                    }
                    builder.endRow();
                }
            }
        }
        if (summaryRowMap != null) {
            Integer endMergeIndex = MapUtils.getInteger(summaryRowMap, "endMergeIndex", 0);
            String label = MapUtils.getString(summaryRowMap, "label", "合计");
            List<Object> dataList = (List<Object>) MapUtils.getObject(summaryRowMap, "dataList", new ArrayList<>());
            //addSummaryRow(builder, endMergeIndex, label, dataList, null);
            addSummaryRow(builder, endMergeIndex, label, dataList, null, columnWidths);
        }
        builder.endTable();
        //返回表格对象
        return table;
    }
    public static void addTableHeader(DocumentBuilder builder, List<String> headers) throws Exception {
        builder.getFont().setBold(false);
        // 设置表头字体样式
        builder.getFont().setSize(10); // 设置字体大小为10(可根据需要调整)
        //段落的对齐方式设置为居中对齐
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        builder.getRowFormat().setHeadingFormat(true);
        //方法将清除单元格的所有格式设置,包括字体、颜色、边框等。如果您只想清除特定的格式设置,可以使用其他适当的方法,例如clearFormatting()方法的重载版本,该版本接受一个参数,用于指定要清除的格式设置类型。
        //builder.getCellFormat().clearFormatting();
        //设置单元格的宽度  磅(points)。
        //这只单元格的高度  磅(points)。
        //builder.getRowFormat().setHeight(1);
        // 设置行的高度为自动
        builder.getRowFormat().setHeightRule(HeightRule.AUTO);
        builder.getRowFormat().setHeight(0); // 设置高度为0以便自动调整为内容高度
        //设置单元格垂直
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        //单元格背景颜色设置
        builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(128, 128, 128));
        //单元格边框颜色设置
        //builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));
        //设置字体颜色
        builder.getFont().setColor(Color.BLACK); // 设置字体颜色为黑色
        //这行代码禁用单元格中的文本自动换行功能
        //builder.getCellFormat().setWrapText(false);
        //这行代码启用单元格中文本的自动缩放以适应单元格大小。
        //builder.getCellFormat().setFitText(true);
        //这行代码设置行的高度规则为精确值。
        //builder.getRowFormat().setHeightRule(HeightRule.EXACTLY);
        //这行代码设置行的边框线样式为浮雕3D效果。
        //builder.getRowFormat().getBorders().setLineStyle(LineStyle.ENGRAVE_3_D);
        int totalCols = headers.size();
        double defaultPercent = 100.0 / totalCols;
        for (String header : headers) {
            builder.insertCell();
            String title = header;
            double percent = defaultPercent;
            // 检查是否为 header-20 形式的指定百分比宽度
            if (header.contains("-")) {
                String[] parts = header.split("-");
                if (parts.length == 2 && parts[1].matches("\\d+(\\.\\d+)?")) {
                    title = parts[0]; // 显示文字
                    percent = Double.parseDouble(parts[1]);
                }
            }
            builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(percent));
            builder.write(title);
        }
        builder.endRow();
    }
    public static void addTableHeader(DocumentBuilder builder, List<String> headers, List<Double> columnWidths) throws Exception {
        builder.getFont().setBold(false);
        // 设置表头字体样式
        builder.getFont().setSize(10); // 设置字体大小为10(可根据需要调整)
        //段落的对齐方式设置为居中对齐
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        builder.getRowFormat().setHeadingFormat(true);
        //方法将清除单元格的所有格式设置,包括字体、颜色、边框等。如果您只想清除特定的格式设置,可以使用其他适当的方法,例如clearFormatting()方法的重载版本,该版本接受一个参数,用于指定要清除的格式设置类型。
        //builder.getCellFormat().clearFormatting();
        //设置单元格的宽度  磅(points)。
        //这只单元格的高度  磅(points)。
        //builder.getRowFormat().setHeight(1);
        // 设置行的高度为自动
        builder.getRowFormat().setHeightRule(HeightRule.AUTO);
        builder.getRowFormat().setHeight(0); // 设置高度为0以便自动调整为内容高度
        //设置单元格垂直
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        //单元格背景颜色设置
        builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(128, 128, 128));
        //单元格边框颜色设置
        //builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));
        //设置字体颜色
        builder.getFont().setColor(Color.BLACK); // 设置字体颜色为黑色
        //这行代码禁用单元格中的文本自动换行功能
        //builder.getCellFormat().setWrapText(false);
        //这行代码启用单元格中文本的自动缩放以适应单元格大小。
        //builder.getCellFormat().setFitText(true);
        //这行代码设置行的高度规则为精确值。
        //builder.getRowFormat().setHeightRule(HeightRule.EXACTLY);
        //这行代码设置行的边框线样式为浮雕3D效果。
        //builder.getRowFormat().getBorders().setLineStyle(LineStyle.ENGRAVE_3_D);
        int totalCols = headers.size();
        double totalAssignedPercent = 0;
        for (int i = 0; i < totalCols; i++) {
            columnWidths.add(0.0); // 初始化大小
        }
        List<Integer> autoWidthIndexes = new ArrayList<>();
        for (int i = 0; i < totalCols; i++) {
            String header = headers.get(i);
            String title = header;
            double percent = -1;
            if (header.contains("-")) {
                String[] parts = header.split("-");
                if (parts.length == 2 && parts[1].matches("\\d+(\\.\\d+)?")) {
                    title = parts[0];
                    percent = Double.parseDouble(parts[1]);
                    columnWidths.set(i, percent);
                    totalAssignedPercent += percent;
                }
            }
            if (percent == -1) {
                autoWidthIndexes.add(i);
            }
            headers.set(i, title); // 替换为纯标题文本
        }
        double remainingPercent = 100.0 - totalAssignedPercent;
        double autoPercent = autoWidthIndexes.isEmpty() ? 0 : remainingPercent / autoWidthIndexes.size();
        for (Integer index : autoWidthIndexes) {
            columnWidths.set(index, autoPercent);
        }
        // 插入单元格
        for (int i = 0; i < headers.size(); i++) {
            builder.insertCell();
            builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(columnWidths.get(i)));
            builder.write(headers.get(i));
        }
        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.getFont().setBold(false);
        //这行代码禁用单元格中的文本自动换行功能
        //builder.getCellFormat().setWrapText(false);
        builder.getRowFormat().setHeadingFormat(false); // 确保内容行不设置为表头
    }
    /**
     * 添加合计行(可自定义合并列和样式)
     *
     * @param builder      DocumentBuilder
     * @param mergeColumns 要合并的列数(从左往右合并)
     * @param label        合计文字,如“合计”
     * @param totalValues  合计数据列表(从未合并列开始填充)
     * @param backgroundColor 合计行背景色,可为 null 表示不设置
     * @throws Exception 异常
     */
    public static void addSummaryRow(DocumentBuilder builder, int mergeColumns, String label, List<Object> totalValues, Color backgroundColor) throws Exception {
        builder.getCellFormat().clearFormatting();
        builder.getRowFormat().setHeightRule(HeightRule.AUTO);
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        // 设置背景色(如果指定了)
        if (backgroundColor != null) {
            builder.getCellFormat().getShading().setBackgroundPatternColor(backgroundColor);
        }
        // 合并列
        builder.insertCell();
        builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
        builder.write(label != null ? label : "合计");
        for (int i = 1; i < mergeColumns; i++) {
            builder.insertCell();
            builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
        }
        // 插入合计的值
        if (totalValues != null) {
            for (Object val : totalValues) {
                String value = "";
                if (val instanceof Integer) {
                    value = String.valueOf(val);
                } else if (val instanceof BigDecimal) {
                    value = String.valueOf(val);
                } else if (val instanceof Double) {
                    value = String.valueOf(val);
                } else if (val instanceof Float) {
                    value = String.valueOf(val);
                } else if (val instanceof Long) {
                    value = String.valueOf(val);
                } else if (val instanceof String) {
                    value = String.valueOf(val);
                }
                builder.insertCell();
                builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
                builder.write(val != null ? value : "");
            }
        }
        builder.endRow();
    }
    //自适应列宽 添加合计行
    public static void addSummaryRow(DocumentBuilder builder, int mergeColumns, String label, List<Object> totalValues, Color backgroundColor, List<Double> columnWidths) throws Exception {
        builder.getCellFormat().clearFormatting();
        builder.getRowFormat().setHeightRule(HeightRule.AUTO);
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        // 设置背景色(如果指定了)
        if (backgroundColor != null) {
            builder.getCellFormat().getShading().setBackgroundPatternColor(backgroundColor);
        }
        // 合并列
        builder.insertCell();
        builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
        // 设置合并单元格宽度为前 mergeColumns 列宽度之和
        if (columnWidths != null && columnWidths.size() >= mergeColumns) {
            double totalWidth = 0;
            for (int i = 0; i < mergeColumns; i++) {
                totalWidth += columnWidths.get(i);
            }
            builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(totalWidth));
        }
        builder.write(label != null ? label : "合计");
        for (int i = 1; i < mergeColumns; i++) {
            builder.insertCell();
            builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
        }
        // 插入合计的值
        if (totalValues != null) {
            for (int j = 0; j < totalValues.size(); j++) {
                Object val = totalValues.get(j);
                String value = "";
                if (val instanceof Integer) {
                    value = String.valueOf(val);
                } else if (val instanceof BigDecimal) {
                    value = String.valueOf(val);
                } else if (val instanceof Double) {
                    value = String.valueOf(val);
                } else if (val instanceof Float) {
                    value = String.valueOf(val);
                } else if (val instanceof Long) {
                    value = String.valueOf(val);
                } else if (val instanceof String) {
                    value = String.valueOf(val);
                }
                builder.insertCell();
                builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
                // 设置当前单元格宽度
                if (columnWidths != null && columnWidths.size() > mergeColumns + j) {
                    builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(columnWidths.get(mergeColumns + j)));
                }
                builder.write(val != null ? value : "");
            }
        }
        builder.endRow();
    }
    //可以指定开始合并到结束合并的
    public static void addSummaryRowCustomize(DocumentBuilder builder, int startIndex, int endIndex, String label, List<Object> totalValues, Color backgroundColor, List<Double> columnWidths) throws Exception {
        builder.getCellFormat().clearFormatting();
        builder.getRowFormat().setHeightRule(HeightRule.AUTO);
        builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
        builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
        // 设置背景色(如果指定了)
        if (backgroundColor != null) {
            builder.getCellFormat().getShading().setBackgroundPatternColor(backgroundColor);
        }
        double totalWidth = 0;
        // 设置合并单元格宽度为前 mergeColumns 列宽度之和
        if (columnWidths != null && columnWidths.size() >= endIndex) {
            for (int i = startIndex - 1; i < endIndex; i++) {
                totalWidth += columnWidths.get(i);
            }
        }
        if (totalValues != null) {
            for (int j = 0; j < totalValues.size(); j++) {
                if (j < startIndex - 1) {
                    builder.insertCell();
                    builder.write(totalValues.get(j).toString());
                    builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(columnWidths.get(j)));
                }
                //如果为要合并的那一列,就设置开始合并
                else if (j == startIndex - 1) {
                    builder.insertCell();
                    builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
                    builder.write(totalValues.get(startIndex).toString());
                    builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(totalWidth));
                } else {
                    //到结束之前都要设置向前合并
                    if (j < endIndex) {
                        builder.insertCell();
                        builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
                    } else {
                        builder.insertCell();
                        builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
                        builder.write(totalValues.get(j).toString());
                        builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(columnWidths.get(j)));
                    }
                }
            }
        }
        builder.endRow();
    }
}
            


