C#에서 '입력 문자열의 형식이 잘못되었습니다' 오류가 발생하는 경우는 보통 숫자 형태로 타입이 설정된 객체에 숫자가 아닌 문자를 입력하려고 시도할 때에 발생합니다. 반대의 경우는 자료의 묵시적 형변환이 이루어지기 때문에 오류가 발생하는 경우가 없을 거예요.
입력 문자열의 형식이 잘못되었습니다.
예를 들어, 문자열을 숫자 형식으로 변환하려고 할 때 변환할 수 없는 형식일 경우에 이런 오류가 발생할 수 있습니다. "1"과 같은 문자열은 숫자 1로 변환이 가능할 것이나, "1-"와 같은 문자열은 숫자로 변환이 불가능하기 때문이지요.
주어진 상황에서는?
fpSpread.ActiveSheet에서 셀 타입 설정 문제일 가능성?
쿼리에서 발생하는 데이터 변환 문제?
CellType 확인
파포인트 스프레드에서 해당 오류가 발생하였는데요, 셀 타입을 지정하지 않거나, 텍스트로 계속 해보았는데도, 동일한 현상이 계속 발생하더라고요.
fpSpread.ActiveSheet.DataAutoCellTypes 속성을 false로 설정했더라도 내부적으로 특정 셀에 데이터 형식이 적용되고 있을 수 있습니다. 이 경우, 직접 셀의 데이터 형식을 텍스트로 설정하는 것이 필요할 수 있어서 점검해 보기로 하였어요.
그러나, 데이터 타입도 확인해 보고, 셀 타입도 확인해 보고, 혹시 추가적인 설정을 하나 싶어서 속성도 수정해 보았는데, 현상이 지속되는 것을 확인하였습니다.
fpSpread.ActiveSheet.DataAutoCellTypes = false;
fpSpread.ActiveSheet.DataAutoHeadings = false;
fpSpread.ActiveSheet.DataAutoSizeColumns = false;
각 셀 타입의 데이터 형식을 명시적으로 텍스트로 지정하는 코드를 추가해보았으나 실패.
이와 같이 각 셀에 대해 명시적으로 텍스트 셀 타입을 지정하면, 숫자나 다른 데이터 형식으로 변환되지 않도록 하리라 기대하였는데, 실패하였어요.
fpSpread.ActiveSheet.Cells[rowIndex, columnIndex].CellType = new TextCellType();
쿼리 확인, 문자열로 형변환
쿼리를 조회하여 바로 소스를 바인딩 하니, 오류가 발생하지 않군요. 아마 스프레드시트 내부적으로 다시 변환하는 과정이 있나 봅니다.
쿼리 결과가 C#에서 처리될 때 문제가 발생하는 경우, 쿼리에서 데이터를 미리 처리하거나 변환하는 것이 그나마 현재 해결할 수 있는 방법으로 보이는데요! 😭 예를 들어, NULL 처리를 포함한 집계 함수 결과를 문자열로 변환하는 방법을 고려해 보세요.
해결 방법
SQL 쿼리에서 직접 NULL 처리를 해주고, 그 결과를 문자열로 변환하는 방식을 택하였습니다. TO_CHAR 로 해도 되는데, 쿼리가 많이 길고 간단히 처리하고 싶어서 NULL을 추가하였습니다.
셀의 데이터 타입을 조회해 보아도 텍스트로 잘 되어 있는데, 실행한 쿼리에 따라 다시 내부적으로 CellTypes 설정하는 부분이 있는듯, 임의 처리는 다음과 같이 진행합니다.
COLUMN 에서 집계 함수 부분에 NULL 을 덧붙여서 문자열로 인식이 가능하도록 수정
SELECT SUM(COLUMN) AS column_name FROM table_name
--다음과 같이 수정.
SELECT NULL || SUM(COLUMN) AS column_name FROM table_name
