占位符替换此表格以后,内容右侧为什么积压了,都已经设置样式,wps中查看单个单元格,也是居中的
we为什么会出现这种情况
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 遗憾的是,如果没有数据,我们很难了解你那边到底发生了什么。 使用您的代码和我自己的数据,输出表看起来很好,没有任何问题。