오류가 발생한 엑셀 csv 파일의 열 찾기

1. 문제 해석

csv 파일을 불러와 vue에 모달창으로 사용해야 하는 업무가 있었습니다.

회사 관련 코드이기에 자세하게 알려줄 수 없으나, 코드는 다음과 같습니다.

 

upload.java

public class Controller {
    @PostMapping("/test")
    public SingleResponse<Object> upload(MultipartFile file) {
        try {
            csvService.saveCsv(file);
            return responseService.createResponse(true);
        } catch (Exception e) {
            return responseService.createResponse(e.toString())
        }
    }
}

 

CsvService.java

public void saveDataFromCSV(file) throw Exception {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), "euc-kr"))) {
        // 첫 번쨰 라인은 무시
        String line = reader.readLine();
        int metaTableSeq = 0;
        int count = 1;

        ArrayList<String> A = new ArrayList<>();
        ArrayList<String> B = new ArrayList<>();
        ArrayList<String> C = new ArrayList<>();

        try {
            while((line = reader.readLine()) != null) {
                try {
                    // csv 파일이기에 쉼표(,)로 구분해서 불러오기
                    HashMap<String, Object> aMap = new HashMap<String, Object>();
                    
                    aMap.put("a", values[column++]);
                    aMap.put("b", values[column++]);
                    aMap.put("c", values[column++]);
    
                    String aa = (String) aMap.get("a");
                    String bb = (String) aMap.get("b");
                    String cc = (String) aMap.get("c");
    
                    if (aa == null) {
                        throw new Exception();
                    } else {
                        A.add(aa);
                        B.add(bb);
                        C.add(cc);
                    }
    
                } catch (Exception e) {
                    log.error("{}", line, e.toString());
                    throw e;
                }
            }
            for (int i = 0; i < count; i++) {
                HashMap<String, Object> bMap = new HashMap<String, Object>();
                
                bMap.put("a", aa);
                bMap.put("b", bb);
                bMap.put("c", cc);

                abc.insert_set_list(bMap);
            }
        } catch (Exception e) {
            log.error("{}", line, e.toString());
            throw e;
        }
        
    }
}

 

여기서 저는 열의 값을 읽어오다가 오류가 발생하였을 때, 모달 창에 `${count}번 째 열에 오류가 발생했습니다.` 라는 느낌으로 제작하고 싶었어요.

 


2. 해결 시도

그래서 처음엔 java 코드에 alert를 넣어 알림창이 뜨게 끔 해보기로 했습니다.

response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();

out.println("<script language='javascript'>');
out.println("alert('알림창')");
out.println("</script>");

out.flush();

 

하지만 이 방법은 어째서 인지 반응을 하지 않았습니다..

JOptionPane나 Alert의 방법은 제가 원하는 방식과 거리가 멀기에 이 두가지는 시도하지 않았습니다.

 


3. 해결 방법

그래서 제가 생각한 방법은 count라는 변수를 vue 파일에서 사용할 수 있게끔 하는 것입니다!

처음에 변수를 불러오는 것이 쉽지 않았으나 드디어 방법을 찾았습니다.

 

#1. count를 오류 발생 시, throw new Exception()에 넣습니다.

count 변수는 int 자료형이기에 valueOf()를 사용해서 String 자료형으로 변환해 주었습니다.

이렇게 하면, 예외 처리로 count가 upload 파일로 넘어가게 됩니다.

throw new Exception(String.valueOf(count));

 

#2. 넘어간 e는 upload 메서드의 예외처리인 responseService.createSingleResponse(e.toString());에 담기게 됩니다.

이 것은 자세히 말 못하지만, response의 result로 넘어가게 됩니다.

 

#3. vue 파일에서 다음과 같이 입력하여 이를 불러와 줍니다.

try {
  await axios.post(`${...}/upload`, formData, {
    // ...
  })
    .then(response => {
      this.errorCol = response.data.result;
    })
  this.$alert(`${this.errorCol}번 째 행이 잘못 입력되었습니다.`}

하지만, result의 값이 java.language.Exception: 3으로 출력되어 java.language.Exception: 3번 째 행이 잘못 입력되었습니다. 라고 출력이 되네요..

 

그렇기에 저는 replace를 이용하여 replace(/\D/g, '')라고 입력해, 문제를 해결하였습니다.

이렇게 하면 문자열을 제외한 숫자만을 출력하게 됩니다.

 

그러면 정상적으로 3번 째 행이 잘못 입력되었습니다. 라고 나오게 됩니다!

 

이 문제만 해결하는데 3일 정도 걸린 것 같네요..

'Programming Language > Java' 카테고리의 다른 글

암호화 및 복호화 모듈 - 대칭 키 암호화  (0) 2024.09.03
try-with-resources  (0) 2024.08.02
BuffredReader - 엑셀 불러오기  (3) 2024.07.23
네트워크(Network)  (0) 2022.07.25
IO (Input / Output) (입출력) 스트림  (0) 2022.07.21