1.需求分析
前面我们已经完成了检查项管理、检查组管理、套餐管理等。接下来我们需要进行预约设置,其实就是设置每一天的体检预约最大数量。客户可以通过微信端在线预约,在线预约时需要选择体检的时间,如果客户选择的时间已经预约满则无法进行预约。
Apache POI
介绍:
Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。
jxl:专门操作Excel
依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
POI结构
入门案列:
1.1从Excel文件读取数据
使用POI可以从一个已经存在的Excel文件中读取数据
package com.itheima;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
import java.io.IOException;
/***
* POI的入门案例
*/
public class Demo01 {
/***
* 方式一:读取Excel
* 1.获取Excel对象
* 2.获取sheet标签页
* 3.循环sheet标签页,遍历每一行纪录
* 4.循环行,遍历每一个单元格数据输出
* @throws IOException
*/
@Test
public void Demo01() throws IOException {
final XSSFWorkbook workbook;
try {
//1.创建工作簿
workbook = new XSSFWorkbook("C:\\Users\\ASUS\\OneDrive\\文档\\传值健康day05\\资料\\hello.xlsx");
//2.获取工作表,既可以根据工作表的顺序获取,也可以根据工作表的名称获取
final XSSFSheet sheet = workbook.getSheetAt(0);
//遍历
for (Row cells : sheet) {
//遍历行对象获取单元格对象
for (Cell cell : cells) {
//获取单元格里面的值
final String value = cell.getStringCellValue();
System.out.println(value);
}
}
//关闭流
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.2第二种读取方式
还有一种方式就是获取工作表最后一个行号,从而根据行号获得行对象,通过行获取最后一个单元格索引,从而根据单元格索引获取每行的一个单元格对象,代码如下:
/***
* 第二种方式:
* 获取工作表中最后一个符号,从而获得行对象
*/
@Test
public void Demo02() {
try {
//创建工作簿
final XSSFWorkbook workbook = new XSSFWorkbook("C:\\Users\\ASUS\\OneDrive\\文档\\传值健康day05\\资料\\hello.xlsx");
//获取工作表,既可以根据工作表中得顺序获取
final XSSFSheet sheetAt = workbook.getSheetAt(0);
//获取当前工作表中最后一行的行号,行号从0开始
final int lastRowNum = sheetAt.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
//根据行号获取对象
final XSSFRow row = sheetAt.getRow(i);
final short firstCellNum = row.getFirstCellNum();
for (short j = 0; j < firstCellNum; j++) {
final String value = row.getCell(j).getStringCellValue();
System.out.println(value);
}
}
//关闭流
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
1.3向Excel文件写入数据
使用POI可以在内存中创建一个Excel文件数据写入到这个文件,最后通过输出流将内存中的Excel文件下载到磁盘
/***
* 向Excel中写入文件
*/
@Test
public void Demo03() throws Exception {
//在内存中创建一个Excel文件
final XSSFWorkbook workbook = new XSSFWorkbook();
//创建工作表,指定工作表名称
final XSSFSheet sheet = workbook.createSheet("大帅哥");
//创建行,0表示第一行
final XSSFRow row = sheet.createRow(0);
//创建单元格,0表示第一个单元格
row.createCell(0).setCellValue("编号");
row.createCell(1).setCellValue("名称");
row.createCell(2).setCellValue("年龄");
final XSSFRow row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("1");
row1.createCell(1).setCellValue("小明");
row1.createCell(2).setCellValue("10");
final XSSFRow row2 = sheet.createRow(2);
row2.createCell(0).setCellValue("2");
row2.createCell(1).setCellValue("小郑");
row2.createCell(2).setCellValue("18");
final XSSFRow row3 = sheet.createRow(3);
row3.createCell(0).setCellValue("3");
row3.createCell(1).setCellValue("小亮");
row3.createCell(2).setCellValue("18");
//通过输出流将workbook对象下载到磁盘
final FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\ASUS\\OneDrive\\文档\\xlsx\\1.xlsx");
workbook.write(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
workbook.close();
}
批量导入预约设置信息
前端代码
1.1分析
预约设置信息对应的数据表为t_ordersetting,预约设置操作对应的页面为ordersetting.html
数据表为:
orderDate:预约日期
number:可预约人数
reservations:已预约人数
批量导入预约设置信息操作过程:
1、点击模板下载按钮下载Excel模板文件
2、将预约设置信息录入到模板文件中
3、点击上传文件按钮将录入完信息的模板文件上传到服务器
4、通过POI读取上传文件的数据并保存到数据库
图片解析:
1.2提供模板文件
放在的目录
1.3实现模板文件下载
为模板下载按钮绑定事件实现模板文件下载
模板文件下载
1.4文件上传
使用ElementUI的上传并绑定相关的事件
文件上传成功提示
上传之前进行文件格式效验
后台代码
1.1Controller
工具类:POIUtils工具类
并将health_web工程创建OrderSettingController并提供upload方法
package com.itheima.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.constant.MessageConstant;
import com.itheima.entity.Result;
import com.itheima.pojo.OrderSetting;
import com.itheima.service.OrderSettingService;
import com.itheima.utils.POIUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/***
* 预约设置
*/
@RestController
@RequestMapping("/ordersetting")
public class OrderSettingController {
@Reference
private OrderSettingService orderSettingService;
@RequestMapping("/upload")
public Result upload(@RequestParam("excelFile")MultipartFile excelFile){
try {
//读取Excel文件数据
final List<String[]> list = POIUtils.readExcel(excelFile);
//进行判断
if(list !=null&& list.size()>0){
List<OrderSetting> orderSettingList=new ArrayList<>();
for (String[] strings : list) {
final OrderSetting orderSetting = new OrderSetting(new Date(strings[0]),Integer.parseInt(strings[1]));
orderSettingList.add(orderSetting);
}
orderSettingService.add(orderSettingList);
}
} catch (IOException e) {
//批量导入失败
return new Result(false, MessageConstant.IMPORT_ORDERSETTING_FAIL);
}
//批量导入成功
return new Result(true,MessageConstant.IMPORT_ORDERSETTING_SUCCESS);
}
}
1.2服务接口
创建OrderSettingService服务接口并提供新增方法
package com.itheima.service;
import com.itheima.pojo.OrderSetting;
import java.util.List;
/***
* 服务接口层
*/
public interface OrderSettingService {
/***
* 批量导入
* @param orderSettingList
*/
void add(List<OrderSetting> orderSettingList);
}
1.3服务实现类
创建服务实现类OrderSettingServiceImpl并实现新增方法
package com.itheima.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dao.OrderSettingDao;
import com.itheima.pojo.OrderSetting;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/***
* 预约设置服务
*/
@Service(interfaceClass = OrderSettingService.class)
public class OrderSettingServiceImpl implements OrderSettingService {
@Autowired
private OrderSettingDao orderSettingDao;
/***
* 批量添加
* @param orderSettingList
*/
@Override
public void add(List<OrderSetting> orderSettingList) {
if(orderSettingList!=null&&orderSettingList.size()>0){
for (OrderSetting orderSetting : orderSettingList) {
//检查此数据日期是否存在
long count=orderSettingDao.findCountByorderData(orderSetting.getOrderDate());
if(count>0){
//已经存在,执行更新操作
orderSettingDao.editNumberByOrderDate(orderSetting);
}else {
//不存在,执行添加操作
orderSettingDao.add(orderSetting);
}
}
}
}
}
1.4Dao接口
创建服务实现类OrderSettingServiceImpl并实现新增方法
package com.itheima.dao;
import com.itheima.pojo.OrderSetting;
import java.util.Date;
/***
* 持久层接口
* 映射器
*/
public interface OrderSettingDao {
/***
*预约日期查询
* @param orderDate
* @return
*/
long findCountByorderData(Date orderDate);
/***
*更新预约人数
* @param orderSetting
*/
void editNumberByOrderDate(OrderSetting orderSetting);
/***
*添加人数
* @param orderSetting
*/
void add(OrderSetting orderSetting);
}
1.5Mapper映射文件
创建Mapper映射文件OrderSettingDao.xml并提供相关SQL
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.itheima.dao.OrderSettingDao" >
<!--新增-->
<insert id="add" parameterType="com.itheima.pojo.OrderSetting">
insert into t_ordersetting
(orderDate,number,reservations)
values
(#{orderDate},#{number},#{reservations})
</insert>
<!--根据日期更新预约人数-->
<update id="editNumberByOrderDate" parameterType="com.itheima.pojo.OrderSetting">
update t_ordersetting set number = #{number} where orderDate = #{orderDate}
</update>
<!--根据预约日期查询-->
<select id="findCountByOrderDate" parameterType="java.util.Date" resultType="long">
select count(*) from t_ordersetting where orderDate = #{orderDate}
</select>
</mapper>