点餐系统新增excel菜品数据批量导入功能

简介: 点餐系统新增excel菜品数据批量导入功能

老规矩,先看效果图


选择excel菜品



导入数据成功



之前有看过我课程的同学肯定知道,我之前是没有批量导入的类目的,不错,这个类目就是我们今天新加的功能。


实现步骤很简单:


  • 1,点击导入按钮选择excel
  • 2,导入成功后调转到商品列表页。

下面我们就来具体讲解下实现步骤


一,引入excel操作类库


我们这里主要用到了下面红框里的两个类库

类库写在pom.xml里,不要忘记做ReImport操作


二,添加导入excel的后台网页


添加菜品类目导入页

添加商品(菜品)导入页

上面的代码,我会加入到点餐系统里,有购买点餐系统课程的同学,去刷新下之前的网盘链接即可获取最新代码。


三,编写ExcelUtil工具类


把完整代码给大家贴出来,其实很简单,就是在工具类里定义一个导入菜品类目和菜品的方法。

注意:对应的导入方法是解析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<ProductCategory> excelToProductCategoryList(InputStream inputStream) {
        List<ProductCategory> 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<ProductInfo> excelToProductInfoList(InputStream inputStream) {
        List<ProductInfo> 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;
    }
}


四,编写对应的接口


上面的工具类封装好以后,我们接下来就需要在对应的Controller类里添加导入数据的方法了。

1,导入菜品类目



主要编写上图所示的两个方法 一个是打开导入的网页,另外一个是实现导入数据的功能。完整代码贴出来给大家

/*
     * excel导入网页
     * */
    @GetMapping("/excel")
    public ModelAndView excel(Map<String, Object> map) {
        return new ModelAndView("category/excel", map);
    }
    /*
     * 批量导入excel里的菜品类目到数据库
     * */
    @RequestMapping("/uploadExcel")
    @ResponseBody
    public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file,
                                    Map<String, Object> 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<ProductCategory> 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);
    }

2,导入菜品数据
代码也给大家贴出来

/*
     * excel导入网页
     * */
    @GetMapping("/excel")
    public ModelAndView excel(Map<String, Object> map) {
        return new ModelAndView("product/excel", map);
    }
    /*
     * 批量导入excel里的菜品(商品)到数据库
     * */
    @RequestMapping("/uploadExcel")
    @ResponseBody
    public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file,
                                    Map<String, Object> 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<ProductInfo> 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);
    }

到这里我们就完整的实现了点餐系统批量导入菜品数据到数据库的功能了。

相关文章
|
14天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
124 4
|
13天前
|
数据可视化 数据处理 Python
使用Pandas实现Excel中的数据透视表功能
本文介绍了如何使用Python的Pandas库实现Excel中的数据透视表功能,包括环境准备、创建模拟销售数据、代码实现及输出等步骤。通过具体示例展示了按地区和销售员汇总销售额的不同方法,如求和、平均值、最大值等,帮助读者掌握Pandas在数据处理上的强大能力。
49 12
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
47 0
|
20天前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
25 1
|
1月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
88 8
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
64 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
3月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
3月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
48 6