表格样式错误

占位符替换此表格以后,内容右侧为什么积压了,都已经设置样式,wps中查看单个单元格,也是居中的


we为什么会出现这种情况

@JOOL

请提供更多信息,例如您使用的代码示例和具体的样式设置,以便我们更好地理解问题。

public class DocumentTableUtil {
public 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 = (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((Double)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 = (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((Double)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)MapUtils.getObject(summaryRowMap, "dataList", new ArrayList());
        addSummaryRow(builder, endMergeIndex, label, dataList, (Color)null, columnWidths);
    }

    builder.endTable();
    return table;
}

public static void addTableHeader(DocumentBuilder builder, List<String> headers) throws Exception {
    builder.getFont().setBold(false);
    builder.getFont().setSize((double)10.0F);
    builder.getParagraphFormat().setAlignment(1);
    builder.getRowFormat().setHeadingFormat(true);
    builder.getRowFormat().setHeightRule(2);
    builder.getRowFormat().setHeight((double)0.0F);
    builder.getCellFormat().setVerticalAlignment(1);
    builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(128, 128, 128));
    builder.getFont().setColor(Color.BLACK);
    int totalCols = headers.size();
    double defaultPercent = (double)100.0F / (double)totalCols;

    for(String header : headers) {
        builder.insertCell();
        String title = header;
        double percent = defaultPercent;
        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((double)10.0F);
    builder.getParagraphFormat().setAlignment(1);
    builder.getRowFormat().setHeadingFormat(true);
    builder.getRowFormat().setHeightRule(2);
    builder.getRowFormat().setHeight((double)0.0F);
    builder.getCellFormat().setVerticalAlignment(1);
    builder.getCellFormat().getShading().setBackgroundPatternColor(new Color(128, 128, 128));
    builder.getFont().setColor(Color.BLACK);
    int totalCols = headers.size();
    double totalAssignedPercent = (double)0.0F;

    for(int i = 0; i < totalCols; ++i) {
        columnWidths.add((double)0.0F);
    }

    List<Integer> autoWidthIndexes = new ArrayList();

    for(int i = 0; i < totalCols; ++i) {
        String header = (String)headers.get(i);
        String title = header;
        double percent = (double)-1.0F;
        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 == (double)-1.0F) {
            autoWidthIndexes.add(i);
        }

        headers.set(i, title);
    }

    double remainingPercent = (double)100.0F - totalAssignedPercent;
    double autoPercent = autoWidthIndexes.isEmpty() ? (double)0.0F : remainingPercent / (double)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((Double)columnWidths.get(i)));
        builder.write((String)headers.get(i));
    }

    builder.endRow();
}

public static void setTableBodyFormat(DocumentBuilder builder) throws Exception {
    builder.getCellFormat().clearFormatting();
    builder.getCellFormat().setVerticalAlignment(1);
    builder.getRowFormat().getBorders().setColor(new Color(1, 1, 1));
    builder.getFont().setColor(new Color(1, 1, 1));
    builder.getFont().setBold(false);
    builder.getRowFormat().setHeadingFormat(false);
}

public static void addSummaryRow(DocumentBuilder builder, int mergeColumns, String label, List<Object> totalValues, Color backgroundColor) throws Exception {
    builder.getCellFormat().clearFormatting();
    builder.getRowFormat().setHeightRule(2);
    builder.getCellFormat().setVerticalAlignment(1);
    builder.getParagraphFormat().setAlignment(1);
    if (backgroundColor != null) {
        builder.getCellFormat().getShading().setBackgroundPatternColor(backgroundColor);
    }

    builder.insertCell();
    builder.getCellFormat().setHorizontalMerge(1);
    builder.write(label != null ? label : "合计");

    for(int i = 1; i < mergeColumns; ++i) {
        builder.insertCell();
        builder.getCellFormat().setHorizontalMerge(2);
    }

    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(0);
            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(2);
    builder.getCellFormat().setVerticalAlignment(1);
    builder.getParagraphFormat().setAlignment(1);
    if (backgroundColor != null) {
        builder.getCellFormat().getShading().setBackgroundPatternColor(backgroundColor);
    }

    builder.insertCell();
    builder.getCellFormat().setHorizontalMerge(1);
    if (columnWidths != null && columnWidths.size() >= mergeColumns) {
        double totalWidth = (double)0.0F;

        for(int i = 0; i < mergeColumns; ++i) {
            totalWidth += (Double)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(2);
    }

    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(0);
            if (columnWidths != null && columnWidths.size() > mergeColumns + j) {
                builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent((Double)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(2);
    builder.getCellFormat().setVerticalAlignment(1);
    builder.getParagraphFormat().setAlignment(1);
    if (backgroundColor != null) {
        builder.getCellFormat().getShading().setBackgroundPatternColor(backgroundColor);
    }

    double totalWidth = (double)0.0F;
    if (columnWidths != null && columnWidths.size() >= endIndex) {
        for(int i = startIndex - 1; i < endIndex; ++i) {
            totalWidth += (Double)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((Double)columnWidths.get(j)));
            } else if (j == startIndex - 1) {
                builder.insertCell();
                builder.getCellFormat().setHorizontalMerge(1);
                builder.write(totalValues.get(startIndex).toString());
                builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(totalWidth));
            } else if (j < endIndex) {
                builder.insertCell();
                builder.getCellFormat().setHorizontalMerge(2);
            } else {
                builder.insertCell();
                builder.getCellFormat().setHorizontalMerge(0);
                builder.write(totalValues.get(j).toString());
                builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent((Double)columnWidths.get(j)));
            }
        }
    }

    builder.endRow();
}

public static void resetBuilderTableFormat(DocumentBuilder builder) throws Exception {
    builder.getCellFormat().clearFormatting();
    builder.getParagraphFormat().clearFormatting();
    builder.getRowFormat().clearFormatting();
    builder.getCellFormat().setHorizontalMerge(0);
    builder.getCellFormat().setVerticalMerge(0);
    builder.getRowFormat().setHeadingFormat(false);
    builder.getCellFormat().setPreferredWidth(PreferredWidth.AUTO);
    builder.getParagraphFormat().setAlignment(1);
    builder.getCellFormat().getShading().setBackgroundPatternColor(Color.WHITE);
    builder.getRowFormat().getBorders().clearFormatting();
}

} 我使用的是 DocumentTableUtil.addTable(builder, header, tableDataList);

调用方:
public class ReplaceWithCustomTableHandlerTest implements CustomDocumentTableProcessor {
private Map<String, Object> tableData;

@Override
public void process(Document document, String placeholderName, Map<String, Object> tableData) throws Exception {
    this.tableData = tableData;
    DocumentBuilder builder = new DocumentBuilder(document);
    // 1️⃣ 查找占位符
    FindReplaceOptions options = new FindReplaceOptions();
    options.setReplacingCallback(args -> {
        // 定位到占位符
        builder.moveTo(args.getMatchNode());
        // 开始表格
        builder.startTable();
        List<String> header = (List<String>) tableData.get("header");

        List<Double> columnWidths = new ArrayList<>();
        Map summaryRowMap = (Map) tableData.get("summaryRowMap");
        List<List<Object>> tableDataList = (List<List<Object>>) tableData.get("tableDataList");
        DocumentTableUtil.addTable(builder, header, tableDataList);
        //DocumentTableUtil.addTableAndAddSummaryRow(builder,header , tableDataList, summaryRowMap);
        //删除占位符
        args.getMatchNode().remove();
        return ReplaceAction.SKIP; // 跳过默认替换
    });
    // 5️⃣ 执行替换
    document.getRange().replace(Pattern.compile(Pattern.quote(placeholderName)), "", options);
}

}

@JOOL 看起来与上一个帖子中的问题相同。 请查看我的回答 表格样式问题 - #2 by vyacheslav.deryushev 遗憾的是,如果没有数据,我们很难了解你那边到底发生了什么。 使用您的代码和我自己的数据,输出表看起来很好,没有任何问题。