티스토리 뷰

Office

[Excel] Python을 이용한 Excel Handling

생각많은 소심남 2015. 7. 27. 23:28

이전 포스트에서도 누차 말했었지만 Excel은 정말 강력한 도구다. 단순히 기록하고 값을 계산하는데 그치지 않고, 말그대로 Data Analysis를 할 수 있는 함수들이 포함되어 있다. 그래서 Excel을 가지고 전문적으로 연구하는 조직도 있다. 마침 얼마전에 edX에서도 이와 관련한 강의를 해서 간간히 들어봤다. 사실 이전에 소개한 몇가지 예제들도 그 강의에서 발췌한 내용 중 일부였다.

 

<Delft Univ. - Data Analysis: Take it to the MAX()*>

 

나도 새로 배우는 입장에서 가능한 대부분의 내용들을 소개하고 싶었고, 그럴만한 유용한 내용들이 강의속에 담겨있었는데 못했다.. 아무튼... 이 강의의 마지막에 다룬 내용이 Python을 이용해서 Excel을 다루는 내용이었는데, 지금 회사에서 하고 있는 내용과 약간 유사한 점이 있어서 소개해보고자 한다. 


 Excel은 강력하다. 물론 단순히 이것만 가지고도 강력하긴 하겠지만, 기타적으로 제공하는 add-on 프로그램들을 활용하면 그 강력함이 배가 된다. MS에서 Official하게 권장하는 내용은 바로 Office와 관련한 API를 사용해서 다양한 프로그램을 만들 수 있다는 것인데, 사실 이건 한계가 좀 있다. MS에서 밀고 있는게 .net 기반이다 보니 역시 개발도 VB나 Visual C#을 사용해야 쉽게 개발할 수 있다. 당연히 플랫폼에 제한적이니, 접근이 힘들고 그래서 대안으로 제시된게 python이다. 몇가지 라이브러리들이 있는데 제일 처음에 소개할 내용이 DataNitro라는 것이다.


<DataNitro**>


진짜 딱 Excel의 UI에 맞게 제공되고, 개인적으로 보기에는 이런 기능을 제공하는 라이브러리중에서 가장 속도가 빠른거 같다. 궁금한 사람은 한번 아래 동영상을 보면 이해가 쉬울 것이다.



막 리본 UI내에서 다양한 기능을 제공하고 심지어는 Excel 내에서 Python Terminal도 열수 있다. 아마 뭔가 python을 이용해서 Data를 수집하고 자동으로 정리하고 싶은 사람에게는 최고의 툴이 될것이다. 단, 개인이 한정해서 말이다. 이 툴은 상용화 툴이고, 회사에서 사용할 시에는 따로 License를 구입해야 한다. 나도 이번에 Test Automation과 관련한 간단한 프로그램을 만들고 있어서 이 걸 활용해볼까 싶었는데, License 때문에 대안을 찾아야 했다. 찾아보니까 몇가지 오픈소스 라이브러리가 있었다.


<XlsxWriter***>


 제일 처음 찾았던 라이브러리가 바로 XlsxWriter였다. 아마 내가 알기로는 개인이 만든 프로그램이고, 이 프로그램을 만든 소스가 Github에 올라가있다. License가 BSD로 되어있기 때문에 자유롭게 소스를 뜯어고칠 수도 있고, 상용화에 사용해도 된다. 얼핏보면 DataNitro에서 제공하는 기능 대부분을 이 라이브러리에서도 제공하고 있고, 예제도 다양하게 제시되어 있어서 잘 활용하면 좋겠다 싶었다. 그런데 가장 큰 문제가 있는데 바로 기존에 저장되어 있는 Excel 파일은 다룰 수 없다는 것이다. 물론 사용자가 추구하는 목적대로 사용하면 XlsxWriter 역시 편리한 툴이 될 수 있겠다. 

 그런데 내 경우는 조금 달랐다. 내가 만들고자 했던건 이런거다. 만약 어떤 실험을 하루에 한번 돌렸을때 그 결과를 차곡차곡 한 파일의 특정 sheet에 기록하고, 어떤 부분에 문제가 발생하는지에 대한 추이를 알고 싶었고, 이를 위해서 몇가지 Template sheet들을 만들었다. 그래서 하루가 지날때마다 새로운 날짜에 대한 sheet를 기존의 template에서 복사해와 결과를 기록하고 또 그 결과를 그래프로 출력하고 싶었다. 그런데 앞에서 언급한 문제처럼 존재하는 파일을 열수가 없으면 이렇게 만들어놓은 Template sheet을 활용할 수 없게 되는 것이다. 여기서 다른 툴이 없을까 또 찾아봤는데, 역시 누가 관련 라이브러리를 만들어놨다.


<openpyxl****>


 딱 내가 원하는 기능만 담아놓은 python library이다. 역시 License도 MIT License로 개방되어 있고, 앞에서 언급한 문제였던 기존 파일 활용도 된다. 더구나 sheet간 복사도 되기 때문에 앞에서처럼 template을 만들었을때 거기에 만들어놓은 macro들을 복사해서 그대로 활용할 수 있다. 물론 이 라이브러리가 완벽하지는 않고, 몇가지 문제점들이 있긴 하다. sheet간 복사가 되긴 하는데 완벽하게 되지 않는다. 가령 기존에 cell의 폭을 지정해놓은 template도 복사해놓고 보면 그 형태가 엉클어져 있다. 그렇다고 데이터가 날라가거나 그렇지는 않긴 하다. 또 python을 이용해서 cell에 값을 입력할 때 해당 입력cell이 포함된 column이 folding되는 현상이 나타난다. 역시 보여지는 문제일뿐 동작하는데 지장이 없다. 아 그리고 가장 큰 문제는... 느리다. 다른건 그냥 script 실행하면 바로바로 되는거 같은데, 이건 실행하면 손으로 셀만큼 기다려야 한다.(컴퓨터 입장에서 보면 정말 느린 처리...) 물론 python script를 조금더 깔끔하게 짜면 효율적으로 처리할 수 있기 때문에 지금은 다양하게 테스트해보면서 실행여부를 확인하고 있다. 아무튼 좋은 라이브러리인건 확실하다.


 지금까지 python을 이용해서 Excel을 다루는 몇가지 라이브러리에 대해서 알아보았다. C#이나 VB보다는 접근이 쉬운 python을 활용해서 이렇게 Data 처리를 할 수 있다면 이것보다 편리한 수단이 없을거다. 특히 결과 수집이나 정리를 자동화하고자 할때는 정말 필수적인 요소가 아닐까 싶다. 다만 각각의 라이브러리에 따라서 제한 사항이 있고, 제공하는 기능이 다르기 때문에 이를 고려해서 활용한다면 Excel이란 강력한 툴을 Data Analysis할때 쓸 수 있을거라고 본다. 물론 csv라는 대안이 있긴 하지만, 기왕이면 그래프도 이쁘게 나오는 엑셀을 쓰면 시각화 입장에서도 좋을거라 생각한다.


Data Analysis: Take it to the MAX() - https://www.edx.org/course/data-analysis-take-it-max-delftx-ex101x

   - 참고로 이 강의는 9월에 또 열릴 예정이다. 엑셀 강의를 Data Analysis 측면에서 공부하고 싶은 사람에게는 꼭 들어볼 것을 권한다.

** DataNitro - https://datanitro.com/

*** XlsxWriter - https://xlsxwriter.readthedocs.org/

**** openpyxl - https://openpyxl.readthedocs.org

댓글