先展示效果

为什么写

最近在学习使用java来编写cli应用,但是在信息展示上碰到了难题。原因是没有很好工具来展示一个由字符串组成的表格。在git上搜到阿里巴巴有一个叫做 text-ui 的开源项目可以用,但是这个工具在制作表格的时候如果表格内容是中英文混合的,表格就会乱掉。于是就自己写了一个工具类来打印一个字符串组成的表格

贴代码 TextForm

package com.hebaibai.ascmd.text;import org.apache.commons.lang3.StringUtils;import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class TextForm {/*** 左边距*/protected int paddingL = 1;/*** 右边距*/protected int paddingR = 1;/*** 标题*/protected List<String> title = new ArrayList<>();/*** 数据*/protected List<List<String>> datas = new ArrayList<>();/*** 最大列数*/protected int maxCol = 0;/*** 每个单元格最大字符数*/protected int colMaxLength = 8;/*** 表格组成符号*/protected char separator = '.';private TextForm() {}public static TextFormBulider bulider() {return new TextFormBulider(new TextForm());}/*** 格式化输出表格*/public void printFormat() {List<List<String>> formData = new ArrayList<>();formData.add(title);formData.addAll(datas);Map<Integer, Integer> colMaxLengthMap = colMaxLength(formData);for (int i = 0; i < formData.size(); i++) {List<String> row = formData.get(i);for (int j = 0; j < row.size(); j++) {Formatter formatter = new Formatter();String str = row.get(j);if (str.length() > colMaxLength) {str = str.substring(0, colMaxLength);}int chineseNum = getChineseNum(str);Integer maxLength = colMaxLengthMap.get(j);String val = formatter.format("%-" + (maxLength - chineseNum) + "s", str).toString();row.set(j, val);}}Map<Integer, Integer> colMinBlankLengthMap = colMinBlankLength(formData);for (int i = 0; i < formData.size(); i++) {List<String> row = formData.get(i);for (int j = 0; j < row.size(); j++) {String val = row.get(j);Integer minBlankLength = colMinBlankLengthMap.get(j);val = val.substring(0, val.length() - minBlankLength);row.set(j, val);}}String line = "";List<String> rows = new ArrayList<>();for (List<String> strings : formData) {String pL = StringUtils.repeat(" ", paddingL);String pR = StringUtils.repeat(" ", paddingR);String row = separator + pL + String.join(pL + separator + pR, strings) + pR + separator;if (line.length() < row.length()) {line = StringUtils.repeat(separator, row.length());}rows.add(row);}System.out.println(line);for (String row : rows) {System.out.println(row);System.out.println(line);}}/*** 找到每一列最大的长度** @param formData* @return*/private Map<Integer, Integer> colMaxLength(List<List<String>> formData) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < formData.size(); i++) {int col = 0;List<String> strings = formData.get(i);while (strings.size() > col) {String val = strings.get(col);if (val.length() > colMaxLength) {val = val.substring(0, colMaxLength);strings.set(col, val);}int length = val.getBytes().length;Integer integer = map.get(col);if (integer == null) {map.put(col, length);} else {if (integer < length) {map.put(col, length);}}col++;}}return map;}/*** 找到每一列从右开始最小的空格长度** @param formData* @return*/private Map<Integer, Integer> colMinBlankLength(List<List<String>> formData) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < formData.size(); i++) {int col = 0;List<String> strings = formData.get(i);while (strings.size() > col) {String val = strings.get(col);int length = 0;for (int i1 = val.length() - 1; i1 >= 0; i1--) {if (val.charAt(i1) == ' ') {length++;} else {break;}}Integer integer = map.get(col);if (integer == null) {map.put(col, length);} else {if (integer > length) {map.put(col, length);}}col++;}}return map;}/*** 获取中文数量** @param val* @return*/private int getChineseNum(String val) {if (val == null) {val = "null";}String regex = "[\u4e00-\u9fa5|。|,]";ArrayList<String> list = new ArrayList<String>();Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(val);while (matcher.find()) {list.add(matcher.group());}int size = list.size();return size;}}复制代码

贴代码 TextFormBulider

package com.hebaibai.ascmd.text;import java.util.ArrayList;
import java.util.List;public class TextFormBulider {private TextForm textForm;protected TextFormBulider(TextForm textForm) {this.textForm = textForm;}public TextFormBulider title(String... titles) {if (textForm.maxCol < titles.length) {textForm.maxCol = titles.length;}for (String title : titles) {if (title == null) {title = "null";}textForm.title.add(title);}return this;}public TextFormBulider paddingL(int paddingL) {textForm.paddingL = paddingL;return this;}public TextFormBulider paddingR(int paddingR) {textForm.paddingR = paddingR;return this;}public TextFormBulider separator(char separator) {textForm.separator = separator;return this;}public TextFormBulider colMaxLength(int colMaxLength) {textForm.colMaxLength = colMaxLength;return this;}public TextFormBulider addRow(String... cols) {if (textForm.maxCol < cols.length) {textForm.maxCol = cols.length;}List<String> list = new ArrayList<>(cols.length);for (String col : cols) {if (col == null) {col = "null";}list.add(col);}textForm.datas.add(list);return this;}public TextForm finish() {int titleSize = textForm.title.size();if (titleSize < textForm.maxCol) {for (int i = 0; i < textForm.maxCol - titleSize; i++) {textForm.title.add(null);}}for (List<String> data : textForm.datas) {int dataSize = data.size();if (dataSize < textForm.maxCol) {for (int i = 0; i < textForm.maxCol - dataSize; i++) {data.add(null);}}}return textForm;}}
复制代码

测试代码

package com.hebaibai.ascmd.text;import org.junit.Test;import static org.junit.Assert.*;public class TextFormTest {@Testpublic void printFormat() {TextForm.bulider().title("name", "age", "sex")//设置标题.addRow("王麻345子", "21", "男2")//添加行.addRow("wzeefgrerhei", "21", "男")//添加行.colMaxLength(5)//设置单元格最大数据长度.separator('*')//设置表格由什么符号构成.paddingR(2)//右边距.paddingL(2)//左边距.finish()//完成.printFormat();//打印}
}
复制代码

原文链接 :www.hebaibai.com/?p=371

转载于:https://juejin.im/post/5cb426865188257abe6608d0

使用Java打印字符串表格(中英文内容不乱)相关推荐

  1. java打印Excel表格

    这里用servlet简单介绍一下java打印报表 1.无合并行/列 package weaver.xhyy.servlet;import java.io.File; import java.io.Fi ...

  2. java打印字符串显示_JAVA调用系统打印机打印字符串

    用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Graphics2D直接输出 ...

  3. java打印字符串引用_Java中的字符串及其中的常用方法

    字符串是由多个字符组成的一串数据 String的特点: 字符串是常量,一旦被创建就不能改变,这是因为字符串的值是存放在方法区的常量池里面,但是引用可以改变.字符串字面值"ab"也可 ...

  4. java截取字符串中间一部分内容

    /*** 获取string字符串指定内容*/ private static String getFullDepartmentName(String result) {for (String s : r ...

  5. java jar 打印_三种Java打印PDF文档的实例代码

    以下内容归纳了通过Java程序打印PDF文档时的3种情形.即: 1 静默打印 2 显示打印对话框打印 3 打印PDF时自定义纸张大小 使用工具:Spire.PDF for Java Jar文件获取及导 ...

  6. 前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

    文章目录 6. 控制台打印(Console) 模拟Java日志打印格式 美化对象打印(表格形式打印输出) 日志等级输出(让其在控制台显示时有颜色提示) 代码运行时间统计打印输出   6. 控制台打印( ...

  7. java打印表格到打印机

    在这里我我有部分功能是要将一张表格通过java调用打印机打印出来,这里要用到java的Printable接口 Printable 接口由当前页面 painter 的 print 方法实现,该方法由打印 ...

  8. java追加字符串到文件_java 将字符串追加到文件已有内容后面的操作

    我就废话不多说了,大家还是直接看代码吧~ /** * 将字符串追加到文件已有内容后面 * * @param fileFullPath 文件完整地址:D:/test.txt * @param conte ...

  9. excel打印预览在哪里_别再浪费A4纸了,Excel按下这个键,一张纸可以打印全部表格内容...

    我们在工作和生活中,经常需要打印Excel表格,可是有时表格太宽了,无法打印在一张A4纸上,今天就来教大家几种方法,只需按下一个键,就可以打印全部表格内容. 一.表格打印一页 1.设置分页 首先点击[ ...

最新文章

  1. BCH升级在即,半路杀出个“中本聪”
  2. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0......
  3. eager_EAGER的获取是代码的味道
  4. MySQL MVCC 概述
  5. 求两个数组中不同的元素
  6. python----动态规划
  7. docker swarm快速搭建mogodb集群
  8. marathon新建应用映射端口限制
  9. 百度测试linux面试题,【百度百度Linux面试题】面试问题:Linux查看… - 看准网
  10. 两独立样本非参数检验的Mann-whitneyU检验
  11. PTA不变初心数(17分)简单答案版
  12. Shell脚本导出导入MySQL建表语句
  13. MySQL JDBC PreparedStatement
  14. 网络拓扑设计----hcip
  15. 【定语从句练习题】That 、who、whom、省略
  16. mysql基因测序_基因融合检测数据库介绍
  17. 安全不安全002:C#实现RSA算法加密解密
  18. JFrame简单使用
  19. html微信悬浮窗,微信新功能悬浮窗怎么用
  20. MySQL基本概念,存储引擎,数据类型

热门文章

  1. python动态图片转字符画_GIF动态图,视频?都能用Python转换成字符画图像
  2. java的startswith_java startsWith和endsWith的用法 | 学步园
  3. html圆角边框只有左边,border-radius以外的CSS圆角边框制作方法
  4. ddr4 lpddr4区别_iFixit 拆解 iPhone 12 系列:仍使用 LPDDR4 内存 | 爱搞机
  5. python 数据库 实战_干货!python与MySQL数据库的交互实战
  6. 观念什么意思_观念真不是凭空出现的,也不是单一的,观念来自环境并且不止一种...
  7. 条形图坐标轴_手把手教你用Excel绘图 | 双轴簇状条形图
  8. java相同数组拼接_java遍历数组并重新拼接数组里的元素
  9. 【研发管理】结构化流程框架
  10. 2021年11月软考准考证打印时间及操作步骤