Problem Solving Through Python

|  파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부



안녕하세요?


지난 강의에서는 엑셀 문서/시트/셀에 접근하여 읽는 방법을 살펴보았습니다.


이번 강의에서는 문서/시트/셀을 쓰는 방법을 다뤄보겠습니다 ^^




1. 엑셀 문서의 저장


import openpyxl
wb = openpyxl.load_workbook('filename.xlsx')
sheet = wb.get_active_sheet()
wb.save('filename_1.xlsx')


.save() 메서드에 파일명을 전달하면 파일을 저장할 수 있습니다.


너무 당연한 것이지만 workbook 객체를 조작한 내용이 일괄적으로 반영되어 파일에 저장됩니다.


참고로 엑셀에서 해당 파일이 열려있다면, openpyxl에서 파일을 열거나 닫을 때 에러가 발생할 수 있으니 주의하세요!


엑셀을 다루는 다른 파이썬 모듈에서도 유사한 문제가 발생합니다.




2. 시트의 추가 및 삭제


import openpyxl
wb = openpyxl.Workbook()
wb.create_sheet(index=0, title='Sheet No. 1')


.create_sheet() 메서드에서 index와 title 키워드는 생략 가능합니다.


title을 지정하지 않는 경우에는 sheet + 번호의 형식으로 자동으로 지정됩니다.


만약 sheet 명을 알고 싶은 경우에는 .get_sheet_names() 메서드를 사용하면 현재 문서의 모든 시트의 이름을 리스트로 반환합니다.


한편 생성된 시트를 삭제하려면 .remove_sheet() 메서드를 사용하면 됩니다.




3. 셀에 값을 지정하기 (값 입력 또는 변경)


import openpyxl
wb = openpyxl.Workbook()
sheet = wb.get_sheet_by_name('sheet')
sheet['A1'] = 'SFU'


마치 딕셔너리의 키에 값을 지정하는 것과 유사한 방법으로 간단하게 셀에 값을 입력할 수 있습니다!


한편 행렬이 길어지면 알파벳을 사용하기 번거롭기 때문에, sheet.cell(row=10, column=20).value = 135 이런 방식으로 사용할 수도 있습니다.




이상으로 엑셀 문서/시트/셀에 쓰는 방법을 살펴보았습니다.


다음 강좌에서는 보기 좋은 문서를 작성하기 위해 셀의 스타일을 설정하는 방법에 대해 다뤄보겠습니다 ^^


  • profile
    라엘 2020.02.02 08:46
    이니스프리 선생님 매우 유익한 강좌였습니다!
    질문이 있는데요, 요즘 개인정보를 포함한 문서는 암호화를 해야하는데요, 비밀번호 암호로 저장하려면 어떻게 하면 되나요?
  • profile
    이니스프리 2020.02.02 10:37

    답이 없는 문제라서 라엘 님께서 말씀하신 것으로 생각되네요 ^^

    제가 아는 한에서는 파이썬 엑셀 모듈 중에서 workbook 자체에 암호를 걸 수 있는 모듈은 없는 것 같네요.

    아래 문서를 보시면 OpenPyXL 제작자가 직접 OpenPyXL에는 해당 기능이 없다고 언급했네요 ㄷㄷ

    https://stackoverflow.com/a/36132572


    우회적인 방법이지만 (1) 엑셀 프로그램을 실행시켜 직접 외부에서 조작하는 다른 모듈을 사용하거나

    (2) 파이썬에서 VBS를 실행시키거나

    (3) ZIP 파일로 다시 압축할 때 암호를 거는 방법밖에 없을 것 같네요.


    참고로 (2)에 대해서는 https://stackoverflow.com/a/56127152 에 설명되어 있습니다.


    그럼 라엘 사마께서도 즐거운 주말 되세요!

  • profile
    라엘 2020.02.02 11:01

    선생님! 빠른답변 감사합니다.

    그러면.. 필드에서 암호화를 요구하는데.. 법까지 강제되는거라서 무시할수는 없을것같고, 구현하는 방법이 없을까요?

    (2)번의 경우 윈도우에 엑셀을 설치한 환경에서만 동작이 가능할 것 같아요. 리눅스 서버에서 사용할 수 있는 방법 없을까요..?

  • profile
    이니스프리 2020.02.02 13:49

    굳이 방법을 찾으신다면 OpenPyXL 특정 버전에서만 가능하다는 댓글도 있네요~

    https://stackoverflow.com/questions/53128388/openpyxl-password-protect-entire-excel-file-xlsx


    그리고 Jython으로 처리하셨다는 분도 계시는데 제가 여기까지는 잘 모르겠네요 ㅎㄷㄷ

    https://stackoverflow.com/questions/39509741/python-or-libreoffice-save-xlsx-file-encrypted-with-password


    파이썬에서는 어렵고, C++이나 Node.js의 패키지를 이용하라는 설명도 있네요 ^^

    https://stackoverflow.com/questions/50245208/add-a-password-unattended-to-existing-xlsx-without-windows-exclusive-tools


    결론적으로 순수하게 파이썬만 이용하여 간단히 해결하는 방법으로 도움드리지 못하여 죄송합니다~


    +) 실무적으로는 암호화가 어려운 파일의 경우에 ZIP 파일로 압축해서 보관하고 ZIP 파일 자체에 패스워드를 걸어놓지 않던가요??

  • profile
    라엘 2020.02.03 01:18
    다양한 방법이 있군요! 많은 도움이 되었습니다!
    실무에서 zip 암호화로 처리하는 사례를 많이 보긴했지만, 이런건 폭탄돌리기라고 봐요. 면피용이죠. 폭탄은 결국 문서작업자에게서 터질겁니다. (암호화 되지 않은 원본파일이 거기에 생길 것이므로)
  • profile
    맛스타 2020.02.03 22:36
    본격적인 셀 내용추가와 워크시크 조작 방법에 대한 내용이 추가 된다면 PHP를 가지고 MySQL에 데이터베이스를 쌓는 것처럼 데이터베이스화 시킬 수 있겠네요.

    개인적으로는 워크시트를 다룰 수 있는 "엑셀과 비슷한" 프로그램은 많지만 MS엑셀을 완벽하게 대체할 프로그램은 없다고 생각합니다.
    유익한 강좌 감사합니다!
  • profile
    이니스프리 2020.02.03 22:53

    '셀 내용추가'가 정확히 어떤 기능을 말씀하신 것인지 모르겠지만 3번 내용으로 셀에 값을 쓸 수 있습니다.

    (3번으로 값을 쓰고 1번으로 파일을 저장하면, 그대로 엑셀 파일이 생성됩니다.)

    워크시트 조작이 sort나 filter 같은 것을 말씀하신다면, 이건 이 라이브러리로는 해결이 안 되고 파이썬으로 직접 리스트를 조작하셔야 되어요 ㅠㅠ

    폰트나 셀 크기를 조작하는 것이라면 세번째 강좌에서 소개드릴 예정입니다~ ^^


    로터스123을 사용 안 해봐서 모르겠지만, 엑셀을 대체할 프로그램이 없다는 말씀에 공감합니다.

    VBA만 놓고보더라도 엑셀의 기능은 너무 강력해서요 ㅎㄷㄷ

    아마도 이런 수준의 다른 스프레드시트 프로그램이 앞으로도 출시되지는 못할 것 같네요.

    그럼 편안한 밤 되세요!!

  • profile
    맛스타 2020.02.04 01:58
    셀 내용 추가가 셀 값 지정 맞습니다. (왜 저 부분을 다르게 이해하고 넘어갔을까요? ㅋㅋ)

    셀 값지정에 수정, 추가가 가능한 표현이라고 해석하면 되겠네요.

    마소 엑셀은 함수도 다른 프로그램보다 더 많고 세세한것 같아서 매크로 기능과 더불어 많이 피부에 와닿는 부분인것 같습니다.
    돈을 아껴보겠다고 오피스 대신에 다른 무료 프로그램들을 사용하다, 결국 오피스 365 구독으로 사용하게 되네요. 돈값 한다는 생각이 듭니다.
    한컴 오피스 한셀은 흠.. 예전 회사에 다닐 때 회사에서 돈을 내고 사용했지만 으음... 그 이후의 기억 때문에 다시는 사용하지 않게 되었어요.
  • profile
    이니스프리 2020.02.04 13:13
    다시 보니 제가 조금 애매하게 표현하기는 했네요 ^^
    보다 이해하기 쉽도록 표현을 수정하였습니다.

    MS 오피스는 MS사 내부에서 직접 업무용으로 사용하는 프로그램이기 때문에 업무에 최적화되는 방향으로 계속 개량되고 있습니다.
    저는 과연 한컴에서 한셀을 사용할지 의문이네요 ㅎㅎ
    그럼 좋은 오후 되세요 :)
  • profile
    라엘 2020.02.04 10:44

    알려진 엑셀 라이브러리 중에 암호화 저장 기능을 지원하는건 없는 것으로 알고 있어요.

    이건 파일 포맷을 알아야 이해할 수 있는데, 기존의 xls 는 ms-excel 자체포맷이라 다루기 어려우므로 넘어가고,

    새로운 엑셀 표준 포맷인 xlsx 는 open document 와 호환되는 오픈 포맷인데, 암호화 저장의 경우 zip 표준 암호화를 사용해요.

    즉, 엑셀파일 암호화 저장은 xlsx writer + zip + crypto 가 있어야하는데, 이걸 단일 라이브러리에서 지원하게 하려면 엄청 많은 코드를 넣어야해요.

    따라서 라이브러리 개발자들은 그냥 암호저장 미지원으로 남겨두는걸로 보여요.

  • profile
    이니스프리 2020.02.04 11:29
    xlsx writer + zip + crypto 조합이라서 라이브러리가 너무 방대해지기 때문에 차마 넣지 않은 것이군요 ㄷㄷ
    제 경험상 엑셀에서 HTML 형식으로 저장을 하면 엑셀 이외의 프로그램으로 열 때 호환성의 문제가 있더군요.
    xlsx 파일의 확장자를 zip 파일로 변경해서 열어보니 엑셀 파일의 형식이 정말 zip 이군요!!
    구글링해보니 이런 방식을 역이용하여 브루트 포스를 사용하지 않고 엑셀의 패스워드를 깨는 방법들이 설명되어 있네요 ㅎㄷㄷ
    라엘 사마 덕분에 많이 배웠습니다~!
    월초라 바쁘실텐데 알려주셔서 감사합니다 ^-^
  • profile
    이니스프리 2020.02.04 14:04
    라엘 님께서 이미 문제를 해결하신 것으로 생각되지만 C++로 패스워드를 걸어서 저장하는 간단한 소스가 있네요 ^^
    https://www.easyxls.com/manual/tutorials/cpp/encrypt-excel-file.html
    EasyXLS.h 라이브러리 사용했네요!

    +) 혹시 개발자가 아닌 일반인의 입장에서 C++을 공부할 필요성이 있을까요?? 퍼포먼스를 요하지 않으면 크게 의미가 없겠죠??
  • profile
    라엘 2020.02.04 16:15

    EasyXLS.h 을 사용하려면 EasyXLS 모듈을 구매해서 서버에 설치해야하네요.

    일반인이라면 자신이 잘하는 주력언어 한두가지만 하면 된다고 봅니다.

    이니스프리님은 파이썬과 아미나, 크롤링과 파싱을 잘하시니까 이것 위주로만 하시면 될 것 같아요.


    굳이 배우시려면 비쥬얼스튜디오 커뮤니티를 다운받으신 후 https://visualstudio.microsoft.com/ko/ 다음 강좌를 실습해보세요. https://dojang.io/course/view.php?id=2   너무 쉬울 수도 있습니다.

    어느 Excel 라이브러리와 찾으신 코드 중 하나를 섞어서 짜보았어요. https://lael.be/excel-download-demo/

  • profile
    이니스프리 2020.02.04 18:51

    오오~ 데모 사이트에 들어가서 다운받아보니 정말 패스워드가 똭~ 걸려있네요! ^-^

    역시 라엘 사마이십니다~!

    그나저나 EasyXLS 모듈이 유료인가 보군요~! ㅎㄷㄷ


    터보C를 고등학교에서 배우긴 했는데 끝까지 배우기 전에 자퇴를 했고, 이미 시간이 많이 지나서 거의 잊어버렸네요 ㅜㅜ

    자퇴한 후에도 파일입출력까지는 혼자 독학했던 것으로 기억나는데, 지금은 Hello, world! 정도 하겠네요 ㄷㄷ

    사실 파이썬과 PHP도 아직 수박겉핥기 수준밖에 모르죠 ㅠㅠ


    라엘 말씀을 듣고보니 차라리 프론트엔드나 모바일 쪽으로 공부를 해야될 것 같네요.

    파이썬만 해서는 그런 방면으로는 해결이 어려울테니깐요.

    모바일 쪽으로 테트리스처럼 중독성 있는 게임을 제작할 아이디어가 있어서요 :)

    시간날 때 말씀해주신 코딩도장 C언어도 공부해볼게요~


    번번이 조언해주셔서 항상 감사드립니다!! ^^


Problem Solving Through Python

파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

List of Articles
번호 제목 글쓴이 날짜 조회 수
» 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 file 이니스프리 2020.02.02 238
21 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 2 file 이니스프리 2020.02.01 107
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 2 file 이니스프리 2020.01.16 176
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 file 이니스프리 2020.01.12 151
18 [Requests] Selenium을 이용한 Cloudflare의 우회 3 file 이니스프리 2020.01.08 191
17 9. 파이썬 문법 팁 정리 file 이니스프리 2020.01.04 149
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 file 이니스프리 2019.12.25 249
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 file 이니스프리 2019.12.12 160
14 6. 리스트와 관련된 기본함수 및 메서드 7 file 이니스프리 2019.12.10 198
13 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 file 이니스프리 2019.12.09 755
12 [Selenium] Requests의 session을 Selenium으로 보내기 file 이니스프리 2019.12.07 254
11 1. 반복문 (1) - while 문 5 file 이니스프리 2019.12.06 137
10 (序) Python 강좌를 시작하며... 2 file 이니스프리 2019.12.05 107
9 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 file 이니스프리 2019.08.04 607
8 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 file 이니스프리 2019.07.17 179
7 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 1 file 이니스프리 2019.07.16 427
6 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 2019.07.04 336
5 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 file 이니스프리 2018.12.15 453
4 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 file 이니스프리 2018.12.10 427
3 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 2018.12.07 737
목록
Board Pagination Prev 1 ... 2 Next
/ 2
서버에 요청 중입니다. 잠시만 기다려 주십시오...