You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何固定ResultSet列宽?结果集列名与数据无法对齐问题

解决ResultSet输出表格列对齐问题

我完全懂你现在的困扰——用制表符\t来分隔列的时候,因为列名和数据的长度参差不齐,导致整个表格的列根本对不齐,看起来特别混乱。

问题根源

你当前的代码用\t来分隔列,但制表符只是按固定间隔跳格,当某一列的内容长度超过制表符的默认间隔时,后面的列就会被挤错位,自然没法保持整齐的列对齐效果。

解决方案1:固定列宽格式化输出

最简单的办法是用String.format()给每个单元格设置固定宽度,让不管长短的内容都占满指定字符数(不够的补空格,超过的会自动截断,你可以根据需求调整宽度值)。比如我们把每列设为15个字符宽度,左对齐用%-15s格式:

修改后的代码如下:

ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();

// 输出列名,固定宽度左对齐
for(int i=1; i<=cols; i++) {
    System.out.print(String.format("%-15s", rsmd.getColumnLabel(i)));
}
System.out.println("\n--------------------------------------------------------------");

// 输出数据行,同样固定宽度,处理null值避免显示"null"
while(rs.next()) {
    for(int i=1; i<=cols; i++) {
        String value = rs.getString(i);
        value = value == null ? "" : value;
        System.out.print(String.format("%-15s", value));
    }
    System.out.println();
}

解决方案2:动态计算列宽(更精准对齐)

如果想要更完美的适配效果,可以先遍历一遍结果集,计算每一列的最大宽度(取列名长度和该列所有数据长度的最大值),再用这个动态宽度来格式化输出。这样既不会浪费空间,也能避免不必要的内容截断:

ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
int[] maxWidths = new int[cols];
List<String[]> dataList = new ArrayList<>();

// 第一步:遍历结果集,计算每列最大宽度并存储数据
for(int i=0; i<cols; i++) {
    maxWidths[i] = rsmd.getColumnLabel(i+1).length();
}

while(rs.next()) {
    String[] rowData = new String[cols];
    for(int i=0; i<cols; i++) {
        rowData[i] = rs.getString(i+1);
        rowData[i] = rowData[i] == null ? "" : rowData[i];
        if(rowData[i].length() > maxWidths[i]) {
            maxWidths[i] = rowData[i].length();
        }
    }
    dataList.add(rowData);
}

// 第二步:输出列名
for(int i=0; i<cols; i++) {
    String formatStr = "%-" + (maxWidths[i] + 2) + "s"; // 加2是预留列间距
    System.out.print(String.format(formatStr, rsmd.getColumnLabel(i+1)));
}
// 生成分隔线
int totalLineLength = Arrays.stream(maxWidths).sum() + cols*2;
System.out.println("\n" + "-".repeat(totalLineLength));

// 第三步:输出数据行
for(String[] row : dataList) {
    for(int i=0; i<cols; i++) {
        String formatStr = "%-" + (maxWidths[i] + 2) + "s";
        System.out.print(String.format(formatStr, row[i]));
    }
    System.out.println();
}

小提示

  • 对齐方式:%-15s是左对齐,%15s是右对齐,你可以根据数据类型调整(比如数字用右对齐,文本用左对齐)。
  • null值处理:直接输出null会影响表格美观,所以建议替换为空字符串。

内容的提问来源于stack exchange,提问作者AlexanderB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:56