Java

[엑셀업로드 오류 해결방법] org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Can’t read content types part

자바에서 엑셀업로드 후 처리하는 과정에 오류가 발생하였다.

로컬에서는 발생하지 않던 오류가 실서버에서는 발생되었다.

오류내용은 다음과 같다.

 

org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Can’t read content types part

 


엑셀업로드시 확장자가 xlsx파일을 업로드하면 오류가 발생하였다.

엑셀파일 확장자에 따라 분기하고 있음에도 오류가 발생하였다.

protected int getFileId(MultipartFile file, PathInfo savePath)
{
	int intResult = -1;
	Workbook book;
	
	File fileObj = null;
	String strXML;
	
	try
	{
		fileObj = new File(savePath.getSavePath());
	}
	catch(Exception ex)
	{
		log.info(ex.toString());
		log.info(ex.getMessage());
	}
	
	if(fileObj != null && fileObj.exists())
	{
		try(FileInputStream fis = new FileInputStream(fileObj);)
		{	
			log.info("Create book start");
			book = checkExcelExt(fis, savePath.originName);
			if(savePath.originName.toLowerCase().endsWith(".xls"))
			{
				book = new HSSFWorkbook(fis);
			}
			else if(savePath.originName.toLowerCase().endsWith(".xlsx"))
			{
				book = new XSSFWorkbook(fis);
			}
			log.info("Create book end");
			
			if(book != null)
			{
				strXML = getSheetXML(book.getSheetAt(0));
				log.info("get sheet end");			
				saveData(strXML);
				log.info("data save complete");
			}
			intResult = 0;
		}
		catch(Exception ex)
		{
			log.info(String.format(MSG_XL_UPLOAD_FAIL, ex.toString()));
			return intResult;
		}
		finally
		{
			try
			{
				Files.delete(Paths.get(savePath.getSavePath()));
			}
			catch(IOException e)
			{
				log.info(MSG_FILE_DELETE_FAIL);
			} 
		}
	}
	return intResult;
}

 

[오류해결 방법]

파일 저장시 엑셀 97-2003버전(확장자가 xls인 파일)으로 변경후 업로드 하면 정상적으로 처리되었다.

데이터 일괄업로드시 엑셀양식 다운로드 기능을 제공중임으로 xls 파일로 올려놨다.

 

 xls, xlsx모두 지원해야한다면 아래 로직처럼 해보자.

반대로 코드는 XSSFWorkbook를 사용하고 엑셀파일은 xls 확장자인 경우에도 동일한 오류가 발생할 수 있다.

XSSFWorkbook 은 xlsx 확장만 처리할 수 있다.

 

private Workbook getExeclWorkbook(FileInputStream inputStream, String excelFilePath)
        throws IOException {
    Workbook workbook = null;

    if (excelFilePath.endsWith("xlsx")) {
        workbook = new XSSFWorkbook(inputStream);
    } else if (excelFilePath.endsWith("xls")) {
        workbook = new HSSFWorkbook(inputStream);
    } else {
        throw new IllegalArgumentException("The specified file is not Excel file");
    }

    return workbook;
}

 

 

[REFERENCE]

 

 

Leave a Reply

error: Content is protected !!