本节概要
本节将实现将用户的收入和支出记录导出到excel表中,也可以从excel中导入到管家婆记账系统中。
导出
将用户的记录导出到excel表中,导出功能的实现不需要界面,是通过菜单项进行触发的事件,所以将导出功能的逻辑代码写在exportMenuItemEvent()方法中即可。
/**
* “导出”菜单项的事件监听器
*
* @param actionEvent 事件
*/
@FXML
public void exportMenuItemEvent(ActionEvent actionEvent) {
String exportPath = null;
//实例化文件选择器
FileChooser fileChooser = new FileChooser();
//打开保存文件选择框
fileChooser.setInitialFileName("Excel");
File result = fileChooser.showSaveDialog(null);
if(result!=null){
exportPath = result.getAbsolutePath();
//excel表格表头
String[] title = {"序号", "类型", "金额", "分类", "备注", "日期"};
// 获取当前用户的支出记录
List<Record> recordList = recordDao.selectByUserId(Session.getUser().getUserId());
// 将支出记录转换成二维数组
String[][] tableData = new String[recordList.size()][6];
int j = 0;
for (Record record : recordList) {
tableData[j][0] = String.valueOf(record.getRecordId());
tableData[j][1] = record.getRecordType();
tableData[j][2] = Float.toString(record.getRecordMoney());
tableData[j][3] = record.getRecordClassification();
tableData[j][4] = record.getRecordMemo();
tableData[j][5] = record.getRecordDate();
j++;
}
//导出路径
String exportExcelFilePath = SimpleTools.exportExcel(title, tableData, exportPath);
if (new File(exportExcelFilePath).exists()) {
SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "导出excel成功!");
} else {
SimpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "导出excel失败!");
}
}
}
通过FileChooser文件选择器获取要保存的文件路径,然后通过RecordDao类中的selectByUserId()方法获取该用户的所有收入支出记录,然后再调用SimpleTools类的exportExcel()方法将其写入到excel表中。由于exportExcel方法中的三个参数第一个参数是表头数据,是一维数组;第二个参数指的是表格内容,是二维数组,所以需要将selectByUserId获取的内容转换成二维数组才能使用;第三个参数指的是excel文件导出路径。
运行程序,测试导出功能:
打开excel文件就可以查看导出的记录了。
导入功能
导入功能同样是由导入菜单项所触发的事件处理,在MainPageController.java代码中将importMenuItemEvent方法改为如下:
/**
* “导入”菜单项的事件监听器
*
* @param actionEvent 事件
*/
@FXML
public void importMenuItemEvent(ActionEvent actionEvent) {
//实例化文件选择器
FileChooser fileChooser = new FileChooser();
//设置默认文件过滤器
fileChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("excel(*.xls)", "xls", "xlsx"));
//打开文件选择框,并得到选中的文件
File result = fileChooser.showOpenDialog(null);
if(result!=null){
// 获取绝对路径
String importPath = result.getAbsolutePath();
try {
//读取excel表内容(不包括表头)
String[][] content = SimpleTools.readExcelContentArray(new FileInputStream(importPath));
boolean isSuccess = false;
for (int i = 0; i < content.length; i++) {
Record record = new Record();
record.setUserId(Session.getUser().getUserId());
record.setRecordType(content[i][1]);
record.setRecordMoney(Float.parseFloat(content[i][2]));
record.setRecordClassification(content[i][3]);
record.setRecordMemo(content[i][4]);
record.setRecordDate(content[i][5]);
//添加数据到数据库
isSuccess = recordDao.addRecord(record);
}
// 判断是否导入成功
if (isSuccess) {
SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "导入excel数据成功");
// 刷新界面显示的数据
initialize();
} else {
SimpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "导入excel数据失败");
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
}
}
使用FileChooser控件打开资源管理器选择要导入的excel文件并读取它的绝对路径,然后调用SimpleTools类中的readExcelContentArray()方法读取excel表的内容,但是不读取表头的内容,读取结果是一个二维数组,循环遍历将其封装到Record类中并插入到数据库的record表中,有多少行数据就插入多少条记录,导入成功后调用初始化函数initialize()刷新界面数据。
运行程序,测试功能:
要导入的excel测试数据:
导入成功进行提示:
如下红框内的记录即为导入的数据:
关于记录数据的导入导出功能是涉及到poi包的使用,在SimpleTools方法类中所定义,如果对具体如何实现感兴趣,可以查看调用方法的具体代码。如果对excel读写有兴趣的话可以自行在网上查找资料封装方法供自己使用。
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【20200319】可获取本章的源码 。