栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot文件上传+下载+解析“xls“文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot文件上传+下载+解析“xls“文件

目录

一、文件上传

1.创建一个 LogService,先实现文件上传功能服务

2.创建一个控制器LogController

3.然后我们就可以启动项目,访问对应的url。

 二、下载

1.在LogService文件基础上,新增logDownload方法

2.在LogController文件基础上,新增logDownload方法

3.访问下载url 

三、解析xls文件

1.导入poi.jar包

2.创建一个解析xls的工具类

3.使用HandleFile工具类

3.改造一下LogService.upLogLoad方法,实现文件上传+文件解析

4.最后启动服务,再上传一次文件

结果就大功告成。


工作上我们经常会遇到,数据导入数据库,或者报表导出。这期,我就到大家用springboot实现“文件上传+下载+解析"xls"文件”。

一、文件上传

1.创建一个 LogService,先实现文件上传功能服务
@Service
public class LogService {

   
    public ResultVo upLogLoad(MultipartFile file) throws Exception {
        if (file == null || file.isEmpty()) {
            return ResultVo.error(1, "未选择需上传的日志文件");
        }
        //获取绝对路径
        String filePath = new File("src/main/java/com/example/thyy/file").getAbsolutePath();
        //获取文件名
        String fileName = file.getOriginalFilename();
        //判断文件类型,这里我们只要xls文件
        if (fileName != null && !fileName.endsWith(".xls"))
            return ResultVo.error(1, "请选择“xls”文件");
        //获取文件上传名称
        File fileUpload = new File(filePath, fileName);
        if (fileUpload.exists()) {
            return ResultVo.error(1, "上传的日志文件已存在");
        }
       
        try {
            //上传文件
            file.transferTo(fileUpload);
            return ResultVo.success();
        } catch (IOException e) {
            return ResultVo.error(1, "上传日志文件到服务器失败" + e.toString());
        }


    }

}

注意:filePath是指上传的文件,存到那个目录上。我这里我只写相对路径,然后后在通过File.getAbsolutePath()获取文件全路径。

2.创建一个控制器LogController
RestController
@RequestMapping("/log")
public class LogController {

    @Autowired
    LogService logService;

    @PostMapping(value = "/upload")
    public ResultVo logUpload(@RequestParam("file") MultipartFile file) throws Exception {
        return logService.upLogLoad(file);
    }

}

3.然后我们就可以启动项目,访问对应的url。

我用postman测试如下

 然后就能看到我们上传的文件了

 二、下载

1.在LogService文件基础上,新增logDownload方法
 
    public ResultVo logDownload(String name, HttpServletResponse response) throws Exception {
        //根据name,找到文件目录下,对应的文件
        File file = new File("src/main/java/com/example/thyy/file/" + File.separator + name);
        if (!file.exists()) {
            return ResultVo.error(1, name + "文件不存在");
        }
//        声明传输的内内容类型
        response.setContentType("application/force-download");
        response.addHeader("Content-Disposition", "attachment;fileName=" + name);

        byte[] buffer = new byte[1024];
        try (FileInputStream fis = new FileInputStream(file);
             BufferedInputStream bis = new BufferedInputStream(fis)) {
            OutputStream os = response.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
        }
        return ResultVo.success();
    }

2.在LogController文件基础上,新增logDownload方法
    @GetMapping(value = "/downlod/{name}")
    public ResultVo logDownload(@PathVariable String name, HttpServletResponse response) throws Exception {
        return logService.logDownload(name, response);
    }

3.访问下载url 

url正确时

url错误时

 注意:在下载URL后加上我们要下载的文件名。

三、解析xls文件

1.导入poi.jar包

    org.apache.poi
    poi
    3.9


    org.apache.poi
    poi-ooxml
    3.9

 为方便写测试,再httpclient包

        
            org.apache.httpcomponents
            httpclient
            4.5.6
        

2.创建一个解析xls的工具类
public class HandleFile{


    
    public static List> parseExcel(InputStream in, String fileName) throws Exception {
        List list = null;
        Workbook work = null;
        list = new ArrayList<>();
        //创建Excel工作薄
        work = getWorkbook(in, fileName);
        if (null == work) {
            throw new Exception("创建Excel工作薄为空!");
        }
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;

        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            sheet = work.getSheetAt(i);
            if (sheet == null) {
                continue;
            }

            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                if (row == null || row.getFirstCellNum() == j) {
                    continue;
                }

                List li = new ArrayList<>();
                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                    String value = "";
                    cell = row.getCell(y);
                    switch (cell.getCellType()) {
                        // 数字
                        case HSSFCell.CELL_TYPE_NUMERIC:
                            //如果为时间格式的内容
                            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                //注:format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制,若要24小时制,则把小h变为H即可,yyyy-MM-dd HH:mm:ss
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                value=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
                                li.add(value);
                                break;
                            }else {
                                value= String.valueOf(cell.getNumericCellValue());
                                String[] split = value.split("\.");
                                //整型不保留小数部分
                                if (split[1].length()==1 && split[1].equals("0")){
                                    value = split[0];
                                    li.add(value);
                                    break;
                                }
                                li.add(value);
                                break;
                            }
                            // 字符串
                        case HSSFCell.CELL_TYPE_STRING:
                            value = cell.getStringCellValue();
                            li.add(value);
                            break;
                        // Boolean
                        case HSSFCell.CELL_TYPE_BOOLEAN:
                            value = cell.getBooleanCellValue() + "";
                            li.add(value);
                            break;
                        // 公式
                        case HSSFCell.CELL_TYPE_FORMULA:
                            value = cell.getCellFormula() + "";
                            li.add(value);
                            break;
                        // 空值
                        case HSSFCell.CELL_TYPE_BLANK:
                            value = "";
                            li.add(value);
                            break;
                        // 故障
                        case HSSFCell.CELL_TYPE_ERROR:
                            value = "非法字符";
                            li.add(value);
                            break;
                        default:
                            value = "未知类型";
                            li.add(value);
                            break;
                    }
                }
                list.add(li);
            }
        }
        return list;

    }


    
    public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
        Workbook workbook = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if (".xls".equals(fileType)) {
            workbook = new HSSFWorkbook(inStr);
        } else if (".xlsx".equals(fileType)) {
            workbook = new XSSFWorkbook(inStr);
        } else {
            throw new Exception("请上传excel文件!");
        }
        return workbook;
    }

} 

3.使用HandleFile工具类

写个测试类

 @Test
 public void testExel() throws Exception {
//       File file= new File("C:/Users/Administrator/documents/新建 XLS 工作表.xls");
        File file = new File("C:/Users/Administrator/documents/Tencent Files/229068393/FileRecv/202110-205.xlsx");
        if (!file.exists()) {
            throw new Exception("不存在文件");
        }
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            MultipartFile multipartFile = new MockMultipartFile("copy" + file.getName(), file.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
            InputStream inputStream = multipartFile.getInputStream();
            //将文件的所有数据处理成了List> list
            List> list = HandleFile.parseExcel(inputStream, multipartFile.getOriginalFilename());
            inputStream.close();
            for (int i = 0; i < list.size(); i++) {
                List lo = list.get(i);
                System.out.println(lo);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    } 

注意:file是我们要解析的文件的路径

然后我们就得到了文件的内容了 

3.改造一下LogService.upLogLoad方法,实现文件上传+文件解析
 
    public ResultVo upLogLoad(MultipartFile file) throws Exception {
        if (file == null || file.isEmpty()) {
            return ResultVo.error(1, "未选择需上传的日志文件");
        }
        //获取绝对路径
        String filePath = new File("src/main/java/com/example/springboot4/file").getAbsolutePath();
        //获取上传时文件名
        String fileName = file.getOriginalFilename();
        //判断文件类型,这里我们只要xls文件
        if (fileName != null && !fileName.endsWith(".xls"))
            return ResultVo.error(1, "请选择“xls”文件");
        //获取文件上传名称
        File fileUpload = new File(filePath, fileName);
        if (fileUpload.exists()) {
            return ResultVo.error(1, "上传的日志文件已存在");
        }


//改造start
        InputStream inputStream = file.getInputStream();
        List> list = HandleFile.parseExcel(inputStream, file.getOriginalFilename());
        inputStream.close();
        for (int i = 0; i < list.size(); i++) {
            List lo = list.get(i);
            //可以将数据遍历出来后,存储到数据库中
            System.out.println(lo);
        }
//改造end


        //上传文件
        try {
            file.transferTo(fileUpload);
            return ResultVo.success();
        } catch (IOException e) {
            return ResultVo.error(1, "上传日志文件到服务器失败" + e.toString());
        }


    } 

4.最后启动服务,再上传一次文件

结果就大功告成。
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号