Procházet zdrojové kódy

엑셀 서비스 추가

yujung před 4 roky
rodič
revize
fa19795d97

+ 149 - 0
src/main/java/com/style24/core/biz/service/TscExcelService.java

@@ -0,0 +1,149 @@
+package com.style24.core.biz.service;
+
+import com.gagaframework.web.parameter.GagaMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.NumberToTextConverter;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.FileInputStream;
+import java.text.FieldPosition;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * 엑셀 Service
+ *
+ * @author yujung
+ * @since 2021. 10. 13
+ */
+@Service
+@Slf4j
+public class TscExcelService {
+
+	/**
+	 * 엑셀
+	 * @author yujung
+	 * @since 2021. 10. 13
+	 */
+	public Collection<GagaMap> getExcelList(String excelFile, int headerPosition, String[] cellName, int sheetIndex) throws Exception {
+
+		Workbook wb = null;
+		String extension = getFileExtension(excelFile);
+		if (extension.equals("xls")) {
+			POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excelFile));
+			wb = new HSSFWorkbook(fs);
+		} else if (extension.equals("xlsx")) {
+			wb = new XSSFWorkbook(OPCPackage.open(new FileInputStream(excelFile)));
+		}
+
+		Sheet sheet = getSheetSplitMergedCell((Workbook)wb, sheetIndex);
+		int rows = sheet.getLastRowNum() + 1;
+		log.debug("rows: {}", rows);
+		if (rows == 0) {
+			throw new IllegalStateException("엑셀 파일에 데이터가 없습니다.");
+		} else {
+			Row row = sheet.getRow(headerPosition++);
+			int cells = row.getPhysicalNumberOfCells();
+			log.debug("cells: {}, cellName.length: {}", cells, cellName.length);
+			if (cells != cellName.length) {
+				throw new IllegalStateException("컬럼의 개수와 제목의 개수가 일치하지 않습니다.");
+			} else {
+				Collection<GagaMap> dataList = new ArrayList();
+
+				for(int r = headerPosition; r < rows; ++r) {
+					int comVal = 0;
+					GagaMap dataMap = new GagaMap();
+					row = sheet.getRow(r);
+					if (row != null) {
+						for(int idx = 0; idx < cells; ++idx) {
+							if (row.getCell(idx) != null && !StringUtils.isEmpty(row.getCell(idx).toString())) {
+								dataMap.put(cellName[idx], getCellDataByType(row.getCell(idx)));
+							} else {
+								++comVal;
+							}
+
+							if (comVal == cells) {
+								return dataList;
+							}
+						}
+
+						log.debug("dataMap: {}", dataMap.toString());
+						dataList.add(dataMap);
+					}
+				}
+
+				return dataList;
+			}
+		}
+	}
+
+	private static String getFileExtension(String fileName) {
+		int lastDot = fileName.lastIndexOf(46);
+		String extension = lastDot != -1 ? fileName.substring(lastDot + 1) : "";
+		return extension.toLowerCase();
+	}
+
+	private static Sheet getSheetSplitMergedCell(Workbook wb, int sheetIndex) {
+		Sheet sheet = wb.getSheetAt(sheetIndex);
+		Cell cValue = null;
+
+		for(int x = 0; x < sheet.getNumMergedRegions(); ++x) {
+			CellRangeAddress cra = sheet.getMergedRegion(x);
+			if (cra.getLastColumn() - cra.getFirstColumn() == 0 && cra.getLastRow() - cra.getFirstRow() > 0) {
+				cValue = sheet.getRow(cra.getFirstRow()).getCell(cra.getFirstColumn());
+				String value = null;
+				cValue.getCellTypeEnum();
+				if (!CellType.STRING.equals(CellType.STRING)) {
+					break;
+				}
+
+				value = sheet.getRow(cra.getFirstRow()).getCell(cra.getFirstColumn()).getStringCellValue();
+				int columnIndex = cra.getFirstColumn();
+
+				for(int i = cra.getFirstRow() + 1; i <= cra.getLastRow(); ++i) {
+					sheet.getRow(i).getCell(columnIndex).getCellTypeEnum();
+					if (CellType.BLANK.equals(CellType.BLANK)) {
+						sheet.getRow(i).getCell(columnIndex).setCellValue(value);
+					}
+				}
+			}
+		}
+
+		return sheet;
+	}
+
+	private static Object getCellDataByType(Cell cell) throws Exception {
+		Object value = null;
+		CellType cellType = cell.getCellTypeEnum();
+		if (cellType.equals(CellType.STRING)) {
+			value = cell.getStringCellValue().trim();
+		} else if (cellType.equals(CellType.FORMULA)) {
+			value = cell.getCellFormula();
+		} else if (cellType.equals(CellType.NUMERIC)) {
+			if (DateUtil.isCellDateFormatted(cell)) {
+				StringBuffer toAppendTo = new StringBuffer();
+				(new SimpleDateFormat("yyyyMMdd")).format(cell.getDateCellValue(), toAppendTo, new FieldPosition(0));
+				value = toAppendTo.toString();
+			} else {
+				value = NumberToTextConverter.toText(cell.getNumericCellValue());
+			}
+		} else if (cellType.equals(CellType.BOOLEAN)) {
+			value = cell.getBooleanCellValue();
+		} else if (cellType.equals(CellType.ERROR)) {
+			value = cell.getErrorCellValue();
+		} else if (cellType.equals(CellType.BLANK)) {
+			value = "";
+		}
+
+		return value;
+	}
+	
+}