精华内容
下载资源
问答
  • Java 打印表格 到A4纸的可用代码

    热门讨论 2014-05-07 21:18:53
    已试用,可行.用Java 打印表格 到A4纸的可用代码,
  • Java 控制台 打印表格 可前往http://blog.csdn.net/j506825719/article/details/78996659查看效果图后再决定是否需要下载。
  • 先把表格画在Jpanel上,实现在JPanel可调整表格左右,上下移动,然后实现打印类的一个方法,利用Graphics在这个方法画出表格,调用这个打印打印表格
  • 将对象通过console打印表格样式(类似控制台mysql查询) 支持list,List<Object> ,Object[],Iterator,Object等,不支持如:List<Integer> 等泛型为基本数据类型的集合。
  • JAVA在控制台打印表格的工具类,链式调用,注释齐全。 支持自定义:表格对齐方式、是否等宽、左右边距、水平垂直交叉空白填充符,打印数据格式支持: Object[][] List《Object[]》 List《List《Object》》 List...
  • 功能: 控制台打印表格,支持字段动态长度,左对齐,设置最多打印多少行。 更多代码请参考具体类,下载链接:[https://download.csdn.net/download/qq_26599807/12840079]

    功能: 控制台打印表格,支持字段动态长度,左对齐,设置最多打印多少行。

    效果图:

    纯英文结果:
    在这里插入图片描述

    中英文混合结果:
    在这里插入图片描述
    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

    展开全文
  • 1. 统计表格没一列中的最长的字符串的长度. 2. 打印一列的时候,使用最长的长度作为列的长度. 3. java中可以通过System.out.printf("%长度s",string).这样的形式按长度打印.

    java打印表格 将ResultSet中的数据打印成表格

    问题描述

    MySQL的查询语句输出如下:

    mysql> select * from instructor;
    +-------+------------+------------+-----------+
    | ID    | name       | dept_name  | salary    |
    +-------+------------+------------+-----------+
    | 10101 | Srinivasan | Comp. Sci. | 65000.00  |
    | 12121 | Wu         | Finance    | 90000.00  |
    | 15151 | Mozart     | Music      | 40000.00  |
    | 22222 | Einstein   | Physics    | 95000.00  |
    | 25566 | Brown      | Biology    | 100000.00 |
    | 30765 | Green      | Music      | NULL      |
    | 32343 | El Said    | History    | 60000.00  |
    | 33456 | Gold       | Physics    | 87000.00  |
    | 45565 | Katz       | Comp. Sci. | 75000.00  |
    | 58583 | Califieri  | History    | 62000.00  |
    | 76543 | Singh      | Finance    | 80000.00  |
    | 76766 | Crick      | Biology    | 72000.00  |
    | 77987 | Kim        | Physics    | 98000.00  |
    | 83821 | Brandt     | Comp. Sci. | 92000.00  |
    | 88877 | Perry      | Finance    | 125000.00 |
    | 88878 | Perry      | Finance    | 125000.00 |
    | 98345 | Kim        | Elec. Eng. | 80000.00  |
    +-------+------------+------------+-----------+
    17 rows in set (0.04 sec)
    

    使用JDBC执行上述的查询语句,将结果集中的查询结果以表格的形式打印出来。

    思路

    • 通过结果集的元数据可以知道结果集中的列数,和列名.
    • 然后遍历结果集,分别统计每一列中的最大字符数。
    • 然后通过System.out.printf()方法进行格式化输出。

    实现

    package tools;
    
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * 结果集打印机.将结果集中的数据打印成表格.
     */
    public class ResultSetPrinter {
        public static void printResultSet(ResultSet rs) throws SQLException {
            ResultSetMetaData resultSetMetaData = rs.getMetaData();
            // 获取列数
            int ColumnCount = resultSetMetaData.getColumnCount();
            // 保存当前列最大长度的数组
            int[] columnMaxLengths = new int[ColumnCount];
            // 缓存结果集,结果集可能有序,所以用ArrayList保存变得打乱顺序.
            ArrayList<String[]> results = new ArrayList<>();
            // 按行遍历
            while (rs.next()) {
                // 保存当前行所有列
                String[] columnStr = new String[ColumnCount];
                // 获取属性值.
                for (int i = 0; i < ColumnCount; i++) {
                    // 获取一列
                    columnStr[i] = rs.getString(i + 1);
                    // 计算当前列的最大长度
                    columnMaxLengths[i] = Math.max(columnMaxLengths[i], (columnStr[i] == null) ? 0 : columnStr[i].length());
                }
                // 缓存这一行.
                results.add(columnStr);
            }
            printSeparator(columnMaxLengths);
            printColumnName(resultSetMetaData, columnMaxLengths);
            printSeparator(columnMaxLengths);
            // 遍历集合输出结果
            Iterator<String[]> iterator = results.iterator();
            String[] columnStr;
            while (iterator.hasNext()) {
                columnStr = iterator.next();
                for (int i = 0; i < ColumnCount; i++) {
                    // System.out.printf("|%" + (columnMaxLengths[i] + 1) + "s", columnStr[i]);
                    System.out.printf("|%" + columnMaxLengths[i] + "s", columnStr[i]);
                }
                System.out.println("|");
            }
            printSeparator(columnMaxLengths);
        }
    
        /**
         * 输出列名.
         *
         * @param resultSetMetaData 结果集的元数据对象.
         * @param columnMaxLengths  每一列最大长度的字符串的长度.
         * @throws SQLException
         */
        private static void printColumnName(ResultSetMetaData resultSetMetaData, int[] columnMaxLengths) throws SQLException {
            int columnCount = resultSetMetaData.getColumnCount();
            for (int i = 0; i < columnCount; i++) {
                // System.out.printf("|%" + (columnMaxLengths[i] + 1) + "s", resultSetMetaData.getColumnName(i + 1));
                System.out.printf("|%" + columnMaxLengths[i] + "s", resultSetMetaData.getColumnName(i + 1));
            }
            System.out.println("|");
        }
    
        /**
         * 输出分隔符.
         *
         * @param columnMaxLengths 保存结果集中每一列的最长的字符串的长度.
         */
        private static void printSeparator(int[] columnMaxLengths) {
            for (int i = 0; i < columnMaxLengths.length; i++) {
                System.out.print("+");
                // for (int j = 0; j < columnMaxLengths[i] + 1; j++) {
                for (int j = 0; j < columnMaxLengths[i]; j++) {
                    System.out.print("-");
                }
            }
            System.out.println("+");
        }
    
    }
    
    

    测试

    package tools;
    import java.sql.*;
    
    public class Test {
        private static String driver = "com.mysql.cj.jdbc.Driver";
        private static String URL = "jdbc:mysql://127.0.0.1:3306/university?serverTimezone=UTC";
        private static String user = "root";
        private static String password = "root";
    
        /**
         * JDBC测试.
         */
        private static void JDBCexample() {
            // 1.加载数据库驱动
            try {
    
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            testStatement();
        }
    
        /**
         * 测试Statement的用法.
         */
        private static void testStatement() {
            try (// 2.打开数据库连接
                 Connection conn = DriverManager.getConnection(URL, user, password);
                 // 3.创建语句
                 Statement stmt = conn.createStatement()) {
                // 模拟SQL注入
                testSqlInjecton(stmt);
    
            } catch (SQLException sqle) {
                System.out.println("SQLException : " + sqle);
            }
        }
    
        /**
         * 模拟SQL注入.
         *
         * @param stmt Statement对象.
         * @throws SQLException
         */
        private static void testSqlInjecton(Statement stmt) throws SQLException {
            String name = "X' or 'Y' = 'Y";
            String sql = "select * from instructor where name = '" + name + "'";
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetPrinter.printResultSet(rs);
        }
    
        public static void main(String[] args) {
            JDBCexample();
        }
    }
    

    运行结果

    +-----+----------+----------+---------+
    |   ID|      name| dept_name|   salary|
    +-----+----------+----------+---------+
    |10101|Srinivasan|Comp. Sci.| 65000.00|
    |12121|        Wu|   Finance| 90000.00|
    |15151|    Mozart|     Music| 40000.00|
    |22222|  Einstein|   Physics| 95000.00|
    |25566|     Brown|   Biology|100000.00|
    |30765|     Green|     Music|     null|
    |32343|   El Said|   History| 60000.00|
    |33456|      Gold|   Physics| 87000.00|
    |45565|      Katz|Comp. Sci.| 75000.00|
    |58583| Califieri|   History| 62000.00|
    |76543|     Singh|   Finance| 80000.00|
    |76766|     Crick|   Biology| 72000.00|
    |77987|       Kim|   Physics| 98000.00|
    |83821|    Brandt|Comp. Sci.| 92000.00|
    |88877|     Perry|   Finance|125000.00|
    |88878|     Perry|   Finance|125000.00|
    |98345|       Kim|Elec. Eng.| 80000.00|
    +-----+----------+----------+---------+
    

    原文链接: java打印表格 将ResultSet中的数据打印成表格

    展开全文
  • java实现控制台打印表格

    千次阅读 2020-11-12 17:20:30
    背景 ...在实现该功能的过程中,对我来说最麻烦的是要在控制台输出表格,难点在于表格列宽相等以及表格内容要居中对齐。 效果 最终实现效果如下: 核心代码分享 分享此内容的目的有二: 为要实现

    背景

    判断给定数据库是否可以连接,习惯做法是安装一个客户端,输入连接信息后连接测试。但是客户现场通常只提供一个linux系统,没有相关客户端。因此,需要一个能在linux上运行的数据库连接测试工具。我的实现思路:使用jdbc连接目标服务器,并执行一条给定的sql语句,能够连接成功则在控制台输出执行结果,连接失败则打印异常信息。
    在实现该功能的过程中,对我来说最麻烦的是要在控制台输出表格,难点在于控制表格列宽相等(涉及中英文长度不一致)以及表格内容要居中对齐

    效果

    最终实现效果如下:
    在这里插入图片描述

    核心代码分享

    分享此内容的目的有二:

    1. 为要实现同样功能的童鞋提供参考
    2. 请大佬们从实现思路或者具体方法上指点一下是否有更佳实现方式

    主要写了一个PrintTable类:
    在这里插入图片描述

    定义了一个Table内部类,实现以下方法:

    1. buildTable(List<List< String>> content): 传入二维list,构建表格
    2. getLimitTable():限制宽度,最大条数后的表格
    3. getMaxWidthLenList(Table table):得到表格的每列最大宽度,用于实现列宽相等
    4. getFormatTable(Table table, String symbol):根据指定分隔符得到最终格式化后的表格
    5. 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,如有问题,还望不吝赐教:
    完整工具github地址:https://github.com/Yanqin25/jdbcConnectTool

    展开全文
  • java打印Excel表格

    千次阅读 2018-03-26 11:14:46
    这里用servlet简单介绍一下java打印报表 1.无合并行/列 package weaver.xhyy.servlet; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...

    这里用servlet简单介绍一下java打印报表

    1.无合并行/列

    package weaver.xhyy.servlet;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import jxl.Workbook;
    import jxl.format.Border;
    import jxl.format.BorderLineStyle;
    import jxl.format.Colour;
    import jxl.write.Label;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    
    import weaver.general.BaseBean;
    import weaver.general.Util;
    import weaver.hrm.HrmUserVarify;
    import weaver.hrm.User;
    import weaver.xhyy.sap.SearchYhdzxx;
    
    /**
     * 打印银行对账信息
     * 
     * @author Yuk
     * 
     */
    public class GetYhdzxxExcelServlet extends HttpServlet {
        protected void service(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
    
            BaseBean log = new BaseBean();
            log.writeLog("开始导出院外来款查询");
            User user = HrmUserVarify.getUser (request , response) ;
            String beginDate = Util.null2String(request.getSession().getAttribute("beginDate"));
            String endDate = Util.null2String(request.getSession().getAttribute("endDate"));
    
            Map<String, String> otherparams = new HashMap<String, String>();
            otherparams.put("beginDate", beginDate);
            otherparams.put("endDate", endDate);
            // 调用【获取银行对账信息】
            SearchYhdzxx search = new SearchYhdzxx();
            List<Map<String, String>> list = search.getYhdzxx(user, otherparams, request, response);
    
    
            request.setCharacterEncoding("utf-8");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
    
            String context = "院外来款查询";
    
            response.setHeader("Content-Disposition", "attachment; filename=\""
                    + URLEncoder.encode(context, "utf-8") + ".xls\"");
    
            // 新建EXCEL文件
            File downloadFile = new File(request.getSession().getServletContext()
                    .getRealPath("/"), URLEncoder.encode(context, "utf-8") + ".xls");
    
            if (downloadFile.exists()) {
                downloadFile.delete();
            }
    
            downloadFile.createNewFile();
            OutputStream os = new FileOutputStream(downloadFile);
    
            try {
                // 打开文件
                WritableWorkbook book = Workbook.createWorkbook(os);
                // 生成名为"第一页"的工作表,参数0表示这是第一
                WritableSheet sheet = book.createSheet(context,0);
                /*
                 * sheet.setColumnView(1, 20);//设置列宽 sheet.setColumnView(2, 20);
                 * sheet.setColumnView(3, 20); sheet.setColumnView(4, 15);
                 */
    
                /**
                 * 设置表格表头样式
                 */
                WritableFont font1 = new WritableFont(
                        WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
                font1.setColour(Colour.BLACK);// 表格字体颜色
                WritableCellFormat format1 = new WritableCellFormat(font1);
                format1.setBackground(Colour.GREEN);// 表格背景颜色
                format1.setBorder(Border.ALL, BorderLineStyle.THIN);// 表格线条加黑
                format1.setAlignment(jxl.format.Alignment.CENTRE);// 左右居中
                format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 上下居中
                format1.setWrap(true);// 单元格的文字按照单元格的列宽来自动换行显示
    
                /**
                 * 设置表格内容样式
                 */
                // 设置字体为宋体,16号字,加粗,颜色为黑色
                WritableFont font2 = new WritableFont(
                        WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
                font2.setColour(Colour.BLACK);// 表格字体颜色
                WritableCellFormat format2 = new WritableCellFormat(font2);
                format2.setBackground(Colour.GRAY_25);// 表格背景颜色
                format2.setBorder(Border.ALL, BorderLineStyle.THIN);// 表格线条加黑
                format2.setAlignment(jxl.format.Alignment.CENTRE);// 左右居中
                format2.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 上下居中
                format2.setWrap(true);// 单元格的文字按照单元格的列宽来自动换行显示
    
                /**
                 * 步骤: 1.创建表格--建立标签,参数依次为:列索引、行索引、内容、格式 Label labelA = new Label(0,
                 * 0, "姓名", format1) 2.将定义好的单元格添加到工作表中 sheet.addCell(labelA); 3.把
                 * 单元格(column, row)到单元格(column1,row1)进行合并,没有合并可不用写
                 * 如将第一列的第一行与第第一列的第二行合并 sheet.mergeCells(0, 0, 0, 1);
                 */
    
                /**
                 * 添加表格表头
                 */
                // 1.人员信息
                Label labelA = new Label(0, 0, "年度", format1);
                Label labelB = new Label(1, 0, "结算方式", format1);
                Label labelC = new Label(2, 0, "结算号", format1);
                Label labelD = new Label(3, 0, "金额", format1);
                Label labelE = new Label(4, 0, "类别", format1);
                Label labelF = new Label(5, 0, "附言", format1);
                Label labelG = new Label(6, 0, "交易日", format1); 
                Label labelH = new Label(7, 0, "对方户名", format1);
                sheet.addCell(labelA);
                sheet.addCell(labelB);
                sheet.addCell(labelC);
                sheet.addCell(labelD);
                sheet.addCell(labelE);
                sheet.addCell(labelF);
                sheet.addCell(labelG);
                sheet.addCell(labelH);
                sheet.setColumnView(3, 15);
                sheet.setColumnView(5, 15);
                sheet.setColumnView(6, 15);
                sheet.setColumnView(7, 40);
    
                /**
                 * 添加表格内容
                 */
                for(int i=0;i<list.size();i++){
                    Map<String, String> map = list.get(i);
                    labelA = new Label(0, i+1, map.get("kjnd"), format2);
                    labelB = new Label(1, i+1, map.get("jsfs"), format2);
                    labelC = new Label(2, i+1, map.get("jysdh"), format2);
                    labelD = new Label(3, i+1, map.get("jyje"), format2);
                    labelE = new Label(4, i+1, map.get("bz"), format2);
                    labelF = new Label(5, i+1, map.get("fy"), format2);
                    labelG = new Label(6, i+1, map.get("jyrq"), format2); 
                    labelH = new Label(7, i+1, map.get("zy"), format2);
                    sheet.addCell(labelA);
                    sheet.addCell(labelB);
                    sheet.addCell(labelC);
                    sheet.addCell(labelD);
                    sheet.addCell(labelE);
                    sheet.addCell(labelF);
                    sheet.addCell(labelG);
                    sheet.addCell(labelH);
                }
                book.write();
                book.close();
            } catch (Exception e) {
                log.writeLog("导出院外来款查询报错:" + e.getMessage());
            }
            os.close();
            // 传送文件流
            InputStream is = null;
            is = new FileInputStream(downloadFile);
    
            byte[] buf = new byte[4096];
            /* 创建输出流 */
            ServletOutputStream servletOS = response.getOutputStream();
            int readLength;
            while (((readLength = is.read(buf)) != -1)) {
                servletOS.write(buf, 0, readLength);
            }
            is.close();
            servletOS.flush();
            servletOS.close();
        }
    }
    

    这里写图片描述

    2.有合并行/列

    package weaver.zbyh.servlet;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import jxl.Workbook;
    import jxl.format.Border;
    import jxl.format.BorderLineStyle;
    import jxl.format.Colour;
    import jxl.write.Label;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    
    import weaver.conn.RecordSet;
    import weaver.general.BaseBean;
    import weaver.zbyh.entity.DayCheckEntity;
    
    
    /**
     * 日考勤报表导出
     * 
     * @author Yuk
     * 
     */
    public class DownLoadDayCheckServlet extends HttpServlet {
        protected void service(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            RecordSet rs = new RecordSet();
            BaseBean log = new BaseBean();
            log.writeLog("开始--导出日考勤报表");
            request.setCharacterEncoding("utf-8");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
    
            Calendar current = (Calendar) request.getSession().getAttribute("current");
            int day = current.get(Calendar.DAY_OF_MONTH);// 今天是几号
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            current.set(Calendar.DATE, 1);
            String firstDay = sdf.format(current.getTime());// 本月1号的日期
            current.set(Calendar.DAY_OF_MONTH, day);
            String presentDay = sdf.format(current.getTime());// 系统当前日期
            String context = "每日统计表-统计日期" + firstDay + "至" + presentDay;
    
            response.setHeader("Content-Disposition", "attachment; filename=\""
                    + URLEncoder.encode(context, "utf-8") + ".xls\"");
    
            // 新建EXCEL文件
            File downloadFile = new File(request.getSession().getServletContext()
                    .getRealPath("/"), URLEncoder.encode(context, "utf-8") + ".xls");
    
            if (downloadFile.exists()) {
                downloadFile.delete();
            }
    
            downloadFile.createNewFile();
            OutputStream os = new FileOutputStream(downloadFile);
            try {
                // 打开文件
                WritableWorkbook book = Workbook.createWorkbook(os);
                // 生成名为"第一页"的工作表,参数0表示这是第一
                WritableSheet sheet = book.createSheet(firstDay + "-" + presentDay,
                        0);
                /*
                 * sheet.setColumnView(1, 20);//设置列宽 sheet.setColumnView(2, 20);
                 * sheet.setColumnView(3, 20); sheet.setColumnView(4, 15);
                 */
    
                /**
                 * 设置表格表头样式
                 */
                WritableFont font1 = new WritableFont(
                        WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
                font1.setColour(Colour.BLACK);// 表格字体颜色
                WritableCellFormat format1 = new WritableCellFormat(font1);
                format1.setBackground(Colour.GREEN);// 表格背景颜色
                format1.setBorder(Border.ALL, BorderLineStyle.THIN);// 表格线条加黑
                format1.setAlignment(jxl.format.Alignment.CENTRE);// 左右居中
                format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 上下居中
                format1.setWrap(true);// 单元格的文字按照单元格的列宽来自动换行显示
    
                /**
                 * 设置表格内容样式
                 */
                // 设置字体为宋体,16号字,加粗,颜色为黑色
                WritableFont font2 = new WritableFont(
                        WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
                font2.setColour(Colour.BLACK);// 表格字体颜色
                WritableCellFormat format2 = new WritableCellFormat(font2);
                format2.setBackground(Colour.GRAY_25);// 表格背景颜色
                format2.setBorder(Border.ALL, BorderLineStyle.THIN);// 表格线条加黑
                format2.setAlignment(jxl.format.Alignment.CENTRE);// 左右居中
                format2.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 上下居中
                format2.setWrap(true);// 单元格的文字按照单元格的列宽来自动换行显示
    
                /**
                 * 步骤: 1.创建表格--建立标签,参数依次为:列索引、行索引、内容、格式 Label labelA = new Label(0,
                 * 0, "姓名", format1) 2.将定义好的单元格添加到工作表中 sheet.addCell(labelA); 3.把
                 * 单元格(column, row)到单元格(column1,row1)进行合并,没有合并可不用写
                 * 如将第一列的第一行与第第一列的第二行合并 sheet.mergeCells(0, 0, 0, 1);
                 */
    
                /**
                 * 添加表格表头
                 */
                // 1.人员信息
                Label labelA = new Label(0, 0, "姓名", format1);
                Label labelB = new Label(1, 0, "部门", format1);
                Label labelC = new Label(2, 0, "工号", format1);
                Label labelD = new Label(3, 0, "日期", format1);
                Label labelE = new Label(4, 0, "上班打卡时间", format1);
                Label labelF = new Label(5, 0, "下班打卡时间", format1);
                sheet.addCell(labelA);
                sheet.mergeCells(0, 0, 0, 1);
                sheet.addCell(labelB);
                sheet.mergeCells(1, 0, 1, 1);
                sheet.addCell(labelC);
                sheet.mergeCells(2, 0, 2, 1);
                sheet.addCell(labelD);
                sheet.mergeCells(3, 0, 3, 1);
                sheet.addCell(labelE);
                sheet.mergeCells(4, 0, 4, 1);
                sheet.addCell(labelF);
                sheet.mergeCells(5, 0, 5, 1);
                // 2.请假(天)
                Label labelG = new Label(6, 0, "请假(天)", format1);
                sheet.addCell(labelG);
                sheet.mergeCells(6, 0, 19, 0);
                // 3.流程信息
                String[] leaveArr = { "迟到", "早退", "年休假", "事假", "病假", "婚假", "丧假",
                        "产假", "护理假", "哺乳假", "出差", "外出", "补打卡", "旷工" };
                for (int i = 0; i < leaveArr.length; i++) {
                    Label label = new Label(i + 6, 1, leaveArr[i], format1);
                    sheet.addCell(label);
                }
    
                /**
                 * 获取考勤信息,作为表格内容
                 */
                // 获取session中的考勤对象
                List<DayCheckEntity> dce = (List<DayCheckEntity>) request.getSession().getAttribute("DayCheckList");
    
                /**
                 * 添加表格内容
                 */
                for (int i = 0; i < dce.size(); i++) {
                    DayCheckEntity obj = dce.get(i);
                    String[] ObjectArr = { obj.getXm(), obj.getBm(), obj.getGh(),
                            obj.getRq() + "", obj.getSbdksj() + "",
                            obj.getXbdksj() + "", obj.getCd() + "",
                            obj.getZt() + "", obj.getNxj() + "", obj.getSj() + "",
                            obj.getBj() + "", obj.getHj() + "", obj.getSj2() + "",
                            obj.getCj() + "", obj.getHlj() + "", obj.getBrj() + "",
                            obj.getCc() + "", obj.getWc() + "", +obj.getBdk() + "",
                            obj.getKg()+ "" };
                    // 循环添加人员、请假与其他流程的信息(固定列)
                    for (int j = 0; j < ObjectArr.length; j++) {
                        if(j<=7){
                            // 文本类型单元格
                            Label label = new Label(j, 2 + i, ObjectArr[j], format2);
                            sheet.addCell(label);
                        }else{
                            // 数字类型单元格
                            jxl.write.Number label = new jxl.write.Number(j, 2 + i,
                                    Double.valueOf(ObjectArr[j]), format2);
                            sheet.addCell(label);
                        }
                    }
    
                }
    
                book.write();
                book.close();
            } catch (Exception e) {
                log.writeLog("导出日考勤报表报错:" + e.getMessage());
            }
            os.close();
    
            // 传送文件流
            InputStream is = null;
            is = new FileInputStream(downloadFile);
    
            byte[] buf = new byte[4096];
            /* 创建输出流 */
            ServletOutputStream servletOS = response.getOutputStream();
            int readLength;
            while (((readLength = is.read(buf)) != -1)) {
                servletOS.write(buf, 0, readLength);
            }
            is.close();
            servletOS.flush();
            servletOS.close();
        }
    }
    

    这里写图片描述

    展开全文
  • Java Console/控制台 打印表格

    万次阅读 2018-01-07 19:24:58
    功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行。类下载地址:http://download.csdn.net/download/j506825719/10211082简单使用方法:在new的时候,...
  • java打印表格到打印机

    千次阅读 2011-12-12 00:07:27
    在这里我我有部分功能是要将一张表格通过java调用打印机打印出来,这里要用到java的Printable接口 Printable 接口由当前页面 painter 的 print 方法实现,该方法由打印系统调用,以呈现页面。构建 Pageable 时,...
  • //是一个表格模型 JScrollPane jsp=null; JPanel jp1=null; try { if(e1.getActionCommand()=="查看学生信息") { ps=ct.createStatement(); rs=ps.executeQuery("select * from Student ");...
  • java 实现动态表格

    热门讨论 2011-09-23 16:24:23
    动态表格 java动态表格实现方法 很有用得 我找了很长时间的
  • java实现word预览打印

    2020-12-22 10:04:48
    framemaker动态生成模板word文件,实现转为PDF在页面预览打印
  • java控制台输出表格数据格式整齐

    千次阅读 2020-12-08 21:11:16
    基本思想是使输出的表格的每一个格子的长度相同,长度为表格中格子的最大长度加1.。 如果格子的长度小于设定的长度,则输出空格补齐。
  • Java打印Excel表格

    热门讨论 2010-03-24 11:10:00
    打印Excel表格一直是Java技术中难解的问题,在这里我写了一个打印Excel表格的实例,比较实用。与大家共享一下,有什么不对的地方还希望各位多多指教
  • //遍历数据,往Excel表格写数据 while (ite.hasNext()) { Map.Entry entry1 = ite.next(); entry1.getKey(); String val = Tools.filterNull(entry1.getValue()); Cell cell = row.createCell(j++); cell....
  • Java控制台输出表格(可设置分隔符和对齐方式) 文章目录Java控制台输出表格(可设置分隔符和对齐方式)使用场景介绍代码使用方法 使用场景 开发中有一个需求:某个业务查询出一个表格,然后返回给前端一个控制台样式的...
  • 主要介绍了JAVA实现打印ascii码表代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Java开发斑马打印机打印标签,支持中文打印,导入即可运行
  • 日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
  • 最近在学习使用java来编写cli应用,但是在信息展示上碰到了...于是就自己写了一个工具类来打印一个字符串组成的表格。 这个工具满足一下使用要求: 可以设置标题 可以设置表格中数据的左右边距 可以设置表格由什...
  • 主要介绍了Java Swing中的表格(JTable)和树(JTree)组件使用实例,本文同时讲解了表格和树的基本概念、常用方法、代码实例,需要的朋友可以参考下
  • 这是目录标题题目题目描述题目槽点代码代码块代码...1.3显示图案和1.4打印表格两题 在笔者刚接触Java、第一次做的时候根本没有想到是利用print函数/println函数来解题 特别当时在做1.4时,笔者考虑到的方法是①指定cons
  • 非常全的java资料,可以下载后打印,一项一项的学习
  • java实现控制台表格

    万次阅读 多人点赞 2019-07-23 19:18:33
    表格 在图形环境中很容易做出漂亮的表格。但在控制台环境中就比较困难了。有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看) +-------+------+ |abc |xyz=tt| +-------+------+ |...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,123
精华内容 17,649
关键字:

java打印表格

java 订阅