본문 바로가기
Engine/Unreal

[UE5] 우당탕탕 데이터 테이블 파싱 플러그인 개발 - 2. 서드 파티 추가 및 xlsx 파일을 csv로 파싱하기

by devOat 2025. 4. 14.

 

 

[UE5] 우당탕탕 데이터 테이블 파싱 플러그인 개발 - 1. 플러그인 생성 + 스프레드 시트 CSV로 파싱

겜 개발하다가 데이터 테이블은 필요한데 구조체 노가다를 하기 싫어서그냥 파싱 툴을 만들기로 생각했다 (?) 사실 그게 더 노가다일수도 있는데기왕 만드는 거 잘 만들어서 앞으로도 개발할 때

dev-oat.tistory.com

 

저번에 테이블을 읽어들여서, CSV를 파싱해서 로그로 찍어보는 부분까지 작업을 끝냈는데 문제에 봉착했다

바로 스프레드 시트 여러장을 읽어들여올 방법이 없다는 것...

 

그래서 생각해 낸 대안책은 그러면 .xlsx 파일로 변환해서 읽어들이는 것이 더 범용성이 넓지 않을까! 생각했고

당연히 구린 c++은 c#처럼 내장 라이브러리 따위는 없어서 xlnt라는 서드파티를 사용하기로 했다.

 

 

오늘 작업한 목록은

 

1. xlnt 빌드 및 언리얼에 필요한 .h / .lib를 모듈로 추가

2. 추가한 서드파티를 이용해서 .xslx 파일 읽어들이기

3. 읽어들인 데이터를 기반으로 USTRUCT 생성

 

까지가 목표 ! 였지만 어쩌다보니 .xlsx -> csv 파싱 까지 완료하였다ㅜㅅㅜ 왜냐면 대삽질의 시간이었기 때문

그럼 또 오늘의 삽질일기 고고씽


1. xlnt 서드파티 언리얼에 모듈로 추가하기

 

GitHub - tfussell/xlnt: :bar_chart: Cross-platform user-friendly xlsx library for C++11+

:bar_chart: Cross-platform user-friendly xlsx library for C++11+ - tfussell/xlnt

github.com

 

얘가 서드파티 중 가장 대중적으로 많이 쓰이는데, CMake로 빌드 해야 해서 CMake를 설치하고 진짜 100만년만에 터미널을 사용했다...

아마 플러그인에는 빌드해서 생성한 헤더와 lib를 직접 전부 포함해서 배포할 것 같다. 사용자 편의를 위하여~~~

 

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/integrating-third-party-libraries-into-unreal-engine

참고한 문서 링크 첨부

 

그런데 암튼 시작부터 안 됨 ㅎ

이유는 서드파티가 사용할 수있는 CMake 보다 내가 사용하는 게 버전이 더 높아서 !

 

CMakeLists.txt 파일

 

그래서 CMake관련 설정을 하는 txt파일에 들어가서 가장 첫줄에 required를 최신으로 수정해주었다

근데 또 똑같은 에러 떠서 봤더니

 

 

 

ㅎㅎ xlnt 말고도 CMakeLists.txt가 무진장 많으니 전부 버전을 바꿔주세오 이거 수정해서 풀리퀘 보내볼까,,,ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

암튼 그렇게 설정을 바꿔주고 명령어를 다시 입력합니다

cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

 

첫번째 명령어는 CMake를 실행해서, 빌드 도구로는 Visual Studio 2022를 사용하고, 64비트용 Release 모드로 빌드를 설정하겠다는 뜻

두번째는 방금 생성한 프로젝트를 Release로 빌드해 ! (여기서 .lib생성됨) 라는 뜻이다

 

왜 알고 있냐면 뭔가 대학교 수업 때 썼던 프레임 워크 중에 하나가 CMake로 빌드해서 생성해야 하는 것이 있었는데, 그 때 CMake가 머지 하고 공부좀 했었는데 이렇게 써먹게 될 줄이야 ㅎㅎㅎ

 

(근데 사실 GUI로도 할 수 있는데 터미널이 깐지나지 않나요)

 

 

 

그럼 뭔가 주루루루루룩 생길거임 

필요한건 xlnt.lib 파일이랑 .hpp 파일들.. 얘네를 복붙해서 추가한 뒤,

 

 

이런식으로 폴더를 구성했다! 이제 해당 경로의 모듈을 사용할 수 있도록 .build.cs 파일을 수정해야 한다.

 

모듈 경로를 기반으로 하위 폴더 경로 세팅
lib는 따로 추가

조금 다른 점은 이번에는 cpp 뿐만 아니라 .lib도 로드할 수 있도록 PublicAdditionalLibraries 도 직접 추가!

 

짜잔~~ 드디어 xlnt를 사용해서 xlsx파일을 로드할 수 있게 되었다.

그리고 빌드를 해봤는데 역시나 안됨

 

그러나 폴더 구조가 달라져서 더이상 xlnt / targetFile 이 아닌 xlnt / include / target파일 의 구조이기 때문에,., 서드 파티의 include 경로가 안먹고,,.,. 어떻게 할까 고민하다가 그냥 빌드 오류가 생기는 부분을 내 프로젝트 구조에 맞춰서 하나씩 수정하기로 했다.

 

소스가 그렇게 많은 편도 아니었고 해당 서드 파티도 마지막 업데이트가 3년이기 때문에,,, 뭔가 xlnt를 유지 보수할 일이 생기지 생기지 않을 것 같아서!

마법의 단축키 ctrl shift h

 

ㄷㄷ 모두 바꾸기는 조금 무섭지만 이렇게 확실할 때는 한번에 바꿔주십쇼 그리고 어차피 문제생기면 폐기하면 되니까 쫄지말기!!!!!!

 

 

드뎌 컴파일이 돼서, 당연히 안심하고 로직 다 작성한 뒤에 언리얼에서 테스트 해보려고 alt F5 누르는 순간 ?

모듈에서 빌드가 안되는지 73%에서 자꾸 엔진이 뻗었음... 하 진짜 눈물이가 난다 

진심 나

 

 

근데 또 컴파일할 때는 로그에서 문제도 안 뜨고, 그래서 saved에 저장된 로그 확인해도 딱히 큰 에러가 있지는 않아서 

한 단계씩 점검해가면서 원인을 찾았다

 

잠깐 짚고 넘어가는 허니팁

{프로젝트명}\Saved\Logs -> 이 경로에는 에디터 관련 로그가 아주 상세히 나와있습죠 유용하게 사용하시길...

 

아무튼,,, 단계 별로 하나씩 문제를 확인해보았다

1. xlnt 포함 자체가 문제인가 ? => ㄴㄴ 실행 잘됨

2. xlnt include가 문제인가? => ㄴㄴ 실행 잘됨

3. 코드에서 사용하면 문제인가? => !!!!!!!!!!!!!!!!

잡았다 요놈

 

include에는 문제가 없으나 사용하는 순간 에디터 실행이 안됨...

그래서 해결 방법을 스택오버플로우와 gpt 공식문서 구글링 등등,,., 을 통해서 열심히 찾아보았는데

 

결국에는 언리얼은 STL을 랩핑해놓은 시스템들이 많아서,

너무 STL 친화적인 서드파티는 lib로는 충돌을 일으킬 수도 있고 암튼 문제가 생길 수 있어서 cpp를 그냥 통째로 넣어두는게 낫다고 하더라...

 

그래서 울면서 또 cpp를 복사해서 프로젝트에 통째로 추가해뒀는데 이번에는..

 

대충 xlnt가 크로스 플랫폼 가능해서 뭐 윈도우에서는 쓰고 리눅스에서느 ㄴ안쓰고 등등등,.,. 여러 #pragma 설정들이 있는데

 

- #if defined(__clang__) 도 해보고

- xml 읽는 서드파티 설정도 통째로 날려보고

- dll로도 다시 빌드해서 링크 추가해보고 별 짓을 다했지만

 

결구 ㄱ안돼서 xlnt 이 색기 갖다 버림; 아까운 내 시간 ㅠㅠㅜ 너만 아니었어도 오늘 구조체 자동 생성 만들었따

 

ㅂㅂ

 

 

 

 

GitHub - troldal/OpenXLSX: A C++ library for reading, writing, creating and modifying Microsoft Excel® (.xlsx) files.

A C++ library for reading, writing, creating and modifying Microsoft Excel® (.xlsx) files. - troldal/OpenXLSX

github.com

안녕 ? 대신 새로운 서드파티 OpenXLSX를 데려왔다,.,.

 

얘도 똑같이 CMake로 빌드를 한 뒤 lib파일만 build.cs에 넣어주면 됨! (과정은 생략하겠습니다)

그리고 xlnt로 쳤던 코드를 OpenXLSX로 대체해 준다..,

 

그래도 xlnt 덕분에 웬만한 헤더 참조 오류나 빌드 세팅 오류라던가 암튼 빨간줄 5만개 뜨면서 빌드 안돼!!!@!@!빼앸!@!@!@!@ 하는 것은 뚝딱 뚝딱 잡아내는 능력이 상승했다 .,..

 

그래서 무사히 잘 연결하고 코드를 빠르게 수정!

 

대충 이런 식으로 사용

 

어떻게 이렇게 빠르게 후다다닥 소스를 분석하냐구요? 음하하하 그것은 제 몇 안되는 능력임

 

근데 사실 막 프레임워크를 제대로 파악했다기보다는 야매로 구글링 + 대충 ctrl + F12로 우다다다 흝어보면서

당장 필요한 기능만 빠르게 사용하는데에 능한 편.,.

 

근데 xlnt말고 OpenXLSX 쓰세요 진짜 얘가 훨씬 편하고 깔끔함 그리고 얘는 최신 커밋 2일 전인 걸 보니

아직도 활발히 유지보수중인 라이브러리인듯요 편한거 잘 골라쓰는 것도 실력임을 깨닫게 됨;;;

 

최첨단 샤머니즘 코딩;;,.,. 제발 되길 간절히 기도

 

 

두근두근 이번엔 깔끔하게 실행될 것 인가?

 

실행도 잘되고!

 

예에ㅔㅔ에ㅔ 문제 없이 실행을 했습니다용

OpenXLSX 개발자님 존경합니다 한국에 들어오시면 귓 ㄱㄱ 밥사dream

 

현재 임시 데이터 테이블

 

로그

 

열,행이 전부 비어 있을 경우 데이터 무시처리까지 전부 잘 되고,
FieldType / FieldName 등 구분자도 잘 제외 되어서 예쁘게 가공되어 CSV로 파싱 완료이다 우하하하 

xlnt 때문에 제대로 실행 안됐을 때는 쬑꼼,.,. 어쩌다 이러고 있나 싶었는데 되니까 너무 뿌듯하다 ^~^

 

 

 

+ 에디터를 자꾸 껐다 켰다 하니까, 파일 경로가 날라가서 다시 쳐야하는게 귀찮아서 편하게 저장할 방법 없나 했는데

GConfig를 이용하면 편하게 저장할 수 있대서 후다닥 추가해서 

만약 DT를 Generate하는데 문제 없이 성공하면 해당 경로를 저장하게끔 기능을 추가했다!!

 

엄청 쉬워용 유용하게 사용 ㄱㄱ

GConfig->GetString(TEXT({섹션}),TEXT({키값}), {FString변수}, GEditorPerProjectIni);

// 저장된 값 읽어오기
FString FilePath;
GConfig->GetString(TEXT("/Script/DataTableAutoGenerator.Settings"),TEXT("FilePath"), FilePath, GEditorPerProjectIni);

// 저장하기
FString FilePath;
GConfig->SetString(TEXT("/Script/DataTableAutoGenerator.Settings"),TEXT("FilePath"),*FilePath,GEditorPerProjectIni);

 


 

.

 

 

1. 해당 기능을 사용할 수 있는 커스텀 UI 제작

2. 스프레드 시트 링크를 넣었을 때 알아서 테이블을 읽어와서 csv로 파싱하기

-> 서드파티를 활용하여 .xlsx To CSV로 대체

==================================================

3. csv를 기반으로 USTRUCT 자동 생성
4. 생성된 USTRUCT로 UDataTable 타입의 .uasset 자동 생성

==================================================

 

별거 안한 것 같지만 이제 CSV를 바탕으로 USTRUCT 생성 자동화만 해주면 되는데 ,.,

UUserDefinedStruct를 통해서 .uasset을 생성하는 것은 봤는데,

.h 파일을 만들어주는 건 본적이 없어서ㅠㅠ 아마 FFileHelper를 통해서 파일을 직접 생성하지 않을까 싶다 !!

 

아마 내일쯤,,,? 이면 최소 USTRUCT 자동화까지는 개발 끝나지 않을 지...

빠르면 기능을 완료할 수 있을지도,,,?

 

예제 샘플과 함께 스토어에 올리는 것은 우선 겜 좀 더 만들고,..,

ㅋㅋㅋ 겜 편하게 만들려다가 배가 산으로 가는 중이지만 뭔가 재밌어서 엄청 삽질하고 찾아보고 있는 중이다~~

 

 

 

오늘의 삽질 일기 끗~~

아 나도 건담타고 우주 전쟁 하고 싶다~~~~