자바 에서 POI 를 이용 하여 Excel 파일 을 우아 하 게 내 보 냅 니 다.

5569 단어 자바poiexcel
머리말
이 야 기 는 이렇게 시작 되 었 다.회 사 는 며칠 동안 공사 기한 을 배정 하여 2 개의 기능 모듈 의 개발 을 완성 하 게 했다.그 중 한 장면 은 엑셀 에서 데 이 터 를 가 져 와 데이터 가 중복 되 지 않도록 요구 하 는 장면 이다.사용 자 는 가 져 오 는 데 실패 한 Excel 파일 을 다운로드 할 수 있 습 니 다.
이렇게 해서 두 가지 가 이 루어 집 니 다.
  • 실패 한 데 이 터 를 데이터베이스 에 저장 하고 다운로드 가 필요 할 때 Excel 다운 로드 를 생 성하 면 됩 니 다
  • 실패 한 데 이 터 를 엑셀 파일 저장 파일 서버 로 만 든 다음 다운로드 링크 로 되 돌려 줍 니 다.
  • 첫째 는 방안 2 에 따라 진행 할 것 을 요구 했다.좋 습 니 다.엑셀 을 내 보 내 는 것 은 더 이상 흔히 볼 수 없 는 기능 입 니 다.그러나 예전 에 쓴 것 이 우아 하지 않다 고 생각 하여 간단 한 장면 에 적응 하 는 엑셀 내 보 내기 로 결 정 했 습 니 다.
    이루어지다
    Excel 에서 내 보 낸 데이터 원본 은 일반적으로 데이터베이스 에서 조회 한 데이터 입 니 다.자바 개발 이라는 대상 을 대상 으로 하 는 디자인 에서 데 이 터 는 일반적으로 대상 을 캐리어 로 하여 집합 에 채 워 진다.그래서 입 삼 중 하 나 는 Collection 집합 류 로 디자인 되 었 습 니 다.
    내 보 낸 Excel 은 일반적으로 표 두 가 각 열 데이터 의 의 미 를 설명 해 야 하 며,주석+반사 로 정의 할 계획 입 니 다.Excel 은 HttpServletResponse 를 통 해서 든 File 을 통 해서 든 본질 적 으로 IO 흐름 조작 이다.
    구체 적 인 실현 은 다음 과 같다.
    pom.xml
    
      <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>4.1.2</version>
      </dependency>
    주해 정의
    이 주 해 는 필드 에 추가 되 어 어떤 필드 를 엑셀 로 내 보 내야 하 는 지 표시 하고 헤더 설명 을 추가 합 니 다.
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface ExcelHeader {
    
     /**
      *   
      * @return
      */
     String value() default "";
    
     /**
      *    
      * @return
      */
     int columnIndex() default 0;
    }
    실체 류
    다음 실체 클래스 에서 설명 에 따라 알 수 있 듯 이 age 필드 는 Excel 로 내 보 낼 필요 가 없습니다.
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
    
     @ExcelHeader(value = "  ")
     private String username;
    
     @ExcelHeader(value = "  ")
     private String password;
    
     @ExcelHeader(value = "  ")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime birthday;
    
     //          , Excel   
     private Integer age;
    
     public User(String username, String password, LocalDateTime birthday) {
      this.username = username;
      this.password = password;
      this.birthday = birthday;
     }
    }
    유닛 테스트
    주석 은 이미 충분히 명확 하 므 로,여 기 는 더 이상 복창 하지 않 는 다.
    
    @Slf4j
    class IdcPoiApplicationTests {
    
     @Test
     void contextLoads() throws NoSuchFieldException, IllegalAccessException, IOException {
      //       
      User user1 = new User("admin", "123456", LocalDateTime.now());
      User user2 = new User("test", "123456", LocalDateTime.now());
      List<User> users = Arrays.asList(user1, user2);
    
      //     
      String basePath = "/Users/cuishiying/Documents/spring-cloud-learning/idc-poi/oss/";
      String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls";
    
      //  Excel    
      HSSFWorkbook workbook = exportExcel(users, User.class);
      workbook.setSheetName(0,"sheetName");//  sheet Name
    
      //      HttpServletResponse           ,    IO  ,     IO       。
      workbook.write(new File(basePath + File.separator + fileName));
     }
    
     /**
      *
      * @param data        
      * @param clz         
      * @param <T>   
      * @return Excel  
      * @throws NoSuchFieldException
      * @throws IllegalAccessException
      */
     public <T> HSSFWorkbook exportExcel(List<T> data, Class<T> clz) throws NoSuchFieldException, IllegalAccessException {
    
      Field[] fields = clz.getDeclaredFields();
      List<String> headers = new LinkedList<>();
      List<String> variables = new LinkedList<>();
    
      //        
      HSSFWorkbook workbook=new HSSFWorkbook();//       sheet Name
      //        
      HSSFSheet sheet = workbook.createSheet();
      //     
      Row rowHeader = sheet.createRow(0);
    
      //     
      for (int h = 0; h < fields.length; h++) {
       Field field = fields[h];
       if (field.isAnnotationPresent(ExcelHeader.class)) {
        //   
        ExcelHeader annotation = field.getAnnotation(ExcelHeader.class);
        headers.add(annotation.value());
        rowHeader.createCell(h).setCellValue(annotation.value());
    
        //   
        variables.add(field.getName());
       }
      }
    
      //     
      for (int i = 0; i < data.size() ; i++) {
    
       //       (    1 ,         )
       HSSFRow row = sheet.createRow(i + 1);
       //       
       T t = data.get(i);
       Class<?> aClass = t.getClass();
       //      
       for (int j = 0; j < variables.size(); j++) {
    
        Field declaredField = aClass.getDeclaredField(variables.get(j));
        declaredField.setAccessible(true);
    
        String key = declaredField.getName();
        Object value = declaredField.get(t);
    
        row.createCell(j).setCellValue(value.toString());
       }
      }
      log.info("Excel      ");
      return workbook;
     }
    }
    총결산
    위의 사례 는 기본 적 인 디자인 방향 만 표현 할 뿐 엄밀 하지 않다.여러분 의 프로젝트 에서 사용 하신 다 면 고려 해 주 십시오.
    자바 에서 POI 를 이용 하여 우아 하 게 엑셀 파일 을 내 보 내 는 글 을 소개 합 니 다.더 많은 자바 가 POI 로 엑셀 파일 을 내 보 내 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기