分享一套Excel文件与DB进行数据导入与导出的工具_Java_poi_springboot

之前也做过excel文件导入数据库与数据库导出成excel文件的测试,但是没有给大家分享出开发业务时简洁的模板,可能根据需求不同导入与导出的元数据样板也不同,开发人员就需要不断地修改代码。

  1. 实现方式

我们利用POI的依赖实现这类的文件解析与文件创建功能:

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>
  1. 实现代码

我们将实现代码的过程分为先创建枚举来规定数据样板的类型:

public enum ExcelDataType {
    /*价格表类型,设备表类型,用户表类型,订单表类型*/
    DATA_PRICE,DATA_DEVICE,DATA_USER,DATA_ORDER
}

其次我们需要分析一下:数据的导出很简单就是接受请求之后将数据库的数据一一放入你创建的表里的行里,将属性一个一个的填入单元格中,然后利用response写入流文件传输到前端。数据导入则需要解析传递的文件,将文件中的表行单元格一一的对应到属性上去,注意数据格式,然后就是批量导入的方法直接保存进数据库,注意数据的重复问题。

@Component("excelUtils")
public class ExcelUtils {
    @Resource
    private PriceService priceService;

    @Resource
    private OrderService orderService;

    @Resource
    private DeviceService deviceService;

    @Resource
    private UserService userService;

    private Price price = new Price();

    private Device device = new Device();

    private Order order = new Order();

    private User user = new User();

    private List<Price> priceList = new LinkedList<>();

    private List<Device> deviceList = new LinkedList<>();

    private List<Order> orderList = new LinkedList<>();

    private List<User> userList = new LinkedList<>();

    /**
     * 导入Excel文件到数据库
     *
     * @param excelFile       文件对象
     * @param fileInputStream 文件输入流
     * @param dataType        文件批量导入实体类型 例如Price是价格清单实体
     * @return 是否导入完成
     */
    public boolean fromExcelInDB(@Nullable MultipartFile excelFile, @Nullable InputStream fileInputStream, ExcelDataType dataType) {
        if (excelFile != null && fileInputStream == null) {
            String filename = excelFile.getOriginalFilename();
            if (filename != null) {
                String suffix = filename.substring(filename.lastIndexOf(".") + 1);
                InputStream inputStream = null;
                try {
                    inputStream = excelFile.getInputStream();
                    Workbook workbook = null;
                    if ("xlsx".equals(suffix)) {
                        /*针对不同版本的Excel文件*/
                        workbook = WorkbookFactory.create(inputStream);
                    } else {
                        workbook = WorkbookFactory.create(inputStream);
                    }
                    Sheet sheet = workbook.getSheetAt(0);
                    if (sheet != null) {
                        for (int i = 2; i <= sheet.getLastRowNum(); i++) {
                            Row row = sheet.getRow(i);
                            if (row == null) continue;
                            if (row.getCell(0) == null || row.getCell(0).getStringCellValue() == null) break;
                            if (dataType == ExcelDataType.DATA_PRICE) {
                                price.setDeviceId(row.getCell(0).getStringCellValue());
                                price.setDeviceTime((int) row.getCell(1).getNumericCellValue());
                                price.setReceipt((int) row.getCell(2).getNumericCellValue());
                                price.setInfo(row.getCell(3).getStringCellValue());
                                priceList.add(price);
                                price.clear();
                            } else if (dataType == ExcelDataType.DATA_DEVICE) {
                                device.setId(row.getCell(0).getStringCellValue());
                                device.setState(row.getCell(1).getBooleanCellValue());
                                device.setLock(row.getCell(2).getBooleanCellValue());
                                device.setPower(row.getCell(3).getBooleanCellValue());
                                device.setOutSign((int) row.getCell(4).getNumericCellValue());
                                device.setInfo(row.getCell(5).getStringCellValue());
                                deviceList.add(device);
                                device.clear();
                            } else if (dataType == ExcelDataType.DATA_ORDER) {
                                order.setUserId(row.getCell(0).getStringCellValue());
                                order.setDeviceId(row.getCell(1).getStringCellValue());
                                order.setOrderTime(String.valueOf(row.getCell(2).getLocalDateTimeCellValue()));
                                order.setUseTime((int) row.getCell(3).getNumericCellValue());
                                order.setReceipt(row.getCell(4).getNumericCellValue());
                                order.setOrderState(row.getCell(5).getBooleanCellValue());
                                orderList.add(order);
                                order.clear();
                            } else {
                                user.setId(row.getCell(0).getStringCellValue());
                                user.setName(row.getCell(1).getStringCellValue());
                                user.setPhone(row.getCell(2).getStringCellValue());
                                user.setAmount((int) row.getCell(3).getNumericCellValue());
                                user.setPassword(row.getCell(4).getStringCellValue());
                                user.setWxId(row.getCell(5).getStringCellValue());
                                userList.add(user);
                                user.clear();
                            }

                        }
                    }
                    if (dataType == ExcelDataType.DATA_PRICE) {
                        return priceService.savePriceBatch(priceList);
                    } else if (dataType == ExcelDataType.DATA_ORDER) {
                        /*订单的批量导入......*/
                        return false;
                    } else if (dataType == ExcelDataType.DATA_DEVICE) {
                        return deviceService.saveBatchDevice(deviceList);
                    } else
                        return false;
                } catch (IOException e) {
                    e.printStackTrace();
                    try {
                        inputStream.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        } else if (excelFile == null && fileInputStream != null) {
            try {
                Workbook workbook = null;
                workbook = WorkbookFactory.create(fileInputStream);
                Sheet sheet = workbook.getSheetAt(0);
                if (sheet != null) {
                    for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                        Row row = sheet.getRow(i);
//                        System.out.println(row.getLastCellNum()+row.getCell(0).getStringCellValue());
                        if (row == null) continue;
                        if (row.getCell(0) == null || row.getCell(0).getStringCellValue() == null) break;
                        if (dataType == ExcelDataType.DATA_PRICE) {
                            price.setDeviceId(row.getCell(0).getStringCellValue());
                            price.setDeviceTime((int) row.getCell(1).getNumericCellValue());
                            price.setReceipt((int) row.getCell(2).getNumericCellValue());
                            price.setInfo(row.getCell(3).getStringCellValue());
                            priceList.add(price);
                            price.clear();
                        } else if (dataType == ExcelDataType.DATA_DEVICE) {
                            device.setId(row.getCell(0).getStringCellValue());
                            device.setState(row.getCell(1).getBooleanCellValue());
                            device.setLock(row.getCell(2).getBooleanCellValue());
                            device.setPower(row.getCell(3).getBooleanCellValue());
                            device.setOutSign((int) row.getCell(4).getNumericCellValue());
                            device.setInfo(row.getCell(5).getStringCellValue());
                            deviceList.add(device);
                            device.clear();
                        } else if (dataType == ExcelDataType.DATA_ORDER) {
                            order.setUserId(row.getCell(0).getStringCellValue());
                            order.setDeviceId(row.getCell(1).getStringCellValue());
                            order.setOrderTime(String.valueOf(row.getCell(2).getLocalDateTimeCellValue()));
                            order.setUseTime((int) row.getCell(3).getNumericCellValue());
                            order.setReceipt(row.getCell(4).getNumericCellValue());
                            order.setOrderState(row.getCell(5).getBooleanCellValue());
                            orderList.add(order);
                            order.clear();
                        } else {
                            user.setId(row.getCell(0).getStringCellValue());
                            user.setName(row.getCell(1).getStringCellValue());
                            user.setPhone(row.getCell(2).getStringCellValue());
                            user.setAmount((int) row.getCell(3).getNumericCellValue());
                            user.setPassword(row.getCell(4).getStringCellValue());
                            user.setWxId(row.getCell(5).getStringCellValue());
                            userList.add(user);
                            user.clear();
                        }

                    }
                }
                if (dataType == ExcelDataType.DATA_PRICE) {
                    return priceService.savePriceBatch(priceList);
                } else if (dataType == ExcelDataType.DATA_ORDER) {
                    /*订单的批量导入......*/
                    return false;
                } else if (dataType == ExcelDataType.DATA_DEVICE) {
                    return deviceService.saveBatchDevice(deviceList);
                } else
                    return false;
            } catch (IOException e) {
                e.printStackTrace();
                try {
                    fileInputStream.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }


        }
        return false;
    }

    /**
     * 将数据输出成Excel文件(前端传递数据,或是接口搜索将数据放入Attribute中)
     *
     * @param request     请求
     * @param response    响应
     * @param dataType    实体数据类型 例如Price是价格清单实体
     * @param columnCount 实体的属性数量 例如Price实体具备4个属性
     */
    public void fromDBToExcel(HttpServletRequest request, HttpServletResponse response, ExcelDataType dataType, int columnCount) {
        try {
            HSSFWorkbook workbook = new HSSFWorkbook();
            if (dataType == ExcelDataType.DATA_PRICE) {
                priceList = (List<Price>) request.getAttribute("priceList");
                HSSFSheet sheet = workbook.createSheet("设备价格清单");
                int rowIndex = 0;
                int cellIndex = 0;
                while (cellIndex < columnCount) {
                    HSSFRow row = sheet.createRow(rowIndex++);
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("设备号");
                    row.createCell(cellIndex++, CellType.NUMERIC).setCellValue("使用时长");
                    row.createCell(cellIndex++, CellType.NUMERIC).setCellValue("价格/元");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("备注");
                }
                cellIndex = 0;
                for (Price price : priceList) {
                    while (cellIndex < columnCount) {
                        HSSFRow row = sheet.createRow(rowIndex++);
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(price.getDeviceId());
                        row.createCell(cellIndex++, CellType.NUMERIC).setCellValue(price.getDeviceTime());
                        row.createCell(cellIndex++, CellType.NUMERIC).setCellValue(price.getReceipt());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(price.getInfo());
                    }
                    cellIndex = 0;
                }
            } else if (dataType == ExcelDataType.DATA_DEVICE) {
                deviceList = (List<Device>) request.getAttribute("deviceList");
                HSSFSheet sheet = workbook.createSheet("设备清单");
                int rowIndex = 0;
                int cellIndex = 0;
                while (cellIndex < columnCount) {
                    HSSFRow row = sheet.createRow(rowIndex++);
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("设备号");
                    row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue("设备可用状态");
                    row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue("设备锁状态");
                    row.createCell(cellIndex++, CellType.NUMERIC).setCellValue("设备输出端口");
                    row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue("设备电源状态");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("设备区号");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("备注");
                }
                cellIndex = 0;
                for (Device device : deviceList) {
                    while (cellIndex < columnCount) {
                        HSSFRow row = sheet.createRow(rowIndex++);
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(device.getId());
                        row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue(device.getState());
                        row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue(device.getLock());
                        row.createCell(cellIndex++, CellType.NUMERIC).setCellValue(device.getOutSign());
                        row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue(device.getPower());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(device.getAreaCode());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(device.getInfo());
                    }
                    cellIndex = 0;
                }
            } else if (dataType == ExcelDataType.DATA_ORDER) {
                orderList = (List<Order>) request.getAttribute("orderList");
                HSSFSheet sheet = workbook.createSheet("订单清单");
                int rowIndex = 0;
                int cellIndex = 0;
                while (cellIndex < columnCount) {
                    HSSFRow row = sheet.createRow(rowIndex++);
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("用户账号");
                    row.createCell(cellIndex++, CellType.NUMERIC).setCellValue("使用时长");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("设备号");
                    row.createCell(cellIndex++, CellType.NUMERIC).setCellValue("付款金额");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("创建订单时间");
                    row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue("订单支付状态");
                }
                cellIndex = 0;
                for (Order order : orderList) {
                    while (cellIndex < columnCount) {
                        HSSFRow row = sheet.createRow(rowIndex++);
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(order.getUserId());
                        row.createCell(cellIndex++, CellType.NUMERIC).setCellValue(order.getUseTime());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(order.getDeviceId());
                        row.createCell(cellIndex++, CellType.NUMERIC).setCellValue(order.getReceipt());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(order.getOrderTime());
                        row.createCell(cellIndex++, CellType.BOOLEAN).setCellValue(order.getOrderState());
                    }
                    cellIndex = 0;
                }
            } else {
                userList = (List<User>) request.getAttribute("userList");
                HSSFSheet sheet = workbook.createSheet("用户清单");
                int rowIndex = 0;
                int cellIndex = 0;
                while (cellIndex < columnCount) {
                    HSSFRow row = sheet.createRow(rowIndex++);
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("用户账号");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("用户昵称");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("用户电话");
                    row.createCell(cellIndex++, CellType.NUMERIC).setCellValue("用户余额");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("用户密码");
                    row.createCell(cellIndex++, CellType.STRING).setCellValue("用户微信openid");
                }
                cellIndex = 0;
                for (User user : userList) {
                    while (cellIndex < columnCount) {
                        HSSFRow row = sheet.createRow(rowIndex++);
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(user.getId());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(user.getName());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(user.getName());
                        row.createCell(cellIndex++, CellType.NUMERIC).setCellValue(user.getAmount());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(user.getPassword());
                        row.createCell(cellIndex++, CellType.STRING).setCellValue(user.getWxId());
                    }
                    cellIndex = 0;
                }
            }
            response.setContentType("application/octet-stream");
            response.setHeader("Content-disposition", "attachment;filename=" + dataType + ".xls");
            response.flushBuffer();
            workbook.write(response.getOutputStream());
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            priceList.clear();
            orderList.clear();
            deviceList.clear();
            userList.clear();
        }
    }

如果测试失败,要记住实体类上打没打上lombok的注解@Data,有的话去掉,手写getter与setter方法,lombok的源码与源的字节码是有区别的,解析过程可能出现问题。代码里的clear方法是我自己加的,目的是将实体类的全部属性设置为null,这也就直接的要求你的属性类型不能是元类型,尽量都设置为对象引用类型。

  1. 测试代码

导入测试代码:

@PostMapping("exportExcel")
    @ResponseBody
    public GeneralResponse<Boolean> exportExcel(@RequestParam("fileName") MultipartFile file) {
        try{
            boolean result = excelUtils.fromExcelInDB(file, null, ExcelDataType.DATA_DEVICE);
            return result ? GeneralResponse.ServerSuccess(true, "服务访问成功") :
                    GeneralResponse.ServerError("服务拒绝访问");
        }catch (Exception e){
            try {
                InputStream inputStream = file.getInputStream();
                boolean result =  excelUtils.fromExcelInDB(null,inputStream,ExcelDataType.DATA_DEVICE);
                return result ? GeneralResponse.ServerSuccess(true, "服务访问成功") :
                        GeneralResponse.ServerError("服务拒绝访问");
            } catch (IOException ex) {
                e.printStackTrace();
                ex.printStackTrace();
                return GeneralResponse.ServerError("服务拒绝访问");
            }
        }
    }

导出测试代码:

@GetMapping("/PriceDBToExcel")
    @ResponseBody
    public void PriceDBtoExcel(HttpServletRequest  request, HttpServletResponse response){
        List<Price> priceList = priceService.getPriceByDeviceId("A101");
        request.setAttribute("priceList",priceList);
        excelUtils.fromDBToExcel(request,response, ExcelDataType.DATA_PRICE,4);
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一个将excel文件导入到SQLServer表中的程序 一 双击Input.exe运行程序,将弹出一个窗口,这时请你在"数据库名"后面的 输入栏中输入数据库名(如果是千方百剂就是输入帐套名).你如果没对数 据库的登录进行特殊修改的话,那"用户名和密码"就没必要修改了. 二 填好以上输入框后,真接单击"连接数据库",如果连接成功,将弹出"数据库 连接成功,你现在可以导入数据"的对话框,你按"OK"后将弹出新的一个数据 导入的窗口. 三 在这个窗口上单击"打开EXCEL文件"按钮,然后选择你要导入Excel文件, 按打开(这时如果你数据比较多的话你可能要多等一会儿时间),之后就弹 出一个让你选择Excel工作区的窗口,你可以在下拉框中选择你数据所在的 Excel工作区了.选完以后按确定,你可以看到你Excel里的数据已经在"Excel 数据信息"里面了.而且还可以看到多了一列"不导入"的选项了.你如果哪一行 的数据导入的话你可以打勾,这一行将不被导入. 四 做完以上三步后,请在"表名"后面的下拉框中选择你所要导入的表的名称. 选完后,你得到"数据转换信息如下"这一栏配置数据转换的对应关系. 五 双击Excel字段处从下拉框中选择excel的列,双击表字段处从下拉框中选 择SQL表的列,然后看这列是否是"关键字",是的话打勾,不是不打勾.选择 完第一行后,就按方向键的向下键,继续第二行的选择,直到配置完Excel列 和表字段的对应关系为止. 六 按"导入数据"按钮系统会自动将页面转到"转换信息"这一页面.你将可以看 到第几行导入成功,或第几行导入失改的信息.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值