반응형
최근 작업을 하다 엑셀로 많은 데이터를 날짜별로 중복된 항목들 중 가장 큰 값을 가진 것과 그 외 것을 분류할 필요가 생겼다. 그래서 엑셀 파일을 읽고 그 데이터를 날짜별로 모아 정렬해서 따로 출력하도록 만들어보았다.
아래 내용은 그러한 내용들을 정리해본 내용이다.
1. 엑셀 파일 읽어오기
엑셀 파일을 읽어오기 위해서 Poi 라이브러리가 필요하다. 엑셀 라이브러리이다. 아래 링크에서 다운로드 받을 수 있다.
https://archive.apache.org/dist/poi/release/src/
Index of /dist/poi/release/src
archive.apache.org
2. Poi 라이브러리 사용 예시
엑셀 선언
XSSFWorkbook workbook = new XSSFWorkbook(); // xlsx 엑셀 처리 가능
HSSFWorkbook workbook = new HSSFWorkbook(); // xls 엑셀 처리 가능
시트 생성
XSSFSheet sheet = wrokbook.createSheet("시트명") // 시트 생성
시트 가져오기
XSSFSheet sheet = wrokbook.getSheetAt(0); // 엑셀에 첫 시트를 가져온다
시트 row를 가져오기
for(int i=0;i<=sheet.getLastRowNum();i++) {
Row row = sheet.getRow(i);
}
시트 데이터를 매핑하기
String filename = row.getCell(0).getStringCellValue(); // 문자열
int count = (int) row.getCell(2).getNumericCellValue(); // 숫자
3. 코드
package com.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class excelDataPrint {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// 엑셀 파일을 읽어온다
String excelPath = "C:/tmp/data_list.xlsx";
FileInputStream fis = new FileInputStream(excelPath);
XSSFWorkbook workbook = new XSSFWorkbook(fis);
// 첫번째 시트를 가져온다
XSSFSheet sheet = workbook.getSheetAt(0);
// 엑셀 데이터를 저장할 Map
Map<String, List<Map<String, Object>>> excelDataMap = new HashMap<>();
for(int i=0;i<=sheet.getLastRowNum();i++) {
Row row = sheet.getRow(i);
if(row != null) { // 파일명, 날짜, 갯수를 매핑한다
String filename = row.getCell(0).getStringCellValue();
String date = row.getCell(1).getStringCellValue();
int count = (int) row.getCell(2).getNumericCellValue();
excelDataMap.putIfAbsent(date, new ArrayList<>());
Map<String, Object> map = new HashMap<>();
map.put("filename", filename);
map.put("count", count);
excelDataMap.get(date).add(map);
}
}
System.out.println("날짜별 최댓값 출력");
// 처리 결과를 화면에 찍기
// 최댓값만 화면에 출력하기
for(String date : excelDataMap.keySet()) {
List<Map<String, Object>> list = excelDataMap.get(date);
//내림차순 정렬
Collections.sort(list, new Comparator<Object>() {
public int compare(Object s1, Object s2) {
return (Integer) ((Map<String, Integer>)s1).get("count") - (Integer) ((Map<String, Integer>)s2).get("count");
}
});
int size = list.size() - 1;
System.out.println(list.get(size).get("filename") + "|" + list.get(size).get("count"));
}
System.out.println("--------------------------------------");
System.out.println("날짜별 최댓값을 제외한 나머지 모두 출력");
// 최댓값을 제외한 나머지만 화면에 출력하기
for(String date : excelDataMap.keySet()) {
List<Map<String, Object>> list = excelDataMap.get(date);
//내림차순 정렬
Collections.sort(list, new Comparator<Object>() {
public int compare(Object s1, Object s2) {
return (Integer) ((Map<String, Integer>)s1).get("count") - (Integer) ((Map<String, Integer>)s2).get("count");
}
});
//최댓값 삭제
list.remove(list.size() -1);
for(int j=0;j<list.size();j++) {
System.out.println(list.get(j).get("filename") + "|" + list.get(j).get("count"));
}
}
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
4. 실행 결과
실행 전 엑셀 데이터는 아래와 같습니다.
실행 후 결과는 아래와 같습니다.
2025/02/05와 2025/02/06 날짜로 나누어 파일명과 건수를 비교 후 출력했습니다.
반응형
'지식창고 > Java' 카테고리의 다른 글
[자바] Package should contain a content type part [M1.13] 오류 해결 방법 (1) | 2025.02.05 |
---|---|
이클립스 개발환경 그래들(Gradle) 플러그인 설치 방법 (0) | 2024.12.02 |
전자정부프레임워크 3.8 버전 설치 방법 (1) | 2024.12.01 |
[SVN] commit 시 is out of date 오류 해결방법 (0) | 2022.10.08 |
[JAVA] Error: Could not find or load main class 에러 조치 방법 (0) | 2021.10.21 |