本文主要介绍了如何将Java打开CSV文件到JTable展示,废话不多说,具体如下:
概述
主要知识点
a.SwingNode类 :把Java swing组件封装成一个JavaFX的Node,使得Java Swing可以和JavaFX嵌套在一起使用,JavaSwing贼丑,但操作简单,JavaFX的表格组件(TableView等)有点复杂,所以选择嵌套JavaSwing来使用,丑就丑吧
b.javacsv-2.0.jar: 用于通过文件地址读取csv文件,并可以进行一系列操作.尽管2008年之后就不再更新,但操作个csv文件也够用了。
c.FileChoose类 :JavaFX的一个文件选择器,可以打开本机的资源管理器,UI美观与否取决于你的系统版本。
d.CsvReader类 : javacsv-2.0.jar 包下的一个工具类,主要通过它来对csv文件进行操作
e.JTable类:创建一个JTable实例做csv文件打开后的展示,需要注意参数的顺序,表格内容是一个二维数组,表头是一个一维数组
JTable table = new JTable(表格内容,表头);
f. 把一位数组存进一维数组:
String[][] arr = new String[10][];//开辟一个10行的二维数组
String[] row1 = {"id","name","sex","age"};
arr[0] = row1;//存进二维数组
g. JTable不显示表头:需要把JTable对象放进一个Pane里
JTable table = new JTable(表内容,表头);
JScrollPane jScrollPane = new JScrollPane(table);
SwingNode swingNode = new SwingNode();
swingNode.setContent(jScrollPane);//使用swingNode封装swing组件,就可以在Javafx中用了
CsvReader的主要方法
- new CsvReader(String filePath) 初始化构造时需要传入一个本地csv文件地址
- boolean readHeaders() 读取表头并跳过
- String[] getHeaders() 获取csv文件表头(很奇怪,需要readHeaders()方法调用过后,才能获取到,不然报空指针异常)
也就是这样:
CsvReader reader = new CsvReader("xxx.csv");
reader.readHeaders(); //没有这句话,执行下面会报错
String[] head = reader.getHeaders();
- boolean readRecord() 读取一行csv内容,只要你调用了,下次再调用就会切换到csv的下一行,通常我们使用一个while循环来及时把所有内容一行行进行操作
- String getRawRecord() 读取一行数据
while (reader.readRecord()){
System.out.println(reader.getRawRecord());//输出一行内容
}
实例 - 读取本地桌面的一个csv文件
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("文件选择器");
primaryStage.setHeight(600);
primaryStage.setWidth(800);
final FileChooser fileChooser = new FileChooser();
//设置打开资源管理器后的文件过滤
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();//创建格子布局面板
GridPane.setConstraints(open,0,0);//第0行0列
inputGridPane.setHgap(6.0);//设置水平间距
inputGridPane.setVgap(6.0);//设置垂直间距
inputGridPane.getChildren().addAll(open);//添加按钮
final Pane rootGroup = new VBox(12);//创建一个垂直盒子布局器
rootGroup.getChildren().addAll(inputGridPane);//把格子面板放进来
rootGroup.setPadding(new Insets(12,12,12,12));
primaryStage.setScene(new Scene(rootGroup));
primaryStage.show();
//设置点击-打开文件-的动作事件
open.setOnAction(event -> {
File file = fileChooser.showOpenDialog(primaryStage);//在当前窗口打开文件选择器
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();
}
//设置JTable打开后表格的相对位置
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()+"行数据");
for (int i = 0; i < data.length; i++) {
data[i] = list.get(i);
}
JTable table = new JTable(data,head);
return table;
}
//将每一行的数据从String转为String数组
public static String[] dataToArray(String row){
String[] res = row.split(",");
return res;
}
效果展示
JScrollPane封装JTable,SwingNode封装JScrollPane
到此这篇关于如何将Java打开CSV文件到JTable展示的文章就介绍到这了,更多相关Java打开CSV文件到JTable内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!