Java 上传excel文件 并导出excel文档数据

第一次弄文件导入导出转换的功能,结束之后拿出来分享一下,期间在网上找了很多,(这是实在想吐槽一下,一些博文写的导入导出还要指定一个文件路径来弄,还写死,这不是搞笑嘛。纯属吐槽那个写死路径的功能,实际项目开发中真的有这样的功能需求吗)。
公司要求弄个excel 转txt,word,pdf等文件的操作,其中还有很多细节需求,什么列间距,格式七七八八的需求 哭了。 这里先写下基础操作 后续再更新excel转其他文件类型操作 。

上传文件

   @RequestMapping("/uploadExExcel")
    @ResponseBody
    public ResponseData uploadExExcel(@RequestPart("file") MultipartFile file, HttpServletRequest request) {
        String name = file.getOriginalFilename();
        request.getSession().setAttribute("upFile", name);
        
        //这里是获取服务器存在文件的路径  
        //这里是我自己封装了一个方法来调用 就没展示出来了
        String fileSavePath = ConstantsContext.getFileUploadPath();

        File folder = new File(fileSavePath);
        if (!folder.exists()) {
            folder.mkdirs();
        }

        try {
            file.transferTo(new File(fileSavePath + name));
        } catch (Exception e) {
            throw new ServiceException(BizExceptionEnum.UPLOAD_ERROR);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("fileId", IdWorker.getIdStr());

        return ResponseData.success(0, "上传成功", map);
    }

这里是我的处理是 ,上传完成文件之后继续调用导出数据接口 所以参数是request,和response

导出数据

 /**
     * 导出文件数据
     *
     * @param request
     * @param response
     */
    @ResponseBody
    @RequestMapping("wordExport")
    public void wordExport(HttpServletRequest request, HttpServletResponse response) {

        //获取已上传文件的全称
        String fileName = (String) request.getSession().getAttribute("upFile");

        String wordname = StringUtils.substring(fileName, 0, fileName.lastIndexOf("."));

        //获取系统设置的上传文件路径
        String fileSavePath = ConstantsContext.getFileUploadPath();
        File file2 = new File(fileSavePath + fileName);
        //h获取excel内容
        List<List<String>> pdfItemList = TxtExportUtil.readExcel(file2, fileName);

        WordExportUtil.createFile(response, wordname, pdfItemList);
    }
 
这里的 WordExportUtil.createFile() 方法就是把从excel获取到的内容放入word中 这个方法后续开放出来这里就先不贴出来了

重点来了

TxtExportUtil.readExcel(file2, fileName);
方法是关键 ,读取excel 数据
不管你是excel转什么文件 ,转之前都是需要获取excel文件内容,所以可以封装出来一个方法便于其他方法调用


  /**
     * 读取excel文件的内容,返回行级内容集合
     * @param excelFile
     * @param fileName
     * @return
     */
    public static List<List<String>> readExcel(File excelFile,String fileName) {

        Workbook workbook=null;
        FileInputStream fis =null;
        List<List<String>> resultList=new ArrayList();
        String cellValue=null;

        //判断excel表格文件类型
        try {
            fis=new FileInputStream(excelFile);
           if (fileName.toLowerCase().endsWith("xlsx")){
               workbook = new XSSFWorkbook(fis);
           }else if (fileName.toLowerCase().endsWith("xls")){
               workbook = new HSSFWorkbook(new POIFSFileSystem(fis));
           }else{

           }

           //获取excel文件中的sheet表格数量
            //文件多表解析
            int numberOfSheets = workbook.getNumberOfSheets();
            //遍历单元格
            for (int i = 0; i < numberOfSheets; i++){
                Sheet sheet = workbook.getSheetAt(0);
                //getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况
                //从表头开始
                for (int j=0;j<sheet.getPhysicalNumberOfRows();j++){
                    //获取每行
                    Row row = sheet.getRow(j);
                    //非空行
                    if(row !=null ){
                        List list=new ArrayList();
                        //获取每行的单元格
                        for (int k=0;k < row.getLastCellNum();k++){
                            Cell cell=row.getCell(k);
                            if (cell == null){
                                list.add("");
                                continue;
                            }
                            switch (cell.getCellType()){
                                case STRING:
                                    cell.setCellType(STRING);
                                    list.add(cell.getStringCellValue());
                                    break;
                                case NUMERIC: 
                                	 // 数字类型 小数,整数,日期
                                    // 如果是数字类型的话,判断是不是日期类型
                                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                        Date d = cell.getDateCellValue();
                                        SimpleDateFormat formatter = new SimpleDateFormat("yyyy'/'MM'/'dd");
                                        cellValue = formatter.format(d);
                                        list.add(cellValue);
                                    } else if(cell.getCellStyle().getDataFormat() == 31) {
                                        Date d = cell.getDateCellValue();
                                        SimpleDateFormat formatter = new SimpleDateFormat("yyyy'/'MM'/'dd");
                                        cellValue = formatter.format(d);
                                        list.add(cellValue);
                                    } else {
                                        DecimalFormat df = new DecimalFormat("0");
                                        cellValue = df.format(cell.getNumericCellValue());
                                        list.add(cellValue);
                                    }
                                    break;
                                case BOOLEAN:
                                    list.add(String.valueOf(cell.getBooleanCellValue()));
                                    break;
                                case FORMULA:
                                    list.add(cell.getCellFormula());
                                    break;
                                 default:
                                        break;
                            }
                        }
                        resultList.add(j,list);
                    }
                }
            }
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return resultList;
        }
    }

到这里一个简单的文件上传,读取excel文件内容的功能就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值