如何将Java打开CSV文件到JTable展示
本文主要介绍了如何将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
相关文章