본문 바로가기

지식창고/Java

[자바] 엑셀 파일을 Map에 담아 화면에 출력하는 방법

반응형

 

최근 작업을 하다 엑셀로 많은 데이터를 날짜별로 중복된 항목들 중 가장 큰 값을 가진 것과 그 외 것을 분류할 필요가 생겼다. 그래서 엑셀 파일을 읽고 그 데이터를 날짜별로 모아 정렬해서 따로 출력하도록 만들어보았다.

 

아래 내용은 그러한 내용들을 정리해본 내용이다.

 

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 날짜로 나누어 파일명과 건수를 비교 후 출력했습니다.

 

반응형