-
2020-07-30 09:54:24
在控制台打印表格,注意是要
等宽字体
的控制台才可以。IDEA的控制台不行的,cmd的可以。import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * 控制台打印表格 * * @author zhanjixun * @date 2020-07-27 18:05:21 */ public class PrettyTable { /** * 数据 */ private final List<List<String>> rows = new ArrayList<>(); /** * 列数量 */ private final int columnCount; /** * 列宽度 */ private final int[] columnWidth; public PrettyTable(String[] header) { columnCount = header.length; columnWidth = new int[columnCount]; Arrays.fill(columnWidth, 0); addRow(header); } public void addRow(String[] row) { List<String> list = Arrays.stream(row).map(value -> value != null ? value : "").collect(Collectors.toList()); rows.add(list); for (int i = 0; i < columnWidth.length; i++) { columnWidth[i] = Math.max(list.get(i).getBytes().length, columnWidth[i]); } } @Override public String toString() { StringBuilder builder = new StringBuilder(); //边距 int margin = 1; //总列宽+2*边距数量*列数+列分隔符数量-1 int lineLength = Arrays.stream(columnWidth).sum() + margin * 2 * columnCount + (columnCount - 1); builder.append("|").append(fillChars('=', lineLength)).append("|\n"); for (int i = 0; i < rows.size(); i++) { List<String> row = rows.get(i); for (int j = 0; j < columnCount; j++) { String value = j < row.size() ? row.get(j) : ""; builder.append('|').append(fillChars(' ', margin)).append(value); builder.append(fillChars(' ', columnWidth[j] - value.getBytes().length + margin)); } builder.append("|\n"); if (i == 0) { builder.append("|").append(fillChars('=', lineLength)).append("|\n"); } if (i == rows.size() - 1) { builder.append("|").append(fillChars('=', lineLength)).append("|\n"); } } return builder.toString(); } private String fillChars(char c, int len) { char[] chArr = new char[len]; Arrays.fill(chArr, c); return new String(chArr); } }
更多相关内容 -
控制台打印表格工具类重制版
2018-08-30 10:51:02JAVA在控制台打印表格的工具类,链式调用,注释齐全。 支持自定义:表格对齐方式、是否等宽、左右边距、水平垂直交叉空白填充符,打印数据格式支持: Object[][] List《Object[]》 List《List《Object》》 List... -
Java 控制台 打印表格 改进版
2018-01-17 23:58:24Java 控制台 打印表格 可前往http://blog.csdn.net/j506825719/article/details/78996659查看效果图后再决定是否需要下载。 -
Java Console/控制台 打印表格
2021-03-11 14:52:39功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行。类下载地址:http://download..net/download/j506825719/10211082简单使用方法:在new的时候,给定...功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行。
类下载地址:http://download..net/download/j506825719/10211082
简单使用方法:在new的时候,给定列名,和列值List,之后调用printTable就得到了表格字符串。
进阶使用方法:查看所有public方法,就能知道还有什么功能了。
效果图如下:
接口如下:
package com.benjamin.debug.extendclass;
import java.awt.Font;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author Benjamin su
* QQ:506825719
* Email:jiang506825719@qq.com
*
*/
public class TextTable {
//这个变量只是用来获取字符串的标准长度,修改无意义
private static Font font = new Font("宋体", Font.PLAIN, 16);
private String columnInterval="|";//列之间的间隔符号
private AlignType at=AlignType.Left;
private Integer MaxValueLenth=40;
private Map maxFieldValueLengthMap=null;
List columnNameList=null;
List> columnValueList=null;
private boolean isException=false;
private Integer pringtTableRow=30;
/**
* 初始化时不给定列长度Map
* @param columnNameListTmp
* @param columnValueListTmp
*/
public TextTable(List columnNameListTmp,List> columnValueListTmp){
}
/**
* 初始化时给定列长度Map
* @param columnNameListTmp
* @param columnValueListTmp
* @param maxFieldValueLengthMapTmp
*/
public TextTable(List columnNameListTmp,List> columnValueListTmp,Map maxFieldValueLengthMapTmp){
}
/**
* 获得处理后的表格字符串
* @return
*/
public String printTable(){
}
/**
* 获取一个字符串的标准长度是多少
* A2*. 这样是四个标准长度
* 系统系统 这样是8个标准长度
* @param str
* @return
*/
public static Integer getStrPixelsLenth(String str){
}
/**
* 让列值居中
* @param columnValue
* @param ColumnPixelsLenth
* @return
*/
private String makeValueCenter(String columnValue,Integer repaireStrLength){
}
/**
* 让列值左对齐
* @param columnValue
* @param ColumnPixelsLenth
* @return
*/
private String makeValueLeft(String columnValue,Integer repaireStrLength){
}
/**
* 让列值右对齐
* @param columnValue
* @param ColumnPixelsLenth
* @return
*/
private String makeValueRight(String columnValue,Integer repaireStrLength){
}
/**
* 获取用于填充的字符串
* @param str
* @param PixelsLenth
* @return
*/
private static String getRepairStr(char str,Integer PixelsLenth){
}
/**
* 根据像素长度来切割字符串
* @param str
* @param PixelsLenth
* @return
*/
private static String subStrByPixels(String str,Integer PixelsLenth){
}
/**
* 让列值对齐(左对齐OR居中OR右对齐)
* @param columnValue
* @param ColumnPixelsLenth
* @return
*/
private String makeValueAlign(String columnValue,Integer ColumnPixelsLenth){
}
/**
* 设置列与列之间用什么间隔,默认是|
* @param columnInterval
*/
public void setColumnInterval(String columnInterval) {
}
/**
* 设置列值最大长度,超过则用省略号代替
* @param maxValueLenth
*/
public void setMaxValueLenth(Integer maxValueLenth) {
}
/**
* 如果不指定列长度Map,这里将自动计算
* @param columnNameListTmp
* @param columnValueListTmp
* @param maxFieldValueLengthMapTmp
*/
private void setMaxFieldValueLengthMap(List columnNameListTmp,List> columnValueListTmp,Map maxFieldValueLengthMapTmp) {
}
/**
* 设置最多打印多少行
* @param pringtTableRow
*/
public void setPringtTableRow(Integer pringtTableRow) {
}
/**
* 设置对齐方式
* @param at
*/
public void setAt(AlignType at) {
}
public enum AlignType {
Left,
Center,
Rigth
}
}
-
java console、控制台按照表格样式打印数据源码(样式-左对齐)
2020-09-25 21:26:26将对象通过console打印成表格样式(类似控制台mysql查询) 支持list,List<Object> ,Object[],Iterator,Object等,不支持如:List<Integer> 等泛型为基本数据类型的集合。 -
【java实现控制台打印表格】
2020-11-12 17:20:30背景 ...在实现该功能的过程中,对我来说最麻烦的是要在控制台输出表格,难点在于表格列宽相等以及表格内容要居中对齐。 效果 最终实现效果如下: 核心代码分享 分享此内容的目的有二: 为要实现背景
判断给定数据库是否可以连接,习惯做法是安装一个客户端,输入连接信息后连接测试。但是客户现场通常只提供一个linux系统,没有相关客户端。因此,需要一个能在linux上运行的数据库连接测试工具。我的实现思路:使用jdbc连接目标服务器,并执行一条给定的sql语句,能够连接成功则在控制台输出执行结果,连接失败则打印异常信息。
在实现该功能的过程中,对我来说最麻烦的是要在控制台输出表格,难点在于控制表格列宽相等(涉及中英文长度不一致)以及表格内容要居中对齐。效果
最终实现效果如下:
核心代码分享
分享此内容的目的有二:
- 为要实现同样功能的童鞋提供参考
- 请大佬们从实现思路或者具体方法上指点一下是否有更佳实现方式
主要写了一个PrintTable类:
定义了一个Table内部类,实现以下方法:
- buildTable(List<List< String>> content): 传入二维list,构建表格
- getLimitTable():限制宽度,最大条数后的表格
- getMaxWidthLenList(Table table):得到表格的每列最大宽度,用于实现列宽相等
- getFormatTable(Table table, String symbol):根据指定分隔符得到最终格式化后的表格
- printTable(String… symbols):打印表格,指定分隔符
PrintTable:
package com.sw.utils; import lombok.Data; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @Data public class PrintTable { private Table table; //最大列宽:sql查询结果某列内容可能过大,不想完全显示,因此限制最大列宽 private Integer maxWidth; //最大条数:sql查询结果可能有非常多,通常不必完全显示,因此限制最大条数 private Integer maxLength; public PrintTable(List<List<String>> content, Integer maxWidth, Integer maxLength) { this.table = buildTable(content); this.maxLength = maxLength; this.maxWidth = maxWidth; } public PrintTable(List<List<String>> content) { this.table = buildTable(content); this.maxLength = 10; this.maxWidth = 40; } /** * 创建Table实例 * * @param content * @return */ private Table buildTable(List<List<String>> content) { return new Table(content); } /** * 打印表格 */ public void printTable(String... symbols) { String symbol = symbols.length == 0 ? "|" : symbols[0]; //按照最大列宽、最大数据量过滤后的表格 Table limitTable = getLimitTable(); //设置表格的最大宽度:得到每列宽度,再求和 List<Integer> originMaxWidthList = getMaxWidthLenList(limitTable); limitTable.setMaxWidthList(originMaxWidthList); //得到格式化后的表格数据 Table formatTable = getFormatTable(limitTable, symbol); Integer totalColSize = formatTable.getTotalColSize(); //打印首行分割符号 System.out.println(StringUtils.getRepeatChar("-", totalColSize)); formatTable.getContent() .forEach(row -> { row.forEach(System.out::print); System.out.println(); //打印每行分割符号 System.out.println(StringUtils.getRepeatChar("-", totalColSize)); }); } /** * 格式化表格 * * @param symbol 定义每列间隔符号 * @return */ private Table getFormatTable(Table table, String symbol) { //获取原表每列最大宽度 List<Integer> originMaxWidthList = table.getMaxWidthList(); //除了间隔符号外,固定在每个单元格前后加两个空格 int symbolLen = symbol.length() + 2; //遍历原table,将每个单元格填充到该列最大长度 List<List<String>> formatList = table.getContent().stream().map( row -> { //用于流在遍历每行的过程中,获取列序号 AtomicInteger atomicInteger = new AtomicInteger(0); return row.stream().map(cell -> { //当前遍历的列序号 int j = atomicInteger.getAndIncrement(); //原表该列的最大宽度+间隔符号宽度-双字节出现的次数 int cellSize = originMaxWidthList.get(j) + symbolLen - StringUtils.getZHCharCount(cell); //如果是首行,还需要再前面加一个分割符号|,故长度加1 cellSize = j == 0 ? cellSize + 1 : cellSize; //返回原始字符串按照指定symbol填充到指定长度cellSize,并居中对齐的字符 return StringUtils.getPadString(cell, cellSize, symbol, j); }).collect(Collectors.toList()); } ).collect(Collectors.toList()); //存储格式化后的表格数据 Table formatTable = buildTable(formatList); //设置格式化表格的总宽度:原始宽度+自定义分割符号的总宽度(列数*符号宽度)+首列前面的符号宽度 int totalColSize = table.getTotalColSize() + table.getColCount() * symbolLen + 1; formatTable.setTotalColSize(totalColSize); return formatTable; } /** * @return 获取经过条件过滤的表格 */ private Table getLimitTable() { List<List<String>> limitContent = table.getContent().stream() .limit(maxLength) .map(row -> row.stream() //去除内容中含制表符时对结果展示的影响 .map(cell -> cell == null ? null : cell.replaceAll("\t", " ")) .map(cell -> cell != null && cell.length() > maxWidth ? cell.substring(0, maxWidth) : cell) .collect(Collectors.toList()) ).collect(Collectors.toList()); return buildTable(limitContent); } /** * 计算table每行的最大宽度 * 要使列宽相等,就需要将每个单元格宽度设置为该列最大宽度,二计算每行最大宽度相对容易些 * 故将content转置后得到的每行最大宽度即为所求 * 需要考虑单双字节的情况,比如有数组arr:{"aabb","sql表格","编程学习"}, * 按照String.length计算,arr[1]最长,但是实际上arr[2]看起来才是最宽的 * 因此计算宽度时,将双字节字符看做2个单位长度,即:每出现一个双字节字符,长度+1 * * @return */ private List<Integer> getMaxWidthLenList(Table table) { //得到转置数组每个元素的长度,一个中文算两个长度 return Arrays.stream(table.transpose()) .map(rows -> Arrays.stream(rows) .mapToInt(s -> { //sql查询结果如果为null,则认为长度为4 if (s == null) { return 4; } else { //加上双字节字符出现的次数,最短为null,四个字符 return s.length() + StringUtils.getZHCharCount(s); } }).max().orElse(0) ).collect(Collectors.toList()); } @Data private class Table { /** * 表格内容(含表头) */ private List<List<String>> content = new ArrayList<>(); /** * 表格列总字符长度:便于打印行分割符号 */ private Integer totalColSize; /** * 每列最大宽度 */ private List<Integer> maxWidthList; Integer getTotalColSize() { if (totalColSize == null && maxWidthList != null && maxWidthList.size() != 0) { this.totalColSize = maxWidthList.stream().reduce(Integer::sum).get(); } return totalColSize; } //private限制只能通过外部类构造 private Table(List<List<String>> content) { this.content = content; } //获取表格行数 int getRowCount() { return content.size(); } //获取表格列数,0行代表表头,默认认为content中至少含有表头 int getColCount() { return content.get(0).size(); } /** * 转置二维数组 * * @return */ private String[][] transpose() { int rowCount = getRowCount(); int colCount = getColCount(); String[][] result = new String[colCount][rowCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { result[j][i] = content.get(i).get(j); } } return result; } } }
用到的工具类:StringUtils
package com.sw.utils; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; public class StringUtils { /** * 判断字符串是否为空 * * @param str * @return */ public static boolean isEmpty(String str) { return str == null || "".equals(str); } /** * 将content按照正则匹配,返回可以匹配的字符串列表 * * @param reg * @param content * @return */ public static List<String> extractMessage(String reg, String content) { Pattern compile = Pattern.compile(reg, Pattern.CASE_INSENSITIVE); Matcher matcher = compile.matcher(content); List<String> list = new ArrayList<>(); while (matcher.find()) { list.add(matcher.group()); } return list; } /** * 将str重复count次,返回结果 * * @param str * @param count * @return */ public static String getRepeatChar(String str, int count) { StringBuilder res = new StringBuilder(); IntStream.range(0, count).forEach(i -> res.append(str)); return res.toString(); } /** * 将字符串填充到指定长度并居中对齐 * * @param str * @param len * @return */ public static String getPadString(String str, Integer len) { StringBuilder res = new StringBuilder(); str = str.trim(); if (str.length() < len) { int diff = len - str.length(); int fixLen = diff / 2; String fix = getRepeatChar(" ", fixLen); res.append(fix).append(str).append(fix); if (res.length() > len) { return res.substring(0, len); } else { res.append(getRepeatChar(" ", len - res.length())); return res.toString(); } } return str.substring(0, len); } /** * 此方法主要为表格的单元格数据按照指定长度填充并居中对齐并带上分割符号 * * @param str 原始字符串 * @param len 输出字符串的总长度 * @param symbol 分割符号 * @param index 传入的cell在list的索引,如果为第一个则需要在前面增加分割符号 * @return */ public static String getPadString(String str, Integer len, String symbol, int index) { String origin = str + " "; if (index == 0) { String tmp = getPadString(origin, len - 2); return symbol + tmp + symbol; } else { String tmp = getPadString(origin, len - 1); return tmp + symbol; } } /** * 得到一个字符串中单字节出现的次数 * * @param cell * @return */ public static Integer getENCharCount(String cell) { if (cell == null) { return 0; } String reg = "[^\t\\x00-\\xff]"; // String reg = "|[^\t\\x00-\\xff]"; return cell.replaceAll(reg, "").length(); } /** * 得到制表符长度,每个\t显示四个长度 * * @param cell * @return */ public static Integer getTableCount(String cell) { if (cell == null) { return 0; } String reg = "\t"; // String reg = "|[^\t\\x00-\\xff]"; return cell.length() - cell.replaceAll(reg, "").length(); } /** * 得到一个字符串中双字节出现的次数 * * @param cell * @return */ public static Integer getZHCharCount(String cell) { if (cell == null) { return 0; } return cell.length() - getENCharCount(cell); } public static void main(String[] args) { String test = "ab\t哈哈嘻嘻"; String reg = "[^\t\\x00-\\xff]"; System.out.println(test.replaceAll(reg, "").length()); test.replaceAll("\t|[^\\x00-\\xff]", ""); System.out.println(test.length()); System.out.println(StringUtils.getZHCharCount(test)); System.out.println(StringUtils.getENCharCount(test)); } }
调用方法:
将sql得到的rsultSet封装成二维list,再调用PrintTable即可完成控制台打印
-
Java打印表格 Console/控制台
2020-09-14 11:18:46功能: 控制台打印表格,支持字段动态长度,左对齐,设置最多打印多少行。 更多代码请参考具体类,下载链接:[https://download.csdn.net/download/qq_26599807/12840079]功能: 控制台打印表格,支持字段动态长度,左对齐,设置最多打印多少行。
- 类下载地址:https://download.csdn.net/download/qq_26599807/12840079
- 简单使用方法:传入表头和内容即可,如例1。
效果图:
纯英文结果:
中英文混合结果:
SQL查询结果:
例1:简单使用
ConsoleTable t = new ConsoleTable(); t.appendHeader("No").appendHeader("Name").appendHeader("Sex").appendHeader("Undifin"); t.appendRow(); t.appendBody("S01").appendBody("MrLiu").appendBody("O").appendBody("88"); t.appendRow(); t.appendBody("S02").appendBody("MrLiu").appendBody("O").appendBody("99"); t.appendRow(); t.appendBody("S03").appendBody("MrLiu").appendBody("X").appendBody("58"); System.out.println(t.toString());
ConsoleTable t = new ConsoleTable(); t.appendHeader("学号").appendHeader("姓名").appendHeader("性别").appendHeader("成绩"); t.appendRow(); t.appendBody("S01").appendBody("刘亿菲").appendBody("女").appendBody("88"); t.appendRow(); t.appendBody("中开04").appendBody("a").appendBody("b").appendBody("7"); t.appendRow(); t.appendBody("S02").appendBody("迪丽乐巴").appendBody("女").appendBody("99"); t.appendRow(); t.appendBody("S03").appendBody("张伟").appendBody("男").appendBody("58"); System.out.println(t.toString());
例2:进阶使用
数据类型:Mysql的desc表结构的结果,List结果,show index结果等等…
进阶输出:调用toString方法,得到字符串,可以保存到日志文件。
部分代码:private List<Object> header = new ArrayList<Object>(); private int headerSize = 0; private List<List<Object>> body = new ArrayList<List<Object>>(); private int bodySize = 0; private boolean printHeader = true; private int maxValueLenth = 50; public boolean isPrintHeader() { return printHeader; } public void setPrintHeader(boolean printHeader) { this.printHeader = printHeader; } public int getMaxValueLenth() { return maxValueLenth; } /** * TODO 设置列值最大长度,超过则用省略号代替(需大于0且在头与内容前面设置有效) * * @param maxValueLenth */ public void setMaxValueLenth(int maxValueLenth) { if (maxValueLenth > 0 && headerSize + bodySize == 0) this.maxValueLenth = maxValueLenth; } public ConsoleTable() { } public ConsoleTable(boolean printHeader) { this.printHeader = printHeader; } public ConsoleTable(boolean printHeader, int maxValueLenth) { this.printHeader = printHeader; this.maxValueLenth = maxValueLenth; }
缺点:由于使用了\0字符串结尾字符,不支持复制粘贴。
更多代码请参考具体类,下载链接:https://download.csdn.net/download/qq_26599807/12840079 -
使用Java在控制台中打印HTML表格
2021-02-13 02:30:28@jhutan试试这个来产生你正在寻找的输出。public static void main(String[] args) throws IOException {String html = "https://www.w3schools.com/html/html_tables.asp";Document doc = Jsoup....Elements table... -
python控制台表格用法
2020-12-01 17:16:37表格读取数据库 from prettytable import from_db_cursor with self.conn.cursor() as cur: sql = 'select * from classify order by classify_id' cur.execute(sql) # a = cur.fetchall() 不用这个返回查找... -
Java控制台输出表格(可设置分隔符和对齐方式)
2018-12-14 17:57:01Java控制台输出表格(可设置分隔符和对齐方式) 文章目录Java控制台输出表格(可设置分隔符和对齐方式)使用场景介绍代码使用方法 使用场景 开发中有一个需求:某个业务查询出一个表格,然后返回给前端一个控制台样式的... -
java控制台输出表格数据格式整齐
2020-12-08 21:11:16基本思想是使输出的表格的每一个格子的长度相同,长度为表格中格子的最大长度加1.。 如果格子的长度小于设定的长度,则输出空格补齐。 -
python控制台表格美化输出
2018-08-03 10:20:00为什么80%的码农都做不了架构师?>>> ... -
java console、控制台按照表格样式打印数据
2021-01-02 20:06:24最近在进行控制台版的图书管理系统开发时,遇到了一个很尴尬的问题,控制台输出的文字无法对齐。我在网上找了诸多资料,但不是门槛较高就是难以实现比较好的效果。经过反复地思考,我最终决定用自动补全tab的方式来... -
python如何以表格形式打印输出
2021-01-12 06:57:19最近,我有一个小需要收集数据和报告,并将它直接打印在背景控制台。为了美丽,数据需要显示在一个表的形式。虽然您可以使用prettytable来实现这种效果,你仍然需要安装这个库。要求很简单,你不考虑安装第三方依赖关系。... -
C# 控制台 打印输出
2017-10-18 12:46:00转载于:https://www.cnblogs.com/oralig/p/7686066.html -
js实现简单的打印表格
2021-06-13 01:51:36本文实例为大家分享了js实现打印表格的具体代码,供大家参考,具体内容如下效果如下:代码如下:打印表格var data=[{id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},{id:1002,icon:"img/2.png",name:"餐饮1... -
C#控制台程序中展示表格 (ConsoleTable类库的使用)
2020-03-25 13:07:32有时我们需要在控制台程序中以表格的形式展示数据,刚好有一个叫ConsoleTable的第三方库可以实现,使用这个库,可以让开发人员很轻松的将一组对象以表格的形式展示在控制台中。而且这个库写的非常简洁,只有一个cs... -
java中生成控制台表格的工具类
2018-03-16 16:27:22/*** 生成控制台表格工具类**/public class ConsoleTable { private List<List> rows = new ArrayList<List>(); private int colum; private int[] columLen; private static ... -
控制台打印表格 (print tables in console application)
2011-03-20 16:56:00控制台打印表格 (print tables in console application) http://snipplr.com/view.php?codeview&id=13652<br /><br />/** @file * @brief 控制台打印表格 (print tables in console application)... -
怎么使用python脚本实现表格打印?
2021-01-14 02:21:48大家在办公学习中,有...其实,今天小编就是想给大家介绍个打印机差不多性质的,使用python脚本实现表格打印。下面是给出的实现代码#定义列表,用来保存每个内层列表(行)中的最长字符串长度,这样整列就有足够的宽... -
ConsoleTables:在控制台应用程序C#中打印出格式正确的表
2021-05-10 07:48:38此类将使您尽可能轻松地在控制台上正确打印格式正确的表。 用法示例 // using ConsoleTables; static void Main ( String [] args ) { var table = new ConsoleTable ( " one " , " two " , " three " ); table .... -
python控制台表格美化输出 原
2020-11-20 22:12:29问题在Python中想让输出数据使用表美化,像某些数据库命令行工具一样。过程使用terminaltables库解决,它接受一个list数据即可。pip3 install terminaltablesfrom terminaltables import AsciiTabletable_data = [['...