如何固定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
相关产品推荐
相关产品推荐

