Invalid header signature when read any xls file

こ雲淡風輕ζ 提交于 2020-06-29 03:40:36

问题


When I try to read xls file using the code below, I always get error: org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x65572D2D2D2D2D2D, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document.

This is my code:

public Result<List<IDto>> ReadExcelClassInfo2003(File file,
            Timestamp createTime, Timestamp updateTime, BigDecimal createBy,
            BigDecimal updateBy) {

        Result<List<IDto>> resultData = new Result<List<IDto>>();
        Integer numInsertSuccess = 0;

        if (file == null) {
            resultData.setErrorCode(ErrorCode.ERROR_FORMAT);
            return resultData;
        }
        try {

            InputStream is = new FileInputStream(file);
            POIFSFileSystem fs = new POIFSFileSystem(is);
            Integer classType = ClassTypeEnum.CLASSROOM.getValue();
            Integer maxCol = ExcelConstant.MAX_COLUMN_CLASSROOM_INFO;

            workbook = new HSSFWorkbook(fs);
            HSSFSheet sheetClassInfo = workbook
                    .getSheetAt(0);

            if (sheetClassInfo == null) {
                resultData.setErrorCode(ErrorCode.ERROR_FORMAT);
                return resultData;
            }

            //Some code to get data from excel file here.


            is.close();
            workbook.close();
        } catch (FileNotFoundException e) {
            resultData.setErrorCode(ErrorCode.ERROR_FORMAT);
            return resultData;
        } catch (IOException e) {
            resultData.setErrorCode(ErrorCode.ERROR_FORMAT);
            return resultData;
        } catch (Exception e) {
            resultData.setErrorCode(ErrorCode.ERROR_FORMAT);
            return resultData;
        }

        if (numInsertSuccess == 0) {
            resultData.setErrorCode(ErrorCode.CLASS_DATA_INVALID);
            return resultData;
        }

        resultData.setErrorCode(ErrorCode.IMPORT_SUCCESS);
        resultData.setMessage(numInsertSuccess.toString());

        return resultData;
    }

My controller code :

@POST
    @Path("class/import")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    @RolesAllowed(Role.TRAINING_ADMIN)
//  public Response importClass(@FormParam("file") File file) {
    public Response importClass(@Multipart("file") File file) {
        LOGGER.info("Received PUT import class: file=" + file.length());
        if (checkTokenAndRole(new int[] {1, 11}).getStatus() != Response.Status.OK.getStatusCode()) {           
            return LoginError(checkToken().getStatus());                
        } else {
            String token = request.getHeader(HttpHeaders.AUTHORIZATION);
            String fileExtension = request.getHeader("FileExtension");
            return ClassService.getInstance().importClass(file, fileExtension,
                    token);
        }
    }

And the method are call by controller :

public Response importClass(File file, String fileExtension, String token) {
        Result<List<IDto>> result = new Result<List<IDto>>();
        try {

            ErrorDTO errorDto = new ErrorDTO();
            String data = "";

            double bytes = file.length();
            double kilobytes = (bytes / 1024);
            double megabytes = (kilobytes / 1024);
            if (megabytes > ExcelConstant.MAX_FILE_SIZE) {
                errorDto.setErrorCode(ErrorCode.ERROR_FORMAT);
                data = Utility.toJSONString(errorDto);

                return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                        .entity(data).build();
            }

            Timestamp createTime = new Timestamp(System.currentTimeMillis());
            Timestamp updateTime = new Timestamp(System.currentTimeMillis());
            BigDecimal createBy = null;
            BigDecimal updateBy = null;

            Result<UserInfoDTO> userInfo = DaoManager.getUserInfoDao()
                    .getUserInfoByToken(token);
            if (userInfo.getData() != null) {
                createBy = userInfo.getData().getId();
                updateBy = userInfo.getData().getId();
            }

            result = DaoManager.getClassDao().importClass(file, fileExtension,
                    createTime, updateTime, createBy, updateBy);

            int errorCode = result.getErrorCode();
            String message = result.getMessage();


            errorDto = new ErrorDTO();
            errorDto.setErrorCode(errorCode);
            errorDto.setMessage(message);
            data = Utility.toJSONString(errorDto);

            // release memory
            userInfo = null;
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                    .entity(data).build();

        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage());
            result.setStatus(Constant.INTERNAL_SERVER_ERROR);
            result.setErrorCode(ErrorCode.IMPORT_ERROR);

            return super.responseData(result);
        }

    }
public Result<List<IDto>> importClass(File file, String fileExtension,
            Timestamp createTime, Timestamp updateTime, BigDecimal createBy,
            BigDecimal updateBy) throws IOException {

        return ExportExcelService.getInstance().ReadExcelClassInfo2003(file,
                fileExtension, createTime, updateTime, createBy, updateBy);
    }

I debuged and found the process always check new POIFSFileSystem and throw exception with error above. I tested with all xls file I have and have same error. Any can help me resolve this problem, and what the header 0x65572D2D2D2D2D2D ?

Thanks.

来源:https://stackoverflow.com/questions/61604995/invalid-header-signature-when-read-any-xls-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!