System.out.printf
方法来控制打印表格,通过指定格式和对齐方式,可以整齐地输出表格内容。,“`java,System.out.printf(“%-10s%-10s%-10s,”, “Name”, “Age”, “City”);,System.out.printf(“%-10s%-10d%-10s,Java中控制打印表格是一项常见的任务,尤其是在处理数据输出、报表生成等场景时,下面将详细介绍如何在Java中实现表格的打印,包括使用System.out.printf
、String.format
、Apache POI库以及自定义格式等多种方法。
使用System.out.printf
和String.format
基本概念
System.out.printf
和String.format
是Java中用于格式化输出的方法,通过指定格式字符串,可以对齐文本,模拟表格的效果。
示例代码
public class TablePrinter { public static void main(String[] args) { String[][] data = { {"姓名", "年龄", "城市"}, {"张三", "25", "北京"}, {"李四", "30", "上海"}, {"王五", "28", "广州"} }; // 获取每列的最大宽度 int[] columnWidths = new int[data[0].length]; for (int i = 0; i < data[0].length; i++) { int max = data[0][i].length(); for (int j = 1; j < data.length; j++) { if (data[j][i].length() > max) { max = data[j][i].length(); } } columnWidths[i] = max; } // 打印表头 for (int i = 0; i < data[0].length; i++) { System.out.printf("%-" + (columnWidths[i] + 2) + "s", data[0][i]); } System.out.println(); // 打印分隔线 for (int i = 0; i < data[0].length; i++) { for (int j = 0; j < columnWidths[i] + 2; j++) { System.out.print("-"); } } System.out.println(); // 打印表格内容 for (int i = 1; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { System.out.printf("%-" + (columnWidths[j] + 2) + "s", data[i][j]); } System.out.println(); } } }
运行结果
姓名 年龄 城市
--------------------
张三 25 北京
李四 30 上海
王五 28 广州
说明
- 计算列宽:首先遍历所有数据,找出每一列中最长的单元格长度,以确保表格对齐。
- 格式化输出:使用
System.out.printf
或String.format
,通过指定宽度和左对齐(%-ws
)来打印每个单元格。 - 分隔线:根据每列的宽度打印相应数量的“-”以形成分隔线。
使用Apache POI生成Excel表格
简介
Apache POI是一个强大的Java库,用于读写Microsoft Office格式的文件,包括Excel,使用POI可以方便地创建复杂的表格,并导出为Excel文件。
添加依赖
如果使用Maven,可以在pom.xml
中添加以下依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency>
示例代码
import org.apache.poi.ss.usermodel.; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelTableGenerator { public static void main(String[] args) { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("人员信息"); // 创建表头 String[] headers = {"姓名", "年龄", "城市"}; Row headerRow = sheet.createRow(0); CellStyle headerStyle = createHeaderStyle(workbook); for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); sheet.autoSizeColumn(i); } // 填充数据 String[][] data = { {"张三", "25", "北京"}, {"李四", "30", "上海"}, {"王五", "28", "广州"} }; CellStyle dataStyle = createDataStyle(workbook); for (int i = 0; i < data.length; i++) { Row row = sheet.createRow(i + 1); for (int j = 0; j < data[i].length; j++) { Cell cell = row.createCell(j); cell.setCellValue(data[i][j]); cell.setCellStyle(dataStyle); } } // 自动调整列宽 for (int i = 0; i < headers.length; i++) { sheet.autoSizeColumn(i); } // 写入文件 try (FileOutputStream fileOut = new FileOutputStream("人员信息.xlsx")) { workbook.write(fileOut); System.out.println("Excel表格已生成!"); } catch (IOException e) { e.printStackTrace(); } finally { try { workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } private static CellStyle createHeaderStyle(Workbook workbook) { CellStyle style = workbook.createCellStyle(); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); style.setAlignment(HorizontalAlignment.CENTER); return style; } private static CellStyle createDataStyle(Workbook workbook) { CellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); return style; } }
说明
- 创建工作簿和表单:使用
XSSFWorkbook
创建一个Excel工作簿,并在其中创建一个名为“人员信息”的工作表。 - 设置样式:为表头和数据行设置不同的样式,如加粗、居中对齐等。
- 填充数据:将二维数组中的数据逐行写入Excel表格中。
- 自动调整列宽:使用
autoSizeColumn
方法根据内容自动调整每列的宽度。 - 写入文件:将工作簿写入到指定的Excel文件中。
使用自定义类和方法打印表格
对于更复杂的需求,可以封装一个工具类来处理表格的打印,以下是一个简单的示例:
工具类定义
public class TableUtils { / 打印表格 @param data 二维数组,第一行为表头 / public static void printTable(String[][] data) { if (data == null || data.length == 0) { System.out.println("没有数据可打印!"); return; } // 计算每列最大宽度 int[] columnWidths = new int[data[0].length]; for (int i = 0; i < data[0].length; i++) { int max = data[0][i].length(); for (int j = 1; j < data.length; j++) { if (data[j][i].length() > max) { max = data[j][i].length(); } } columnWidths[i] = max; } // 打印表头 printLine(columnWidths); for (int i = 0; i < data[0].length; i++) { System.out.printf("%-" + (columnWidths[i] + 2) + "s", data[0][i]); } System.out.println(); printLine(columnWidths); // 打印内容 for (int i = 1; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { System.out.printf("%-" + (columnWidths[j] + 2) + "s", data[i][j]); } System.out.println(); } printLine(columnWidths); } private static void printLine(int[] columnWidths) { for (int width : columnWidths) { for (int i = 0; i < width + 2; i++) { System.out.print("-"); } System.out.print("+"); } System.out.println(); } }
使用示例
public class Main { public static void main(String[] args) { String[][] data = { {"商品", "价格", "库存"}, {"苹果", "3.5", "150"}, {"香蕉", "2.0", "200"}, {"橙子", "4.0", "100"} }; TableUtils.printTable(data); } }
运行结果
---------------------+--------+------+
商品 价格 库存
---------------------+--------+------+
苹果 3.5 150
香蕉 2.0 200
橙子 4.0 100
---------------------+--------+------+
说明
- 灵活性:通过传递不同的二维数组,可以轻松打印各种表格。
- 扩展性:可以在工具类中添加更多功能,如设置对齐方式、边框样式等。
- 复用性:将打印逻辑封装在一个工具类中,便于在项目中多处复用。
注意事项
- 字符编码:在控制台打印中文时,确保控制台支持相应的字符编码(如UTF-8),否则可能出现乱码。
- 异常处理:在实际应用中,应添加适当的异常处理机制,确保程序的健壮性。
- 性能考虑:对于非常大的表格,频繁的
System.out.printf
可能影响性能,此时可以考虑使用StringBuilder
拼接后再一次性输出。 - 第三方库:使用Apache POI等第三方库时,需注意其版本兼容性和许可证要求。
FAQs
问题1:如何在控制台中打印带有颜色的表格?
解答:在Java中,可以使用ANSI转义码来为控制台输出添加颜色,需要注意的是,ANSI转义码在某些操作系统或终端中可能不被支持,以下是一个简单的示例:
public class ColorfulTablePrinter { // ANSI颜色代码 private static final String RESET = "u001B[0m"; private static final String RED = "u001B[31m"; private static final String GREEN = "u001B[32m"; private static final String YELLOW = "u001B[33m"; private static final String BLUE = "u001B[34m"; public static void main(String[] args) { String[][] data = { {"姓名", "年龄", "城市"}, {"张三", "25", "北京"}, {"李四", "30", "上海"}, {"王五", "28", "广州"} }; printTable(data); } public static void printTable(String[][] data) { // 类似之前的打印逻辑,但添加颜色 for (int i = 0; i < data[0].length; i++) { System.out.print(YELLOW); // 表头黄色 System.out.printf("%-10s", data[0][i]); System.out.print(RESET); System.out.print(" | "); } System.out.println(); printSeparator(data[0].length); for (int i = 1; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { // 根据条件设置颜色,例如年龄大于28的为红色 if (Integer.parseInt(data[i][1]) > 28) { System.out.print(RED); } else { System.out.print(RESET); } System.out.printf("%-10s", data[i][j]); System.out.print(RESET); System.out.print(" | "); } System.out.println(); printSeparator(data[0].length); } } private static void printSeparator(int columns) { for (int i = 0; i < columns; i++) { for (int j = 0; j < 10; j++) { System.out.print("-"); } System.out.print("-+-"); } System.out.println(); } }
说明:上述代码在表头使用了黄色,并根据年龄条件为部分单元格添加了红色,请确保您的终端支持ANSI颜色代码。
问题2:如何将表格导出为HTML文件?
解答:将表格数据导出为HTML文件,可以方便地在网页中查看,以下是一个简单的示例:
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class HTMLTableExporter { public static void main(String[] args) { String[][] data = { {"姓名", "年龄", "城市"}, {"张三", "25", "北京"}, {"李四", "30", "上海"}, {"王五", "28", "广州"} }; exportToHTML(data, "table.html"); } public static void exportToHTML(String[][] data, String fileName) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) { writer.write("<!DOCTYPE html><html><head><meta charset="UTF-8"><title>表格</title></head><body>"); writer.write("<table border="1" cellpadding="5" cellspacing="0">"); for (int i = 0; i < data.length; i++) { writer.write("<tr>"); for (int j = 0; j < data[i].length; j++) { writer.write("<td>" + data[i][j] + "</td>"); } writer.write("</tr>"); } writer.write("</table>"); writer.write("</body></html>"); System.out.println("HTML表格已生成:" + fileName); } catch (IOException e) { e.printStackTrace(); } } }
说明:上述代码将二维数组中的数据导出为一个简单的HTML表格,并保存为table.html
文件。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/65653.html