Java中怎么創建表格-創建方式-創建操作
摘要
在Java開發中,“創建表格”是個高頻需求,但很多人一聽到“表格”就懵——到底是控制臺打印個數據表格?還是做個桌面應用的可視化表格?或者是導出Excel表格?其實不同場景的實現方式完全不同。這篇文章會從實際開發痛點出發,帶你搞懂Java中“表格”的真實含義,手把手教你4種最常用的表格創建方式(控制臺、桌面應用、Web頁面、Excel文件),每個方法都附詳細步驟和可直接運行的代碼示例,看完就能上手解決你的表格需求。
一、先搞清楚:Java里的“表格”到底是啥?
很多新手剛接觸Java時,一提“創建表格”就覺得是個高大上的功能,其實“表格”在Java里不是一個固定概念,而是根據使用場景分了好幾種:
控制臺表格:就是在黑窗口里用字符拼出“格子”,比如打印日志數據、命令行工具展示統計結果,核心是“把數據按行列對齊”。
桌面應用表格:用Swing、JavaFX等GUI庫做的可視化表格,像本地數據管理工具里能點擊、排序、編輯的表格,核心是“用戶交互”。
Web應用表格:網頁上的表格,比如管理系統里的用戶列表、訂單列表,通常是Java后端傳數據,前端(HTML/CSS/JS)渲染,核心是“前后端數據對接”。
文件表格:最典型的就是Excel表格,比如導出報表、數據備份,需要用POI、EasyExcel等庫操作Excel文件,核心是“數據持久化到文件”。
不同場景的表格,實現邏輯天差地別。比如你想在控制臺打印個數據匯總,結果跑去學Excel操作庫,那就跑偏了。所以第一步,先明確你的表格要“用在哪”。
二、4種常用表格創建方式,從入門到實戰
(一)控制臺表格:最簡單的“字符拼接法”,3分鐘搞定數據對齊
痛點:“我用System.out.println打印數據,結果列對不齊,像亂碼一樣,領導看了直皺眉!”
控制臺表格本質是用字符串拼接出“邊框+內容”,核心是解決“不同長度的字符串如何對齊”。話不多說,直接上步驟:
步驟1:確定表頭和數據結構
比如要打印“學生成績表”,表頭是“學號、姓名、分數”,數據是一個二維數組:
String[] headers = {"學號", "姓名", "分數"};
String[][] data = {
{"2023001", "張三", "95"},
{"2023002", "李四", "88"},
{"2023003", "王五", "76"} // 注意:王五名字短,分數也短,對齊容易出問題
};
步驟2:計算每列的寬度(關鍵!)
列寬不夠會導致內容換行,太寬又浪費空間。最簡單的方法是:每列寬度 = 表頭長度和該列數據最大長度中的較大值 + 2(左右留空格)。
比如“學號”列,表頭是4個字,數據最長的“2023003”是6個字符,所以列寬=6+2=8。
步驟3:拼接邊框和內容
用StringBuilder拼接,先畫“上邊框”,再循環打印“表頭行”和“數據行”,最后畫“下邊框”。直接看代碼:
public class ConsoleTable {
public static void main(String[] args) {
String[] headers = {"學號", "姓名", "分數"};
String[][] data = {{"2023001", "張三", "95"}, {"2023002", "李四", "88"}, {"2023003", "王五", "76"}};
// 計算每列寬度(表頭和數據的最大長度+2)int[] columnWidths = new int[headers.length];
for (int i = 0; i < headers.length; i++) {
columnWidths[i] = headers[i].length(); // 先初始化為表頭長度
for (String[] row : data) {
if (row[i].length() > columnWidths[i]) {
columnWidths[i] = row[i].length(); // 取數據中最長的長度
}
}
columnWidths[i] += 2; // 左右各留1個空格
}
// 畫表格
StringBuilder sb = new StringBuilder();
// 上邊框:比如 ""
for (int i = 0; i < headers.length; i++) {
sb.append("").append(String.join("", Collections.nCopies(columnWidths[i], "")));
}
sb.append("n");
// 表頭行:比如 " 學號 姓名 分數 "
for (int i = 0; i < headers.length; i++) {
sb.append("").append(String.format("%-" + columnWidths[i] + "s", " " + headers[i] + " "));
}
sb.append("n");
// 分隔線:比如 ""
for (int i = 0; i < headers.length; i++) {
sb.append("").append(String.join("", Collections.nCopies(columnWidths[i], "")));
}
sb.append("n");
// 數據行:循環拼接每一行數據
for (String[] row : data) {
for (int i = 0; i < row.length; i++) {
sb.append("").append(String.format("%-" + columnWidths[i] + "s", " " + row[i] + " "));
}
sb.append("n");
}
// 下邊框:比如 ""
for (int i = 0; i < headers.length; i++) {
sb.append("").append(String.join("", Collections.nCopies(columnWidths[i], "")));
}
sb.append("n");
// 打印結果
System.out.println(sb.toString());
}
}
運行效果:
學號 姓名 分數
2023001 張三 95
2023002 李四 88
2023003 王五 76
注意:中文和英文的寬度可能不對齊(比如“張三”占2個字符,“Tom”占3個字符),如果需要更精準,可以用String.format的%n$s格式,或者直接用現成的工具類(比如org.apache.commons.text.StringEscapeUtils),不過新手先用上面的方法足夠了。
(二)桌面應用表格:用Swing的JTable,10行代碼實現可視化表格
痛點:“我想做個本地小工具,把數據庫數據展示成表格,用戶能點擊列頭排序,怎么搞?”
Swing是Java自帶的GUI庫,其中JTable組件專門用于創建表格,無需額外導包,適合快速開發桌面小工具。
步驟1:創建窗口(JFrame)
表格需要放在窗口里顯示,先初始化一個JFrame:
java
JFrame frame = new JFrame("學生成績表");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 關閉窗口時退出程序
frame.setSize(600, 400); // 窗口大小
步驟2:定義表格數據和表頭
和控制臺表格類似,需要“表頭數組”和“二維數據數組”:
java
String[] columnNames = {"學號", "姓名", "分數"};
Object[][] rowData = {
{"2023001", "張三", 95},
{"2023002", "李四", 88},
{"2023003", "王五", 76},
{"2023004", "趙六", 90}
};
步驟3:創建JTable并添加到窗口
直接用JTable構造方法傳入數據和表頭,然后放到JScrollPane(滾動面板)里(重點:不加滾動面板,表格內容太多會顯示不全):
java
JTable table = new JTable(rowData, columnNames);
JScrollPane scrollPane = new JScrollPane(table); // 把表格放進滾動面板
frame.add(scrollPane); // 窗口添加滾動面板
frame.setVisible(true); // 顯示窗口
完整代碼:
import javax.swing.;
import java.awt.;
public class SwingTable {
public static void main(String[] args) {
// 1. 創建窗口
JFrame frame = new JFrame("學生成績表");
frame.setDefaultCloseOperation(JFrame.EXITONCLOSE);
frame.setSize(600, 400);
frame.setLocationRelativeTo(null); // 窗口居中顯示
// 2. 表格數據和表頭String[] columnNames = {"學號", "姓名", "分數"};
Object[][] rowData = {
{"2023001", "張三", 95},
{"2023002", "李四", 88},
{"2023003", "王五", 76},
{"2023004", "趙六", 90},
{"2023005", "錢七", 82}, // 多幾行數據,測試滾動條
{"2023006", "孫八", 79}
};
// 3. 創建表格并添加滾動面板
JTable table = new JTable(rowData, columnNames);
table.setRowHeight(30); // 設置行高,默認太擠
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane);
// 4. 顯示窗口
frame.setVisible(true);
}
}
運行效果:
會彈出一個窗口,里面是帶滾動條的表格,點擊表頭可以自動排序(比如點擊“分數”列,會按分數升序/降序排列)。
小技巧:如果想讓表格支持編輯(雙擊單元格修改數據),默認JTable就支持;如果想禁用編輯,加一句table.setEnabled(false);。
(三)Web應用表格:后端傳數據,前端渲染,兩種方案任你選
痛點:“我用Spring Boot開發管理系統,怎么在網頁上展示用戶列表表格?后端要做什么?”
Web表格的核心是“后端提供數據,前端負責展示”,分兩種場景:
方案1:后端直接生成HTML表格(適合簡單頁面)
如果頁面不復雜,后端可以用StringBuilder拼接HTML標簽,直接返回給前端。比如用Spring Boot的Controller:
@GetMapping("/student-table")
@ResponseBody
public String getStudentTable() {
// 1. 準備數據(實際開發中從數據庫查)
List
new Student("2023001", "張三", 95),
new Student("2023002", "李四", 88),
new Student("2023003", "王五", 76)
);
// 2. 拼接HTML表格StringBuilder html = new StringBuilder();
html.append("
");
");// 表頭
html.append(""); 學號 姓名 分數 // 數據行
for (Student s : students) {
html.append(""); html.append(" ");").append(s.getId()).append(" "); html.append("").append(s.getName()).append(" "); html.append("").append(s.getScore()).append(" "); html.append("}
html.append("return html.toString();
}
// 學生實體類
class Student {
private String id;
private String name;
private int score;
// 構造方法、getter省略
}
前端訪問/student-table,就能看到一個簡單的HTML表格。但這種方式不適合復雜頁面(比如分頁、搜索、排序),現在主流是前后端分離。
方案2:前后端分離(主流):后端返回JSON,前端用框架渲染
后端(Spring Boot)提供接口返回JSON數據:
java
@GetMapping("/students")
@ResponseBody
public List
// 實際開發中從數據庫查詢,這里模擬數據
return Arrays.asList(
new Student("2023001", "張三", 95),
new Student("2023002", "李四", 88),
new Student("2023003", "王五", 76)
);
}
前端(以Vue+Element UI為例)用el-table組件渲染:
export default {
data() {
return {
students: []
};
},
mounted() {
// 調用后端接口獲取數據
fetch("/students")
.then(res => res.json())
.then(data => this.students = data);
}
};
這種方式靈活度高,分頁、排序、篩選都能通過前端組件輕松實現,是現在企業開發的主流。
(四)Excel表格:用EasyExcel導出報表,防內存溢出
痛點:“用POI導出Excel,數據量大一點就OOM(內存溢出),有沒有更簡單的方法?”
Java操作Excel的庫很多,傳統的Apache POI功能全但容易內存溢出,現在更推薦阿里的EasyExcel(輕量、防OOM、API簡單)。
步驟1:引入EasyExcel依賴(Maven)
xml
步驟2:創建實體類(用注解定義表頭)
@Data // Lombok注解,簡化getter/setter
public class StudentExcel {
@ExcelProperty("學號") // Excel表頭名稱
private String id;
@ExcelProperty("姓名")private String name;
@ExcelProperty("分數")
private Integer score;
}
步驟3:寫入Excel文件
import com.alibaba.excel.EasyExcel;
import java.util.Arrays;
import java.util.List;
public class ExcelTable {
public static void main(String[] args) {
// 1. 準備數據(實際開發中從數據庫查)
List
new StudentExcel("2023001", "張三", 95),
new StudentExcel("2023002", "李四", 88),
new StudentExcel("2023003", "王五", 76)
);
// 2. 導出Excel(文件路徑自己改,比如"D:/學生成績表.xlsx")String fileName = "D:/學生成績表.xlsx";
EasyExcel.write(fileName, StudentExcel.class)
.sheet("成績數據") // 工作表名稱
.doWrite(data); // 寫入數據
System.out.println("Excel導出成功!");
}
}
運行效果:
在D盤會生成“學生成績表.xlsx”,打開后就是標準的Excel表格,表頭是“學號、姓名、分數”,數據正確填充。
為什么用EasyExcel?
POI是把整個Excel加載到內存,數據量大(比如10萬行)就會OOM;EasyExcel是“讀一行寫一行”,內存占用極低,實測導出100萬行數據也不會崩。
三、避坑指南:這些“坑”我踩過,你別再踩了
控制臺表格中文對齊:如果用String.format("%-ns")對齊時中文錯位,試試把中文按“2個字符”計算寬度(比如“張三”算2個字符,“abc”算3個字符)。
Swing表格不顯示:一定記得把JTable放進JScrollPane,否則表格會被窗口“擠沒了”。
Excel導出OOM:數據量超過1萬行,果斷放棄POI,用EasyExcel或Alibaba的EasyExcel,別跟內存較勁。
Web表格數據量大卡頓:前端用分頁(比如一次查20行),后端用LIMIT分頁查詢,別一次性返回所有數據。
總結
Java創建表格,核心是“看場景選方法”:控制臺用字符拼接,桌面應用用Swing的JTable,Web用前后端分離(JSON+前端組件),Excel用EasyExcel。每個方法都不難,關鍵是多動手寫代碼——把上面的示例跑一遍,改改數據,試試加新功能(比如給Excel加單元格樣式),很快就能熟練掌握。
最后說句大實話:剛開始寫表格代碼時,我也經常搞錯列寬、漏加滾動面板,多踩幾次坑就會了。編程這事兒,沒什么捷徑,動手就是最好的學習。
尊重原創文章,轉載請注明出處與鏈接:http://www.abtbt.com.cn/fangfa/735984.html,違者必究!