Advertisement
ronaldkwandy

Untitled

Apr 14th, 2020
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.48 KB | None | 0 0
  1. package id.co.sofcograha.gajiidapi.base.utils;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.Map;
  11.  
  12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  13. import org.apache.poi.poifs.filesystem.FileMagic;
  14. import org.apache.poi.ss.usermodel.Cell;
  15. import org.apache.poi.ss.usermodel.CellStyle;
  16. import org.apache.poi.ss.usermodel.DataFormatter;
  17. import org.apache.poi.ss.usermodel.FormulaEvaluator;
  18. import org.apache.poi.ss.usermodel.Row;
  19. import org.apache.poi.ss.usermodel.Sheet;
  20. import org.apache.poi.ss.usermodel.Workbook;
  21. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.stereotype.Component;
  25. import org.springframework.web.context.annotation.RequestScope;
  26. import org.springframework.web.multipart.MultipartFile;
  27.  
  28. import id.co.sofcograha.gajiidapi.base.constants.BaseConstants;
  29. import id.co.sofcograha.gajiidapi.base.exceptions.BusinessException;
  30. import id.co.sofcograha.gajiidapi.base.extendables.FreeFormService;
  31.  
  32. @Component
  33. @RequestScope
  34. public class ExcelUtil extends FreeFormService {
  35.  
  36.     private Workbook workbook;
  37.     private FormulaEvaluator formulaEvaluator;
  38.     private HashMap<String, Integer> uploadedHeaderMap;
  39.     private DataFormatter dataFormatter;
  40.     private final Logger logger = LoggerFactory.getLogger(this.getClass());
  41.    
  42.     public void init(String sheetName) {
  43.         this.workbook = new XSSFWorkbook();
  44.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); // get value instead of formula
  45.         this.dataFormatter = new DataFormatter();
  46.        
  47.         if (StringUtil.isBlank(sheetName)) {
  48.             createNewSheet("Sheet 1");
  49.         } else {
  50.             createNewSheet(sheetName);
  51.         }
  52.     }
  53.    
  54.     public void init(MultipartFile file) {
  55.         this.workbook = getWorkBookFromFile(file);
  56.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); // get value instead of formula
  57.         this.dataFormatter = new DataFormatter(); // help converting all type to string
  58.     }
  59.  
  60.     public void init(MultipartFile file, List<String> headers) {
  61.         this.workbook = getWorkBookFromFile(file);
  62.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); // get value instead of formula
  63.         this.dataFormatter = new DataFormatter(); // help converting all type to string
  64.         validateUploadSheet();
  65.         validateHeader(headers);
  66.     }
  67.    
  68.     public void init(byte[] file) {
  69.         this.workbook = getWorkBookFromByte(file);
  70.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  71.         this.dataFormatter = new DataFormatter();
  72.         populateHeaderMap();
  73.         validateUploadSheet();
  74.     }
  75.  
  76.     public void init(byte[] file, Boolean validate) {
  77.         this.workbook = getWorkBookFromByte(file);
  78.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  79.         this.dataFormatter = new DataFormatter();
  80.         populateHeaderMap();
  81.         if (validate == true) {
  82.             validateUploadSheet();         
  83.         }
  84.     }
  85.    
  86.     public void init(byte[] file, int row, Boolean validate) {
  87.         this.workbook = getWorkBookFromByte(file);
  88.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  89.         this.dataFormatter = new DataFormatter();
  90.         populateHeaderMap(row);
  91.         if (validate == true) {
  92.             validateUploadSheet();         
  93.         }
  94.     }
  95.  
  96.     public void init(byte[] file, List<String> headers) {
  97.         this.workbook = getWorkBookFromByte(file);
  98.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  99.         this.dataFormatter = new DataFormatter();
  100.         validateUploadSheet();
  101.         validateHeader(headers);
  102.     }
  103.  
  104.     public void init(File file, List<String> headers) {
  105.         this.workbook = getWorkBookFromFile(file);
  106.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  107.         this.dataFormatter = new DataFormatter();
  108.         validateUploadSheet();
  109.         validateHeader(headers);
  110.     }
  111.  
  112.     public void init(String fileName, FileInputStream fileInputStream, List<String> headers) {
  113.         this.workbook = this.getWorkBookFromStream(fileName, fileInputStream);
  114.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  115.         this.dataFormatter = new DataFormatter();
  116.         validateUploadSheet();
  117.         validateHeader(headers);
  118.     }
  119.  
  120.     public void init(String fileName, FileInputStream fileInputStream, List<String> headers, Boolean isHeaderChange) {
  121.         this.workbook = this.getWorkBookFromStream(fileName, fileInputStream);
  122.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  123.         this.dataFormatter = new DataFormatter();
  124.         validateUploadSheet();
  125.         validateHeader(headers, isHeaderChange);
  126.     }
  127.  
  128.     public void init(String fileName, FileInputStream fileInputStream) {
  129.         this.workbook = this.getWorkBookFromStream(fileName, fileInputStream);
  130.         this.formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
  131.         this.dataFormatter = new DataFormatter();
  132.         validateUploadSheet();
  133.     }
  134.  
  135.     private void validateUploadSheet() {
  136.         if (!getUploadSheet().getSheetName().equals("Upload"))
  137.             error("upload.sheet.not.found");
  138.     }
  139.  
  140.     private void validateHeader(List<String> headers) {
  141.         validateEmptyHeader();
  142.         validateInvalidHeader(headers);
  143.     }
  144.  
  145.     private void validateHeader(List<String> headers, Boolean isHeaderChange) {
  146.         validateEmptyHeader();
  147.         validateInvalidHeader(headers, isHeaderChange);
  148.     }
  149.  
  150.     private void validateInvalidHeader(List<String> headers) {
  151.         populateHeaderMap();
  152.         for (String header : headers) {
  153.             if (this.uploadedHeaderMap.get(header) == null)
  154.                 error("upload.header.invalid");
  155.         }
  156.     }
  157.  
  158.     private void validateInvalidHeader(List<String> headers, Boolean isHeaderChange) {
  159.         populateHeaderMap();
  160.         if (isHeaderChange == true) {
  161.             for (String header : headers) {
  162.                 if (this.uploadedHeaderMap.get(header) == null)
  163.                     error("upload.header.invalid");
  164.             }
  165.         } else {
  166.             for (Map.Entry<String, Integer> entry : this.uploadedHeaderMap.entrySet()) {
  167.                 String header = entry.getKey();
  168.                 int idx = entry.getValue();
  169.                 if (!header.equals(headers.get(idx)))
  170.                     error("upload.header.invalid");
  171.             }
  172.         }
  173.     }
  174.  
  175.     private void validateEmptyHeader() {
  176.         if (!getUploadSheet().iterator().hasNext())
  177.             error("upload.header.invalid");
  178.     }
  179.  
  180.     private HashMap<String, Integer> populateHeaderMap() {
  181.         this.uploadedHeaderMap = new HashMap<>();
  182.         Row headerRow = getHeaderRow();
  183.         int headerCellStart = headerRow.getFirstCellNum();
  184.         int headerCellEnd = headerRow.getLastCellNum();
  185.  
  186.         for (int i = headerCellStart; i < headerCellEnd; i++) {
  187.             Cell headerCell = headerRow.getCell(i);
  188.             formulaEvaluator.evaluate(headerCell);
  189.             uploadedHeaderMap.put(dataFormatter.formatCellValue(headerCell), headerCell.getColumnIndex());
  190.         }
  191.         return uploadedHeaderMap;
  192.     }
  193.    
  194.     private HashMap<String, Integer> populateHeaderMap(int row) {
  195.         this.uploadedHeaderMap = new HashMap<>();
  196.         Row headerRow = getHeaderRow(row);
  197.         int headerCellStart = headerRow.getFirstCellNum();
  198.         int headerCellEnd = headerRow.getLastCellNum();
  199.  
  200.         for (int i = headerCellStart; i < headerCellEnd; i++) {
  201.             Cell headerCell = headerRow.getCell(i);
  202.             formulaEvaluator.evaluate(headerCell);
  203.             uploadedHeaderMap.put(dataFormatter.formatCellValue(headerCell), headerCell.getColumnIndex());
  204.         }
  205.         return uploadedHeaderMap;
  206.     }
  207.  
  208.     public Sheet createNewSheet(String sheetName) {
  209.         return this.workbook.createSheet(sheetName);
  210.     }
  211.  
  212.     public Row createNewRow() {
  213.         return getUploadSheet().createRow(getUploadSheet().getLastRowNum() + 1);
  214.     }
  215.  
  216.     public Row createNewRow(int sheetIndex) {
  217.         return this.workbook.getSheetAt(sheetIndex).createRow(this.workbook.getSheetAt(sheetIndex).getLastRowNum() + 1);
  218.     }
  219.  
  220.     public Workbook getWorkbook() {
  221.         return workbook;
  222.     }
  223.  
  224.     public Sheet getUploadSheet() {
  225.         return this.workbook.getSheetAt(0);
  226.     }
  227.  
  228.     public Sheet getSheet(int index) {
  229.         return this.workbook.getSheetAt(index);
  230.     }
  231.  
  232.     public Sheet getSheet(String sheetName) {
  233.         return this.workbook.getSheet(sheetName);
  234.     }
  235.    
  236.     public void setSheetName(int index, String sheetName) {
  237.         this.workbook.setSheetName(index, sheetName);
  238.     }
  239.  
  240.     public void removeSheet(int index) {
  241.         this.workbook.removeSheetAt(index);
  242.     }
  243.  
  244.     private Row getHeaderRow() {
  245.         return getUploadSheet().getRow(0);
  246.     }
  247.    
  248.     private Row getHeaderRow(int row) {
  249.         return getUploadSheet().getRow(row);
  250.     }
  251.  
  252.     public Iterator<Row> getDataIterator() {
  253.         Iterator<Row> rowIterator = getUploadSheet().rowIterator();
  254.         rowIterator.next();
  255.         return rowIterator;
  256.     }
  257.    
  258.     public Iterator<Row> getDataIterator(int row) {
  259.         Iterator<Row> rowIterator = getUploadSheet().rowIterator();
  260.         for (int i = 0; i < row; i++) {
  261.             rowIterator.next();
  262.         }
  263.         return rowIterator;
  264.     }
  265.  
  266.     public Cell createCell(Row row, String headerName) {
  267.         valColumnNotFound(headerName);
  268.         return row.createCell(uploadedHeaderMap.get(headerName));
  269.     }
  270.  
  271.     public String getCellStringValue(Row row, String headerName) {
  272.         valColumnNotFound(headerName);
  273.         String value = null;
  274.         if (isColumnHeaderFound(headerName)) { // continue, even if column not found
  275.             value = getValue(row, headerName);
  276.             valNotEmptyableData(headerName, value);
  277.         }
  278.         return value;
  279.     }
  280.  
  281.     public String getCellStringValueFromNumberCell(Row row, String headerName) {
  282.         valColumnNotFound(headerName);
  283.         String value = null;
  284.         if (isColumnHeaderFound(headerName)) { // continue, even if column not found
  285.             Cell dataCell = row.getCell(uploadedHeaderMap.get(headerName));
  286.             if (dataCell != null) {
  287.                 short format = this.workbook.createDataFormat().getFormat("0");
  288.                 CellStyle style = this.workbook.createCellStyle();
  289.                 style.setDataFormat(format);
  290.                 dataCell.setCellStyle(style);
  291.                 value = getValue(row, headerName);
  292.                 valNotEmptyableData(headerName, value);
  293.             }
  294.         }
  295.         return value;
  296.     }
  297.  
  298.     public String getCellStringValueFromDateCell(Row row, String headerName) {
  299.         valColumnNotFound(headerName);
  300.         String value = null;
  301.         if (isColumnHeaderFound(headerName)) { // continue, even if column not found
  302.             Cell dataCell = row.getCell(uploadedHeaderMap.get(headerName));
  303.             if (dataCell != null) {
  304.                 short format = this.workbook.createDataFormat().getFormat("dd/mm/yyyy");
  305.                 CellStyle style = this.workbook.createCellStyle();
  306.                 style.setDataFormat(format);
  307.                 dataCell.setCellStyle(style);
  308.                 value = getValue(row, headerName);
  309.                 valNotEmptyableData(headerName, value);
  310.             }
  311.         }
  312.         return value;
  313.     }
  314.  
  315.     private String getValue(Row row, String headerName) {
  316.         Cell dataCell = row.getCell(uploadedHeaderMap.get(headerName));
  317.         return dataFormatter.formatCellValue(dataCell, formulaEvaluator);
  318.     }
  319.  
  320.     private void valColumnNotFound(String headerName) {
  321.         if (!isColumnHeaderFound(headerName)) {
  322.             error("upload.column.not.found", headerName);
  323.         }
  324.     }
  325.  
  326.     private boolean isColumnHeaderFound(String headerName) {
  327.         return uploadedHeaderMap.containsKey(headerName);
  328.     }
  329.  
  330.     private void valNotEmptyableData(String headerName, String value) {
  331.         if (!isEmptyable(headerName) && StringUtil.isBlank(value)) {
  332.             batchError("upload.data.empty", headerName);
  333.         }
  334.     }
  335.  
  336.     private boolean isEmptyable(String headerName) {
  337.         return !headerName.contains(BaseConstants.REQUIRED_SYMBOL_FOR_EXCEL_TEMPLATE);
  338.     }
  339.  
  340.     private Workbook getWorkBookFromByte(byte[] file) {
  341.         Workbook xWorkbook = null;
  342.         try {
  343.             if (FileMagic.valueOf(file).equals(FileMagic.OOXML)) {
  344.                 xWorkbook = new XSSFWorkbook(new ByteArrayInputStream(file));
  345.             } else {
  346.                 xWorkbook = new HSSFWorkbook(new ByteArrayInputStream(file));
  347.             }
  348.         } catch (IOException e) {
  349.             logger.debug(BaseConstants.TRACE, e);
  350.             throw new BusinessException("file.excel.unknown");
  351.         }
  352.  
  353.         return xWorkbook;
  354.     }
  355.  
  356.     private Workbook getWorkBookFromFile(File file) {
  357.         Workbook xWorkbook = null;
  358.         try {
  359.             if (file.getName().endsWith("xlsx")) {
  360.                 xWorkbook = new XSSFWorkbook(file);
  361.             } else {
  362.                 xWorkbook = new HSSFWorkbook(new FileInputStream(file));
  363.             }
  364.         } catch (Exception e) {
  365.             logger.debug(BaseConstants.TRACE, e);
  366.             throw new BusinessException("file.excel.unknown");
  367.         }
  368.  
  369.         return xWorkbook;
  370.     }
  371.  
  372.     private Workbook getWorkBookFromStream(String fileName, FileInputStream fileInputStream) {
  373.         Workbook xWorkbook = null;
  374.         try {
  375.             if (fileName.endsWith("xlsx")) {
  376.                 xWorkbook = new XSSFWorkbook(fileInputStream);
  377.             } else {
  378.                 xWorkbook = new HSSFWorkbook(fileInputStream);
  379.             }
  380.  
  381.         } catch (Exception e) {
  382.             logger.debug(BaseConstants.TRACE, e);
  383.             throw new BusinessException("file.excel.unknown");
  384.         }
  385.  
  386.         return xWorkbook;
  387.     }
  388.  
  389.     private Workbook getWorkBookFromFile(MultipartFile file) {
  390.         Workbook xWorkbook = null;
  391.         try {
  392.             if (file.getOriginalFilename().endsWith("xlsx")) {
  393.                 xWorkbook = new XSSFWorkbook(new ByteArrayInputStream(file.getBytes()));
  394.             } else {
  395.                 xWorkbook = new HSSFWorkbook(new ByteArrayInputStream(file.getBytes()));
  396.             }
  397.         } catch (IOException e) {
  398.             logger.debug(BaseConstants.TRACE, e);
  399.             throw new BusinessException("file.excel.unknown");
  400.         } catch (NullPointerException e) {
  401.             logger.debug(BaseConstants.TRACE, e);
  402.             throw new BusinessException("file.upload.not.found");
  403.         }
  404.  
  405.         return xWorkbook;
  406.     }
  407.  
  408.     public Row getRow(int rowIndex) {
  409.         return this.getUploadSheet().getRow(rowIndex);
  410.     }
  411.  
  412.     public Cell getCell(int rowIndex, int cellIndex) {
  413.         Sheet uploadSheet = this.getUploadSheet();
  414.         Row row = uploadSheet.getRow(rowIndex);
  415.         if (row == null) {
  416.             row = uploadSheet.createRow(rowIndex);
  417.         }
  418.         Cell cell = row.getCell(cellIndex);
  419.         if (cell == null) {
  420.             cell = row.createCell(cellIndex);
  421.         }
  422.         return cell;
  423.     }
  424. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement