如何使用apache poi + jfianl 导入导出execl
要想使用apache poi首先用maven工程导入如下依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
jfianl+apache poi实现execl数据导入到数据库
前端:
<form id="importForm" action="/kpi/upload" enctype="multipart/form-data" method="post">
<input type="file" name = "execl"> //这里没有规定只能上传execl文件,可以自行添加
<input type="submit" value="上传xls文件">
</form>
这里是要导入的execl数据
后台代码如下:
tip:首先创建Workbook对象,再创建sheet对象,然后通过Row对象获取到execl的行,最后通过row.getCell()方法获取到某行具体的某一个单元格,再提取这个单元格的数据写入数据库,如下代码就是这个操作思路
public void upload() throws Exception {
//jfinal方法获取上传文件路径并当做输入流传给workbook对象
UploadFile file = getFile("execl");
String fileName = file.getFileName();
String path = file.getUploadPath();
//创建workbook对象操控execl
Workbook workbook = new XSSFWorkbook(new FileInputStream(path+"/"+fileName));
//获取表格的头一行,sheet是工作表对象
Sheet sheet = workbook.getSheetAt(0);
//Row是行对象,这里用for循环遍历execl的每一行
for(Row row : sheet){
//跳过表头
if(row.getRowNum() == 0){
continue;
}
//获取日期,row.getCell(0)这个方法表示获取当前行的第一个cell单元格的数据
Date date = row.getCell(0).getDateCellValue();
String workContent = row.getCell(1).getStringCellValue();
int score = (int)row.getCell(2).getNumericCellValue();
String selfevaluate = row.getCell(3).getStringCellValue();
//从date日期格式的数据中提取出年月
SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
String year = yearFormat.format(date);
SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
String month = monthFormat.format(date);
/*jfinal操作数据库的方法,会把execl中读出的数据通过传给record对象的方式写入数据库,
使用其它数据库操作方式的请自行修改下面的代码*/
Record record = new Record().set("workcontent",workContent).set("score",score)
.set("selfevaluate",selfevaluate).set("month",date).set("year",year).set("yue",month).set("state",0);
//参数分别为表名,主键字段,Record对象,自行修改
Db.save("tb_kpi","itemid",record);
}
//jfianl页面转发方法
renderTemplate("/sys/myfunction/function1_kpi.html");
}
jfianl+apache poi实现execl数据导出到数据库
tip:导出的思路跟导入差不多,区别就是要把数据库的对象写入execl的单元格,最后通过输出流输出成新的execl文件,代码如下
前端:
/*如果是使用jfinal的方法导出数据库文件存储到execl的话前端最好使用href的方式,使用其它方式如ajax的方式
会使jfinal的renderFile的方法失效,这里我也不知道怎么回事*/
<a href="#(g_path)/test/download">导出execl</a>
后台:
这里只给出关键代码
public void download(){
//创建一个新的execl
Workbook copy = new XSSFWorkbook();
//创建sheet
XSSFSheet sheetCreat = (XSSFSheet)copy.createSheet("execl的导出.xlsx");
//这里写自己的sql语句
String sql = "";
//把结果集封装为一个list集合
List<Record> records = Db.find(sql);
int j = 0;//这个用于控制row的行数
//for循环遍历record对象
for(Record record:records){
//创建行
XSSFRow row = sheetCreat.createRow(j);
//createCell(0)表示创建第一个cell单元格setCellValue()表示写入值,record.getStr()写自己数据库的字段名
row.createCell(0).setCellValue(record.getStr("id"));
row.createCell(1).setCellValue(record.getStr("workcontent"));
j++;
}
String fileName = "d:/upload/copyfile.xlsx"; //自己定义输出路径
copy.write(new FileOutputStream(fileName));
File file = new File(fileName);
//jfinal文件下载方法,传入file对象即可直接使用
if(file.exists()){
renderFile(file);
}else{
renderJson(Ret.fail("msg","没有可以导出的数据!"));
}
}