点餐系统上线这段时间,有很多朋友反馈,是否可以添加一个菜肴批量导出的功能。因为平常比较忙,始终没有时间把食材批量导出的功能加进来。明天刚好空下来时间了,就来教你们实现下食材批量导出的功能。前面会把这节功能录制成视频放在点餐系统的课程里。
传送门:点餐系统,java后台+点餐小程序
老规矩,先看疗效图
选择excel食材
导出数据成功
之前有看过我课程的朋友肯定晓得,我之前是没有批量导出的类目的,不错,这个类目就是我们明天新加的功能。
实现步骤很简单:
下边我们就来具体讲解下实现步骤
一,引入excel操作泛型
我们这儿主要用到了下边红框里的两个解释器
泛型写在pom.xml里,不要忘掉做操作
二,添加导出excel的后台网页
添加食材类目导出页
添加商品(食材)导出页
里面的代码,我会加入到点餐系统里,有订购点餐系统课程的朋友小程序点餐,去刷新下之前的云盘链接即可获取最新代码。
三,编撰工具类
把完整代码给你们贴下来,虽然很简单小程序点餐,就是在工具类里定义一个导出食材类目和食材的方式。
注意:对应的导出方式是解析excel里的数据,所以你的excel数据必须和我的保持一致,就是第几列是哪些数据,要和我的对应上去。要不然会造成数据存错的问题。
package com.qcl.utils;
import com.qcl.dataobject.ProductCategory;
import com.qcl.dataobject.ProductInfo;
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.ss.usermodel.WorkbookFactory;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
/*
* 操作excel
* */
@Slf4j
public class ExcelUtils {
/*
* 菜品类目批量导入
* 要求
* 1,必须以.xlsx结尾的excel文件
* 2,表格内容必须按照下面顺序
* 0:类目名,1:type值
*
* */
public static List excelToProductCategoryList(InputStream inputStream) {
List list = new ArrayList<>();
Workbook workbook = null;
try {
workbook = WorkbookFactory.create(inputStream);
inputStream.close();
//工作表对象
Sheet sheet = workbook.getSheetAt(0);
//总行数
int rowLength = sheet.getLastRowNum();
System.out.println("总行数有多少行" + rowLength);
//工作表的列
Row row = sheet.getRow(0);
//总列数
int colLength = row.getLastCellNum();
System.out.println("总列数有多少列" + colLength);
//得到指定的单元格
Cell cell = row.getCell(0);
for (int i = 1; i <= rowLength; i++) {
ProductCategory goodInfo = new ProductCategory();
row = sheet.getRow(i);
for (int j = 0; j < colLength; j++) {
cell = row.getCell(j);
if (cell != null) {
cell.setCellType(Cell.CELL_TYPE_STRING);
String data = cell.getStringCellValue();
data = data.trim();
//列:0:类目名,1:type值
if (j == 0) {
goodInfo.setCategoryName(data);
} else if (j == 1) {
goodInfo.setCategoryType(Integer.parseInt(data));
}
}
}
list.add(goodInfo);
// log.error("每行数据={}", menuInfo);
}
} catch (Exception e) {
log.error("excel导入抛出的错误={}", e);
}
return list;
}
/*
* 菜品(商品)批量导入
* 要求
* 1,必须以.xlsx结尾的excel文件
* 2,表格内容必须按照下面顺序
* 0商品名,1单价,2库存,3类目,4描述,5图片链接
*
* */
public static List excelToProductInfoList(InputStream inputStream) {
List list = new ArrayList<>();
Workbook workbook = null;
try {
workbook = WorkbookFactory.create(inputStream);
inputStream.close();
//工作表对象
Sheet sheet = workbook.getSheetAt(0);
//总行数
int rowLength = sheet.getLastRowNum();
//工作表的列
Row row = sheet.getRow(0);
//总列数
int colLength = row.getLastCellNum();
//得到指定的单元格
Cell cell = row.getCell(0);
for (int i = 1; i <= rowLength; i++) {
ProductInfo goodInfo = new ProductInfo();
row = sheet.getRow(i);
for (int j = 0; j < colLength; j++) {
cell = row.getCell(j);
if (cell != null) {
cell.setCellType(Cell.CELL_TYPE_STRING);
String data = cell.getStringCellValue();
data = data.trim();
//列: 0商品名,1单价,2库存,3类目,4描述,5图片链接
if (j == 0) {
goodInfo.setProductId(KeyUtil.genUniqueKey());
goodInfo.setProductName(data);
} else if (j == 1) {
goodInfo.setProductPrice(new BigDecimal(data));
} else if (j == 2) {
goodInfo.setProductStock(Integer.parseInt(data));
} else if (j == 3) {
goodInfo.setCategoryType(Integer.parseInt(data));
} else if (j == 4) {
goodInfo.setProductDescription(data);
} else if (j == 5) {
goodInfo.setProductIcon(data);
}
}
}
list.add(goodInfo);
}
} catch (Exception e) {
log.error("excel导入抛出的错误={}", e);
}
return list;
}
}
四,编撰对应的插口
里面的工具类封装好之后,我们接出来就须要在对应的类里添加导出数据的方式了。
/*
* excel导入网页
* */
@GetMapping("/excel")
public ModelAndView excel(Map map) {
return new ModelAndView("category/excel", map);
}
/*
* 批量导入excel里的菜品类目到数据库
* */
@RequestMapping("/uploadExcel")
@ResponseBody
public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file,
Map map) {
String name = file.getOriginalFilename();
if (name.length() < 6 || !name.substring(name.length() - 5).equals(".xlsx")) {
map.put("msg", "文件格式错误");
map.put("url", "/sell/seller/category/excel");
return new ModelAndView("common/error", map);
}
List list;
try {
list = ExcelUtils.excelToProductCategoryList(file.getInputStream());
log.info("excel导入的list={}", list);
if (list == null || list.size() <= 0) {
map.put("msg", "导入失败");
map.put("url", "/sell/seller/category/excel");
return new ModelAndView("common/error", map);
}
//excel的数据保存到数据库
try {
for (ProductCategory excel : list) {
if (excel != null) {
//如果类目type值已存在,就不再导入
List typeList = categoryService.findOneByType(excel.getCategoryType());
log.info("查询类目type是否存在typeList={}", typeList);
if (typeList == null || typeList.size() < 1) {
System.out.println("保存成功");
categoryService.save(excel);
}
}
}
} catch (Exception e) {
log.error("某一行存入数据库失败={}", e);
}
} catch (Exception e) {
e.printStackTrace();
map.put("msg", e.getMessage());
map.put("url", "/sell/seller/category/excel");
return new ModelAndView("common/error", map);
}
map.put("url", "/sell/seller/category/list");
return new ModelAndView("common/success", map);
}
/*
* excel导入网页
* */
@GetMapping("/excel")
public ModelAndView excel(Map map) {
return new ModelAndView("product/excel", map);
}
/*
* 批量导入excel里的菜品(商品)到数据库
* */
@RequestMapping("/uploadExcel")
@ResponseBody
public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file,
Map map) {
String name = file.getOriginalFilename();
if (name.length() < 6 || !name.substring(name.length() - 5).equals(".xlsx")) {
map.put("msg", "文件格式错误");
map.put("url", "/sell/seller/product/excel");
return new ModelAndView("common/error", map);
}
List list;
try {
list = ExcelUtils.excelToProductInfoList(file.getInputStream());
log.info("excel导入的list={}", list);
if (list == null || list.size() <= 0) {
map.put("msg", "导入失败");
map.put("url", "/sell/seller/product/excel");
return new ModelAndView("common/error", map);
}
//excel的数据保存到数据库
try {
for (ProductInfo excel : list) {
if (excel != null) {
//如果类目type值已存在,就不再导入
productService.save(excel);
}
}
} catch (Exception e) {
log.error("某一行存入数据库失败={}", e);
}
} catch (Exception e) {
e.printStackTrace();
map.put("msg", e.getMessage());
map.put("url", "/sell/seller/product/excel");
return new ModelAndView("common/error", map);
}
map.put("url", "/sell/seller/product/list");
return new ModelAndView("common/success", map);
}
到这儿我们就完整的实现了点餐系统批量导出食材数据到数据库的功能了。
完整的代码我会放在点餐系统里,订购我点餐系统课程的朋友,记得去刷新下之前的云盘链接,就可以获取最新的代码了
演示视频也早已录制下来了,你们可以去看下
完整的点餐系统,包含Java后台和扫码点餐小程序,疗效图如下。
免责声明:部分文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性,如本站文章和转稿涉及版权等问题,请作者在及时联系本站,我们会尽快为您处理。