springBoot 는 easypoi 를 사용 하여 Liux 서버 에서 엑셀 문 제 를 내 보 낼 수 없습니다.

3452 단어 #SpringBoot
사용 하 는 프레임
엑셀 도구 문서http://www.afterturn.cn/doc/easypoi.html
문서 에 따 르 면 windows 에서 엑셀 다운로드 기능 을 실현 한 것 도 정상 이다.
그러나 Liux 서버 에 놓 았 을 때 엑셀 모드 로 불 러 올 수 없습니다.
잘못된 소식 을 알리다.
2018-02-28 11:32:04,295 [http-nio-8000-exec-3] ERROR [cn.afterturn.easypoi.cache.ExcelCache] - java.lang.NullPointerException
com.google.common.util.concurrent.UncheckedExecutionException: java.lang.NullPointerException
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203)

excel 모드 경로
src--
------main
-------------------- resources
easypoi 의 엑셀 모드 파일 을 불 러 오 는 소스 코드
package cn.afterturn.easypoi.cache.manager;
FileLoaderImpl
try {
            //        ,       
            try {
                fileis = new FileInputStream(url);
            } catch (FileNotFoundException e) {
                //      
                fileis = ClassLoader.getSystemResourceAsStream(url);
                if (fileis == null) {
                    //          
                    String path = PoiPublicUtil.getWebRootPath(url);
                    fileis = new FileInputStream(path);
                }
            }

나중에 springBoot 의 파일 자원 로드 방식 이 다 를 수 있 음 을 알 게 되 었 습 니 다.
Spring - boot 마이크로 서비스 jar 패키지 방식 으로 시작 하여 jar 내 자원 파일 을 로 컬 디스크 로 가 져 옵 니 다.
http://blog.csdn.net/zhangjian15/article/details/73277796
실현 방안 을 바 꿨 어 요.
방법 을 썼 습 니 다: 먼저 찾 은 모델 을 디스크 에 쓰 고 경 로 를 easypoi 의 도구 류 에 전달 합 니 다.
변경 전 호출 방식
TemplateExportParams params = new TemplateExportParams("excelTemplate/myRepay.xls");

수정 후
TemplateExportParams params = new TemplateExportParams(convertTemplatePath("excelTemplate/myRepay.xls"));

도구 클래스
public static String convertTemplatePath(String path) {
        //    windows      
        // if (System.getProperties().getProperty("os.name").contains("Windows")) {
        // return path;
        // }

        Resource resource = new ClassPathResource(path);
        FileOutputStream fileOutputStream = null;
        //          tomcat    
        String folder = System.getProperty("catalina.home");
        File tempFile = new File(folder + File.separator + path);
        // System.out.println("    :" + tempFile.getPath());
        //           
        if (tempFile.exists()) {
            return tempFile.getPath();
        }
        File parentFile = tempFile.getParentFile();
        //           
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        try {
            BufferedInputStream bufferedInputStream = new BufferedInputStream(resource.getInputStream());
            fileOutputStream = new FileOutputStream(tempFile);
            byte[] buffer = new byte[10240];
            int len = 0;
            while ((len = bufferedInputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return tempFile.getPath();
    }

서둘러 야 하기 때문에 자세히 연구 하지 못 했다
잘못 쓴 부분 이 있 으 니 많은 지도 바 랍 니 다

좋은 웹페이지 즐겨찾기