java实现excel上传功能

最近在开发中,有使用excel上传数据的功能需要实现,在实现过后,再次进行记录并分享。

1.场景分析

医院给院内设备批量录入设备使用记录数据,若一条一条录则太过麻烦,于是excel上传需求产生。

2.技术选型

采用springBoot+Java8,依赖为:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency> 

3.代码 

3.1后端:

//指定处理POST请求的接口路径为"/excelUpload"
@PostMapping("excelUpload")
    public Result excelUpload(@RequestParam("file") MultipartFile file) throws IOException {
        //打印文件名和文件大小
        System.out.println(file.getOriginalFilename());
        System.out.println(file.getSize());
        
        //创建java对象的集合类,用于接收excel数据
        ArrayList<excelUploadCustomLoggingDataDto> excelUploadCustomLoggingDataDtos = new ArrayList();

        //getWorkbook方法处理文件是xlsx或xls的情况
        InputStream inputStream = file.getInputStream();
        Workbook workbook = getWorkbook(inputStream);

        if (workbook != null) {//判断Workbook对象是否成功创建,确保处理的文件是Excel格式。
            Sheet sheet = workbook.getSheetAt(0); // 假设数据在第一个Sheet中,也就是这个上传的excel文件内的第一个页面

            Iterator<Row> iterator = sheet.iterator();//创建行的迭代器。
            if (iterator.hasNext()) {检查是否有行数据
                // 处理标题行,获取列索引
                Row headerRow = iterator.next();//获取第一行数据,即标题行
                //findColumnIndex:找到指定列的索引
                int deviceIndex = findColumnIndex(headerRow, "设备生产编号");
                int hospitalIndex = findColumnIndex(headerRow, "医院编订号");
                int quantityIndex = findColumnIndex(headerRow, "使用数量");
                int timeIndex = findColumnIndex(headerRow, "采集时间");

                while (iterator.hasNext()) {//遍历除标题行之外的所有行。
                    Row currentRow = iterator.next();

                    // 使用列索引获取对应列的值
                    //获取生产编号
                    String facilityProductionNumber = getCellValue(currentRow.getCell(deviceIndex));
                    //获取医院编订号
                    String hospitalScheduledNumber = getCellValue(currentRow.getCell(hospitalIndex));
                    //获取使用数量
                    String useCount = getCellValue(currentRow.getCell(quantityIndex));
                    //获取采集时间
                    String dataTime = getCellValue(currentRow.getCell(timeIndex));

                    // 创建对象并添加到列表
                    excelUploadCustomLoggingDataDto obj = new excelUploadCustomLoggingDataDto(facilityProductionNumber, hospitalScheduledNumber, dataTime,useCount);
                    excelUploadCustomLoggingDataDtos.add(obj);
                }
            }

            workbook.close();
        }
        System.out.println("excel上传完成");
        //此处我的需求是在前端进行展示而不是直接存储数据库,所以返回给前端
        return Result.success(excelUploadCustomLoggingDataDtos);
    }

 private static Workbook getWorkbook(InputStream inputStream) throws IOException {
        try {
            return new XSSFWorkbook(inputStream); // 尝试解析为xlsx格式
        } catch (Exception e) {
            // 如果解析失败,尝试解析为xls格式
            return new HSSFWorkbook(inputStream);
        }
    }


//根据excel中单元格类型不同调用不同方法获取值,可根据自己内容做修改
private static String getCellValue(Cell cell) {
        if (cell == null) {

            return ""; // 处理空单元格
        }

        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 处理日期类型
                    return cell.getDateCellValue().toString();
                } else {
                    // 处理普通数字类型
                    DataFormatter dataFormatter = new DataFormatter();
                    return dataFormatter.formatCellValue(cell);
                }
            default:
                return "";
        }
    }

 private static int findColumnIndex(Row headerRow, String columnName) {
        Iterator<Cell> cellIterator = headerRow.cellIterator();
        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            if (cell.getStringCellValue().equals(columnName)) {
                return cell.getColumnIndex();
            }
        }
        return -1; // 列不存在
    }

 3.2前端

采用的是layu的上传组件

  //excel上传
        upload.render({
            elem: '#excelUpload', // 绑定上传按钮
            url: '${pageContext.request.contextPath}/customLoggingDataInfo/excelUpload', 
            accept: 'file', // 普通文件
            exts:'xls|xlsx',
            done: function(res){//成功回调
                console.log("res",res);
                if(res.code==200){
                    dataList=[]

                    res.data.forEach((element)=>{
                        element.hospitalId=hospitalAccount.hospitalId
                        dataList.push(element)
                    })
                    updateDataList()//数据刷新至页面
                }else{
                    layer.msg(res.message)
                }

            }
        });

4.excel等展示

这是以上代码对应的excel格式

上传后前端显示如下:

 

 总体就是这样,如有遗漏,请指出。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于Java上传Excel文件的功能开发,你可以使用Apache POI库来实现。下面是一个简单的步骤指南: 1. 导入Apache POI库:在你的项目中添加Apache POI的依赖,可以通过Maven或Gradle来进行配置。 2. 创建上传文件的表单:在你的前端页面中创建一个表单,用于选择Excel文件并提交上传。 3. 后端处理上传文件:在后端代码中,你需要处理上传的文件。可以使用Spring MVC或Servlet来接收文件,并保存到服务器的临时目录。 4. 解析Excel文件:使用Apache POI库来解析上传Excel文件。根据你的需求,可以选择使用HSSF(用于处理Excel 2003及之前版本)或XSSF(用于处理Excel 2007及之后版本)。 5. 读取Excel数据:通过POI库提供的API,你可以读取Excel文件中的数据。根据Excel文件的结构,使用合适的API方法来提取数据。 6. 处理Excel数据:根据你的业务需求,对读取到的Excel数据进行处理。你可以将数据存储到数据库中,进行进一步的计算或展示等操作。 7. 返回处理结果:将处理后的结果返回给前端页面,可以是成功或失败的消息,或者是处理后的数据展示。 需要注意的是,对于大型Excel文件或者需要处理大量数据的情况,建议采用流式处理(Streaming API)来避免内存溢出的问题。 希望以上步骤能对你的Java上传Excel文件功能开发有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值