如何將Java打開CSV文件到JTable展示
本文主要介紹了如何將Java打開CSV文件到JTable展示,廢話不多說,具體如下:

概述
主要知識(shí)點(diǎn)
a.SwingNode類 :把Java swing組件封裝成一個(gè)JavaFX的Node,使得Java Swing可以和JavaFX嵌套在一起使用,JavaSwing賊丑,但操作簡(jiǎn)單,JavaFX的表格組件(TableView等)有點(diǎn)復(fù)雜,所以選擇嵌套JavaSwing來使用,丑就丑吧
b.javacsv-2.0.jar: 用于通過文件地址讀取csv文件,并可以進(jìn)行一系列操作.盡管2008年之后就不再更新,但操作個(gè)csv文件也夠用了。
c.FileChoose類 :JavaFX的一個(gè)文件選擇器,可以打開本機(jī)的資源管理器,UI美觀與否取決于你的系統(tǒng)版本。
d.CsvReader類 : javacsv-2.0.jar 包下的一個(gè)工具類,主要通過它來對(duì)csv文件進(jìn)行操作
e.JTable類:創(chuàng)建一個(gè)JTable實(shí)例做csv文件打開后的展示,需要注意參數(shù)的順序,表格內(nèi)容是一個(gè)二維數(shù)組,表頭是一個(gè)一維數(shù)組
JTable table = new JTable(表格內(nèi)容,表頭);
f. 把一位數(shù)組存進(jìn)一維數(shù)組:
String[][] arr = new String[10][];//開辟一個(gè)10行的二維數(shù)組
String[] row1 = {"id","name","sex","age"};
arr[0] = row1;//存進(jìn)二維數(shù)組g. JTable不顯示表頭:需要把JTable對(duì)象放進(jìn)一個(gè)Pane里
JTable table = new JTable(表內(nèi)容,表頭); JScrollPane jScrollPane = new JScrollPane(table); SwingNode swingNode = new SwingNode(); swingNode.setContent(jScrollPane);//使用swingNode封裝swing組件,就可以在Javafx中用了
CsvReader的主要方法
- new CsvReader(String filePath) 初始化構(gòu)造時(shí)需要傳入一個(gè)本地csv文件地址
- boolean readHeaders() 讀取表頭并跳過
- String[] getHeaders() 獲取csv文件表頭(很奇怪,需要readHeaders()方法調(diào)用過后,才能獲取到,不然報(bào)空指針異常)
也就是這樣:
CsvReader reader = new CsvReader("xxx.csv");
reader.readHeaders(); //沒有這句話,執(zhí)行下面會(huì)報(bào)錯(cuò)
String[] head = reader.getHeaders();- boolean readRecord() 讀取一行csv內(nèi)容,只要你調(diào)用了,下次再調(diào)用就會(huì)切換到csv的下一行,通常我們使用一個(gè)while循環(huán)來及時(shí)把所有內(nèi)容一行行進(jìn)行操作
- String getRawRecord() 讀取一行數(shù)據(jù)
while (reader.readRecord()){
System.out.println(reader.getRawRecord());//輸出一行內(nèi)容
}實(shí)例 - 讀取本地桌面的一個(gè)csv文件
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("文件選擇器");
primaryStage.setHeight(600);
primaryStage.setWidth(800);
final FileChooser fileChooser = new FileChooser();
//設(shè)置打開資源管理器后的文件過濾
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("All Images","*.*"),
new FileChooser.ExtensionFilter("PNG","*.png"),
new FileChooser.ExtensionFilter("MP4","*.mp4"),
new FileChooser.ExtensionFilter("CSV","*.csv")
);
final Button open = new Button("打開文件");
final GridPane inputGridPane = new GridPane();//創(chuàng)建格子布局面板
GridPane.setConstraints(open,0,0);//第0行0列
inputGridPane.setHgap(6.0);//設(shè)置水平間距
inputGridPane.setVgap(6.0);//設(shè)置垂直間距
inputGridPane.getChildren().addAll(open);//添加按鈕
final Pane rootGroup = new VBox(12);//創(chuàng)建一個(gè)垂直盒子布局器
rootGroup.getChildren().addAll(inputGridPane);//把格子面板放進(jìn)來
rootGroup.setPadding(new Insets(12,12,12,12));
primaryStage.setScene(new Scene(rootGroup));
primaryStage.show();
//設(shè)置點(diǎn)擊-打開文件-的動(dòng)作事件
open.setOnAction(event -> {
File file = fileChooser.showOpenDialog(primaryStage);//在當(dāng)前窗口打開文件選擇器
if (file != null){
try {
FileInputStream inputStream = new FileInputStream(file);
BufferedInputStream stream = new BufferedInputStream(inputStream);
String fileName = file.getName();
String filePath = file.getAbsolutePath();
System.out.println("文件路徑 = "+filePath);
try {
CSVDemo.read(filePath);
} catch (IOException e) {
e.printStackTrace();
}
//封裝JTable,使得JTable和Javafx嵌套在一起
SwingNode swingNode = new SwingNode();
try {
JTable table = read(filePath);
JScrollPane jScrollPane = new JScrollPane(table);
swingNode.setContent(jScrollPane);
} catch (IOException e) {
e.printStackTrace();
}
//設(shè)置JTable打開后表格的相對(duì)位置
GridPane.setConstraints(swingNode,0,1);
inputGridPane.getChildren().add(swingNode);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
//讀取csv文件并把它讀取到JTable中返回
public static JTable read(String filePath) throws IOException {
CsvReader reader = new CsvReader(filePath);
reader.readHeaders();//跳過表頭
String[] head = reader.getHeaders();
List<String []> list = new ArrayList<>();
String s = reader.getRawRecord();
System.out.println("表頭 "+s);
String[] r1 = dataToArray(s);
// list.add(r1);
while (reader.readRecord()) {
System.out.println(reader.getRawRecord());
list.add(dataToArray(reader.getRawRecord()));
}
String[][] data = new String[list.size()][];
System.out.println("一共"+list.size()+"行數(shù)據(jù)");
for (int i = 0; i < data.length; i++) {
data[i] = list.get(i);
}
JTable table = new JTable(data,head);
return table;
}
//將每一行的數(shù)據(jù)從String轉(zhuǎn)為String數(shù)組
public static String[] dataToArray(String row){
String[] res = row.split(",");
return res;
}效果展示

JScrollPane封裝JTable,SwingNode封裝JScrollPane

到此這篇關(guān)于如何將Java打開CSV文件到JTable展示的文章就介紹到這了,更多相關(guān)Java打開CSV文件到JTable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
5分鐘快速學(xué)會(huì)spring boot整合Mybatis的方法
這篇文章主要給大家介紹了如何通過5分鐘快速學(xué)會(huì)spring boot整合Mybatis的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot核心@SpringBootApplication使用介紹
這篇文章主要介紹了SpringBoot核心@SpringBootApplication的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析
這篇文章主要介紹了Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
解決Mybatis-Plus更新方法不更新NULL字段的問題
這篇文章主要介紹了解決Mybatis-Plus更新方法不更新NULL字段的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(使用數(shù)據(jù)庫)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Spring Boot Admin郵件警報(bào)整合過程解析
這篇文章主要介紹了Spring Boot Admin郵件警報(bào)整合過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

