您的位置:首页 > 数据库

EXCEL表格数据导入数据库-POI

2019-05-21 16:05 253 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Stao_Hello/article/details/90408905

EXCEL文件数据导入数据库-POI

这是本人第一次写文章,非常感谢你们的点击,如果有写的不好的地方,还请你们多加批评。不多废话,进入正题

在前不久,我在做一个给用户做一个数据导入的小功能的时候,总是报错,发生异常,一个小小的功能,却也浪费了我半天的时间,今天有空来将我发生的错误进行一下总结

Java做数据导入的方式有很多,用的比较多的是 POI 至于其他方式的弊端,有兴趣的可以百度一下,这里就不再做多余的赘述了
今天我们就来 POI 这种方式向数据库导入数据,EXCEL 有2003版和2007版之分,所以,我们在做导入的时候,要在代码里面做好兼容判断,判断表格是什么版本的,用相应的对象去获取,直接上代码

代码例子

表中的数据有三列,分别是 name、age、time

代码片

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
* @Author: SunTao
* @Date: 2019/5/21 14:52
* @Version 1.0
*/
@Controller
@RequestMapping("st/redeem")
public class StudentRedeem
{
@RequestMapping("upload")
public String upload(@RequestParam("file") MultipartFile file, Model model)
{
try
{
// 获取文件名
String fileName=file.getOriginalFilename();
// 将文件流转成
InputStream is=file.getInputStream();
Workbook wb=null;
if (fileName.endsWith(".xls"))
{
// 2003版的EXCEL
wb=new HSSFWorkbook(is);
}
else
{
// 2007版的EXCEL
wb=new XSSFWorkbook(is);
}// 获取表一
Sheet sheet=wb.getSheetAt(0);
// 获取表中的数据总行数
int count=sheet.getLastRowNum();
// 定义一个Map 用以装载当前行数据
Map<String,Object> data=new HashMap<>();
// 循环导入数据
for (int i=1;i<=count;i++)
{
// 第一列数据
Row row=sheet.getRow(i);
Cell cell0=row.getCell(0);
cell0.setCellType(Cell.CELL_TYPE_STRING);
String name=cell0.getStringCellValue();
// 第二列数据
Cell cell1=row.getCell(1);
cell1.setCellType(Cell.CELL_TYPE_STRING);
String age=cell1.getStringCellValue();
// 如果是日期格式的数据
Cell cell2=row.getCell(2);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=sdf.format(cell2.getStringCellValue());
// 将编译出的当前行数据放在Map中
data.put("name",name);
data.put("age",age);
data.put("date",time);
System.out.println(data);
}
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
}

大家可以看到我用到的框架是SpringMVC,在上面的代码示例中我只是演示了将数据取出,而将数据向数据库去添加是比较简单的,所以我就没有给出示例,如果想要测试的话,可以用SSM的整合后的框架,写一个简单的添加方法进行测试,今天要说的是

if (fileName.endsWith(".xls"))
{
// 2003版的EXCEL
wb=new HSSFWorkbook(is);
}
else
{
// 2007版的EXCEL
wb=new XSSFWorkbook(is);
}

EXCEL文件后缀名是" .xls " 说明 EXCEL 版本是2003版的,如果是" .xlsx " 说明是2007版的

fileName.endsWith(".xls")
就是判断一下文件的版本,因为2007版的不能用
HSSFWorkbook
对象,同理,2003版的也不可以用
XSSFWorkbook
对象
另一个需要注意的地方就是

Cell cell2=row.getCell(2);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=sdf.format(cell2.getStringCellValue());

对于日期格式的数据,如果只是简单的像其他列一样去获取的话,在控制台打印出来的是一串数字,不方便我们的使用,用上面的方式获取,结果是" 2019-05-21 15:59:15 " 这样的格式

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: