问题描述:
利用 Java poi生成excel表格,可以将其保存到计算机本地磁盘,实现路径可自由选择
问题分析:
在原来的设计中,将生成的excel表格保存到计算机本地制定的路径,可参考Java poi 通过Java程序控制excel表格中实现将数据保存到计算机本地磁盘中,不过路径是指定的,不过问题是:如何实现路径的可以自由选择呢?我们在保存文件的时候,点击保存按钮会弹出本地文件路径选择框,可以选择路径,那么,如何将程序中生成的excel表格在本地计算机的保存中实现路径的自由选择。JfileChooser类可以调用本地计算机文本选择对话框,实现文本的选择或存储。
(一)JFileChooser方法说
1.JFileChooser的构造方法有三种,参数设置不同代表的功能也不同。
(1)默认构造函数:JFileChooser();
(2)参数为currentDirectory:JFileChooser(currentDirectory),参数表示的意思是打开文件选取器时默认显示的文件夹 (默认为用户文件夹)
(3)参数为currentDirectoryPath:JFileChooser(currentDirectoryPath),参数表示的意思是打开文件选取器时默认显 示的文件夹(默认为用户文件夹)
2.void setCurrentDirectory(File file)
该方法主要用于设置打开导航框时显示的文件夹。
3.void setFileSelectionMode(int mode)
该方法用于设置文件的打开模式,一般有以下三种文件打开模式:
(1)JFileChooser.FILES_ONLY: 只能选文件;
(2) JFileChooser.DIRECTORIES_ONLY: 只能选文件夹;
(3)JFileChooser.FILES_AND_DIRECTORIES: 文件和文件夹都可以选。
4.void setMultiSelectionEnabled(boolean b)
该方法用于设置是否可以同时选取多个文件,默认值是false。
5.void addChoosableFileFilter(FileFilter filter)
该方法是用于设置文件过滤选择器,也就是允许你选择的文件类型。
6.void setFileFilter(FileFilter filter)
该方法用于设置默认的文件过滤器。
7.void setSelectedFile(File file) ,void setSelectedFiles(File[] selectedFiles)
两者均用于设置被选中的文件,单个或多组文件。
8.int showOpenDialog(Component parent)
该方法用于显示我们选择文件时弹出的框,亦即文件导航窗。
9.int showSaveDialog(Component parent)
顾名思义该方法是保存文件的弹出框。
此处两个parent表示的意思是:文件选取器对话框的父组件, 对话框将会尽量显示在靠近 parent 的中心; 如果为 null, 则显示在屏幕中心。
同时呢这两个方法的返回值也代表着特定的意思:
(1)JFileChooser.CANCEL_OPTION: 点击了取消或关闭 ;
(2) JFileChooser.APPROVE_OPTION: 点击了确认或保存 ;
(3)JFileChooser.ERROR_OPTION: 出现错误。
常常用于判断文件是否要打开或者保存。
10.File getSelectedFile() ,File[] getSelectedFiles()
该方法用于获取打开或保存的文件。
使用JFileChooser即可实现计算机本地文件的打开,保存。
问题解决:
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
public class TestOpen extends JFrame {
private JPanel contentPane; //声明一个 JFileChooser 对象
private JFileChooser chooser;
File fi;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestOpen frame = new TestOpen();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TestOpen() {
try {
UIManager.setLookAndFeel(new WindowsLookAndFeel()); // 将窗体JFrame的 LookAndFeel 设定为 Windows
} catch (UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
}
//将 chooser 实例化
chooser=new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"EXCEL文件(*xls)", "xls");
chooser.setFileFilter(filter);//增加文件过滤器
String defaultFileName="侬好呀"+" .xls";;
chooser.setSelectedFile(new File(defaultFileName)); //设置默认文件名
//定义窗体
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
JButton btnOpenFile = new JButton("保存文件");
btnOpenFile.setFocusable(false);
btnOpenFile.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
/**
* 弹出一个打开文件的对话框 showOpenDialog()
* 需要指定一个父级窗体,或指定为 null
* 返回值是 int 类型,创建以接收返回值
*/
int value=chooser.showSaveDialog(TestOpen.this);
chooser.setDialogTitle("保存文件");
chooser.setMultiSelectionEnabled(true);
if (value==chooser.APPROVE_OPTION) {
/*
* 创建一个文件对象,接收返回值 getSelectedFile()只能返回选中文件中的第一个文件,
* File file=chooser.getSelectedFile()
* System.out.println(file.getAbsolutePath());getSelectedFiles() 返回所有选中的文件0
*/
//显示保存的路径
File filex[]=chooser.getSelectedFiles();
for (int i = 0; i < filex.length; i++) {
System.out.println(filex[i].getAbsolutePath());
fi = chooser.getSelectedFile();
String f = fi.getAbsolutePath()+" .xls";
System.out.println("save: "+f);
}
}
}
});
contentPane.add(btnOpenFile);
JButton btnOpenDir = new JButton("打开文件");
btnOpenDir.setFocusable(false);
btnOpenDir.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//设定当前可选择的文件类型,设定为 DIRECTORIES_ONLY,即只能选择文件如果没有设定,
//默认为 FILES_ONLY,即只能选择文件
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
//将chooser 设定为可多选,如果没有设定,默认为 false,即只能单选
chooser.setMultiSelectionEnabled(true);
int value=chooser.showOpenDialog(TestOpen.this);
if (value==chooser.APPROVE_OPTION) {
// 创建一个文件对象,接收返回值
// getSelectedFile()只能返回选中文件夹中的第一个文件夹
// File dir=chooser.getSelectedFile();
// System.out.println(dir.getAbsolutePath());
//getSelectedFiles() 返回所有选中的文件夹
File dirx[]=chooser.getSelectedFiles();
for (int i = 0; i < dirx.length; i++) {
System.out.println(dirx[i].getAbsolutePath());
}
}
}
});
contentPane.add(btnOpenDir);
}
}
运行结果如下:
点击保存按钮:
注:可以在文件名中添加自定义的文件名
点击打开按钮:
![](https://i-blog.csdnimg.cn/blog_migrate/8784f58da3cf6eeda35ce2ea12abdf77.png)
可以参考上面的代码,定义文件选择器,并实现将excel文件的保存和打开