功能描述
Excel的导入就是在java后端对Excel的表格的内容进行解析,将解析的内容存放进数据库当中就可以了
这其中涉及的技术点有两个:
1.文件的传输:即在前端获取文件的信息,将文件的信息传给后端
2.后端获取前端的文件信息,将文件进行解析,然后将解析的数据存放进数据库当中
结构描述
文件传输
文件的传输我了解的有两种方式:
1.利用ajaxFileUpload插件
2.利用bootstrap的fileinput插件
因为本文的重点是对excel的解析,所以对于文件传输的部分不做讲解
需要导入的jar
1.commons-collections4-4.1.jar
2.poi-3.17-beta1.jar
3.poi-ooxml-3.17-beta1.jar
4.poi-ooxml-schemas-3.17-beta1.jar
5.xmlbeans-2.6.0.jar
主要API
1.import org.apache.poi.ss.usermodel.Workbook,对应Excel文档;
2.import org.apache.poi.hssf.usermodel.HSSFWorkbook,对应xls格式的Excel文档;
3.import org.apache.poi.xssf.usermodel.XSSFWorkbook,对应xlsx格式的Excel文档;
4.import org.apache.poi.ss.usermodel.Sheet,对应Excel文档中的一个sheet;
5.import org.apache.poi.ss.usermodel.Row,对应一个sheet中的一行;
6.import org.apache.poi.ss.usermodel.Cell,对应一个单元格。
Excel解析
解析按照以下几个步骤来:
- 获取文件
- 读取文件,判断文件类型
//读取excel
public static Workbook readExcel(String filePath){
Workbook wb = null;
if(filePath==null){
return null;
}
String extString = filePath.substring(filePath.lastIndexOf("."));
InputStream is = null;
try {
is = new FileInputStream(filePath);
if(".xls".equals(extString)){
return wb = new HSSFWorkbook(is);
}else if(".xlsx".equals(extString)){
return wb = new XSSFWorkbook(is);
}else{
return wb = null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return wb;
}
- 开始解析数据,解析由sheet–>row–>cell的顺序
- 保存数据
@RequestMapping(value = "/importExcel",method=RequestMethod.POST)
@ResponseBody
public Result importExcel(HttpServletRequest request,HttpServletResponse response) {
System.out.println("进入了测试方法!");
Result result=new Result();
Workbook wb =null;
Sheet sheet = null;
Row row = null;
List<Map<String,String>> list = null;
String cellData = null;
String filePath = "C:\\Users\\admin\\Desktop\\学生信息导入模板.xlsx";
String columns[] = {"name","age","address"};
wb = readExcel(filePath);
if(wb != null){
//用来存放表中数据
list = new ArrayList<Map<String,String>>();
//获取第一个sheet
sheet = wb.getSheetAt(0);
//获取最大行数
int rownum = sheet.getPhysicalNumberOfRows();
//获取第一行
row = sheet.getRow(0);
//获取最大列数
int colnum = row.getPhysicalNumberOfCells();
for (int i = 1; i<rownum; i++) {
Map<String,String> map = new LinkedHashMap<String,String>();
row = sheet.getRow(i);
if(row !=null){
for (int j=0;j<colnum;j++){
cellData = (String) getCellFormatValue(row.getCell(j));
map.put(columns[j], cellData);
}
}else{
break;
}
list.add(map);
}
}
//遍历解析出来的list
for (Map<String,String> map : list) {
Student student=new Student();
UUID uuid = UUID.randomUUID();
String str = uuid.toString();
String uuidStr = str.replace("-", "");
student.setId(uuidStr);
for (Entry<String,String> entry : map.entrySet()) {
System.out.print(entry.getKey()+":"+entry.getValue()+",");
if(entry.getKey().equals("name")){
student.setName(entry.getValue());
}else if(entry.getKey().equals("age")){
student.setAge(Integer.parseInt(entry.getValue().substring(0,entry.getValue().indexOf("."))));
}else if(entry.getKey().equals("address")){
student.setAddress(entry.getValue());
}
}
result = studentService.addStudent(student);
System.out.println();
}
result.setStatus(1);
return result;
}
这里还需要一个解析单元格的工具类:
public static Object getCellFormatValue(Cell cell){
Object cellValue = null;
if(cell!=null){
//判断cell类型
switch(cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC:{
cellValue = String.valueOf(cell.getNumericCellValue());
break;
}
case Cell.CELL_TYPE_FORMULA:{
//判断cell是否为日期格式
if(DateUtil.isCellDateFormatted(cell)){
//转换为日期格式YYYY-mm-dd
cellValue = cell.getDateCellValue();
}else{
//数字
cellValue = String.valueOf(cell.getNumericCellValue());
}
break;
}
case Cell.CELL_TYPE_STRING:{
cellValue = cell.getRichStringCellValue().getString();
break;
}
default:
cellValue = "";
}
}else{
cellValue = "";
}
return cellValue;
}
总结
我做的时候大概就是这么个流程,主要使用了apache的poi插件,该插件对于操作office的文件非常厉害,大家可以作为参考,去学习学习.