자바 에서 POI 를 이용 하여 Excel 파일 을 우아 하 게 내 보 냅 니 다.
이 야 기 는 이렇게 시작 되 었 다.회 사 는 며칠 동안 공사 기한 을 배정 하여 2 개의 기능 모듈 의 개발 을 완성 하 게 했다.그 중 한 장면 은 엑셀 에서 데 이 터 를 가 져 와 데이터 가 중복 되 지 않도록 요구 하 는 장면 이다.사용 자 는 가 져 오 는 데 실패 한 Excel 파일 을 다운로드 할 수 있 습 니 다.
이렇게 해서 두 가지 가 이 루어 집 니 다.
이루어지다
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 로 엑셀 파일 을 내 보 내 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.