안녕하세요

 

오늘은 엑셀에 있는 그림을 자동으로 저장하는 프로그램을 짜보도록 하겠습니다.

 

먼저 아래와 같은 그림이 있구요

 

 

 

그림을 저장시 구분하기 위하여 박지성.jpg, 이영표.jpg, ... 이런 식으로 저장을 해보겠습니다.

 

VBA에서는 그림을 바로 저장하지 못합니다.

 

그래서 꼼수를 쓰는게

 

맨 먼저 차트개체를 생성하고

 

그림을 카피를 한 다음에 차트개체에 붙여넣기를 합니다.

 

그리고 차트개체를 그림으로 저장하게 됩니다.

 

코딩 내용입니다.

 


차트개체를 생성합니다.

Dim Mychart As ChartObject

 

차트개체를 대략 10,10 위치에 20,20 크기로 만들어 놓습니다. 아무값이나 괜찮습니다.

Set Mychart = ActiveSheet.ChartObjects.Add(10, 10, 20, 20)

 

차트개체의 이름을 임의로 짓습니다. 'temp' 로 지었습니다.
Mychart.Name = "temp"

 

그리고 현재 시티의 모든 그림을 순환하면서

For Each Pic In ActiveSheet.Pictures

 

그림을 선택하고
  Pic.Select

 

그림의 가로,세로크기를 일단 저장합니다.(뒤에 이 값을 다시 쓸겁니다.)
  oldwidth = Pic.Width
  oldheight = Pic.Height

 

그림의 가로세로 크기를 원래대로 되돌립니다.

(엑셀에 보여지는 비율 및 크기로 저장 시 아래 문구를 삭제하셔야 합니다.)
  Selection.ShapeRange.LockAspectRatio = msoTrue
  Selection.ShapeRange.ScaleHeight 1, msoTrue, msoScaleFromTopLeft

 

그림의 클립보드에 카피하고요.
  Pic.Copy

 

그림을 저장 시 앞셀의 내용으로 저장하게 됩니다.

따라서 지금 그림이 위치한 셀의 위치는  Pic.TopLeftCell.Address 로 가져오고요.그 앞의 셀이므로 오프셋을 아래처럼 Offset([0], [-1])을 주면 앞 셀의 내용을 가져오게 됩니다.

  picname = Range(Pic.TopLeftCell.Address).Offset([0], [-1])

 

차트개체의 크기를 그림의 가로,세로 크기로 수정합니다.
  Mychart.Width = Pic.Width
  Mychart.Height = Pic.Height

 

여기까지 실행을 하시면

 

 

 

1에 보시는 것처럼 박지성의 사진이 원래 크기대로 돌아갔구요.

2에 보시는 것처럼 차트개체의 크기가 그림의 크기와 같아진 것을 볼 수 있습니다.

 

그리고 차트개체를 활성화 한 다음

  ActiveSheet.ChartObjects("temp").Activate

 

붙여넣기를 하면 차트개체에 사진이 표시되게 됩니다.
  ActiveChart.Paste

 

이 상태에서 차트개체를 저장하게 되면 사진이 저장되게 됩니다.
  ActiveChart.Export Filename:="e:\사진\" + picname + ".jpg", filtername:="jpg"

 

다시 사진은 원래 크기대로 되돌려야 됩니다.

사진을 다시 선택하고
  Pic.Select

 

사진의 가로,세로 크기를 다시 지정해줍니다.
  Selection.ShapeRange.LockAspectRatio = msoFalse
  Pic.Width = oldwidth
  Pic.Height = oldheight

Next

 

그림을 다 저장했으면 차트개체는 필요 없으므로 삭제해줍니다.

Mychart.Delete

 

실행 결과입니다.

 

 

 

그림이 잘 저장되었네요!!

 

엑셀파일도 같이 올려드립니다.

 

 

save.xlsm
0.02MB

 

궁금하신 사항이나 도움이 필요하시면 댓글 부탁드립니다.

 

감사합니다!!


Dim Mychart As ChartObject

Set Mychart = ActiveSheet.ChartObjects.Add(10, 10, 20, 20)
Mychart.Name = "temp"


For Each Pic In ActiveSheet.Pictures
    Pic.Select
    oldwidth = Pic.Width
    oldheight = Pic.Height
    Selection.ShapeRange.LockAspectRatio = msoTrue
    Selection.ShapeRange.ScaleHeight 1, msoTrue, msoScaleFromTopLeft
    Pic.Copy
    
    picname = Range(Pic.TopLeftCell.Address).Offset([0], [-1])
    Mychart.Width = Pic.Width
    Mychart.Height = Pic.Height
    ActiveSheet.ChartObjects("temp").Activate
    ActiveChart.Paste
    ActiveChart.Export Filename:="e:\\사진\\" + picname + ".jpg", filtername:="jpg"
    Pic.Select
    Selection.ShapeRange.LockAspectRatio = msoFalse
    Pic.Width = oldwidth
    Pic.Height = oldheight
    
Next
Mychart.Delete

 

안녕하세요

오늘은 엑셀에서 그림의 위치를 구해보고자 합니다.

 

그림의 위치를 구할 때에 그림이 위치한 셀 위치를 구하거나 절대위치를 구하는 두가지 방법이 있습니다.

 

1. 먼저 셀의 위치를 구하는 방법은 다음과 같습니다.

 

For Each Pic In ActiveSheet.Pictures

  Cells(1, 2) = Pic.TopLeftCell.Address

 

즉 그림 개체의 좌상단이 속해있는 셀의 위치를 가져오구요

 

그림에서 보시는 바와 같이  'C1' 위치를 가져옵니다.

 

  Cells(2, 2) = Pic.BottomRightCell.Address

 

그림 개체 우하단의 셀의 위치를 가져옵니다.

 

'F6' 이 되겠죠

 

추가적으로 그림이 위치한 셀영역을 선택하려고 하면 이렇게 하시면 됩니다.

Range(Pic.TopLeftCell.Address, Pic.BottomRightCell.Address).Select

2. 절대 위치를 구하는 방법은 다음과 같습니다.

 

For Each Pic In ActiveSheet.Pictures

  Cells(3, 2) = Pic.Top

즉 그림 개체의 상단의 절대위치를 가져오고요.

 

  Cells(4, 2) = Pic.Left

 

그림 개체의 좌측 절대위치를 가져옵니다.

 

  Cells(5, 2) = Pic.Height

 

그림 개체의 좌측 절대위치를 가져옵니다.

 

  Cells(6, 2) = Pic.Width

 

그림 개체의 좌측 절대위치를 가져옵니다.

 

 

3. 실행결과입니다.

그림의 좌상단(C1)과 우하단(F6) 셀의 위치를 잘 가져왔고요

또한 상단(10.5), 좌측(174), 높이(148.5), 너비(163.5) 의 절대 위치를 가져왔습니다.


VBA 코드입니다.

참고바랍니다.

Sub Ext()
For Each Pic In ActiveSheet.Pictures
    Cells(1, 2) = Pic.TopLeftCell.Address
    Cells(2, 2) = Pic.BottomRightCell.Address
    Cells(3, 2) = Pic.Top
    Cells(4, 2) = Pic.Left
    Cells(5, 2) = Pic.Height
    Cells(6, 2) = Pic.Width
Next
End Sub

 

안녕하세요.

 

이번 시간에는 문서내의 한자를 한글로 자동 변환하는 프로그램을 짜보도록  하겠습니다.

 

아래는 목포시에 대한 설명입니다.

 

문서의 일부에 한자가 들어가 있네요.

 

일일이  F9 키를 누르면 변환하는게 힘드셨을 겁니다.

 

그럼 코딩 내용 들어가겠습니다.

 


먼저 관련 라이브러리를 불러와 줍니다.

# -*- coding: cp949 -*-
import win32com.client as win32

import os
import fnmatch

 

한글 개체를 불러와 주고요.
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

폴더내의 모든 파일을 검색합니다.
dir1=os.getcwd()
dir1="E:/han/문서/"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

print(filename)

한글파일을 열어줍니다.
for file in filename:
  hwp.Open(dir1+file, "HWP", "forceopen:true")

 

그리고 맨마지막으로 커서를 옮깁니다.

  hwp.MovePos(3, 0, 0)

 

그리고 맨 마지막 위치에서 거꾸로 검색했을 때 첫번째의 문자를 선택해줍니다.

말이 복잡한데 결론적으로는 문서내의 맨 마지막에 위치한 문자를 선택합니다.

  hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
  option = hwp.HParameterSet.HFindReplace
  option.FindString = "?"
  option.UseWildCards = 1;

  option.IgnoreMessage = 1;
  option.Direction = hwp.FindDir("Backward");
  hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);

 

맨 마지막 문자의 위치를 저장해줍니다.
  Set = hwp.GetPosBySet()
  list1 = Set.Item("List")
  para1 = Set.Item("Para")
  pos1 = Set.Item("Pos")

 

그리고 다시 문서의 처음 위치로 오고요.
  hwp.MovePos(2, 0, 0)

 

맨 처음부터 한글자 한글자 검색하여 이동합니다.
  while(1):
    hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
    option = hwp.HParameterSet.HFindReplace
    option.FindString = "?"
    option.UseWildCards = 1;

    option.IgnoreMessage = 1;
    option.Direction = hwp.FindDir("Forward");
    hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);

한자로 되어 있으면 한글로 변환합니다.


    hwp.HAction.GetDefault("ConvertToHangul", hwp.HParameterSet.HConvertToHangul.HSet);
    hwp.HAction.Execute("ConvertToHangul", hwp.HParameterSet.HConvertToHangul.HSet);

 

변환을 할 때 한자 음이 하나이면 자동으로 변환이 되나 음이 여러개이면 선택해야 합니다.

가령 傳說 할 떄 의 은 4개의 음이 있습니다.  따라서 4개의 음 중에 선택을 해야하는데요

관련해서 아래와 같은 창이 뜨고 어떤 음을 쓸지 선택을 해줘야 합니다.

 

 

현재위치를 구하고요.

    set = hwp.GetPosBySet()
    list2 = set.Item("List")
    para2 = set.Item("Para")
    pos2 = set.Item("Pos")

 

만약에 현재의 위치가 아까전에 저장해 두었던 문서의 마지막 문자의 위치와 같으면 루프문을 빠져나오고요.
    if (list1==list2 and para1==para2 and pos1==pos2):
      break

 

문서를 저장하고
  hwp.Clear(3);

 

한글을 종료합니다.
hwp.Quit()

아래는 변환할 때의 동영상입니다.

 

 

 

 

최종적으로는

 

 

한자가 한글로 잘 변환되었네요!!

 

궁금하신 사항있으시면 댓글부탁드립니다.

 

감사합니다.


# -*- coding: cp949 -*-
import win32com.client as win32
import os
import fnmatch
import time

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

dir1=os.getcwd()
dir1="E:/han/문서/"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')
print(filename)

for file in filename:
    hwp.Open(dir1+file, "HWP", "forceopen:true")
    hwp.MovePos(3, 0, 0)

    hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
    option = hwp.HParameterSet.HFindReplace
    option.FindString = "?"
    option.UseWildCards = 1;
    option.IgnoreMessage = 1;
    option.Direction = hwp.FindDir("Backward");
    hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);

    Set = hwp.GetPosBySet()
    list1 = Set.Item("List")
    para1 = Set.Item("Para")
    pos1 = Set.Item("Pos")
    hwp.MovePos(2, 0, 0)

    while(1):
        hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
        option = hwp.HParameterSet.HFindReplace
        option.FindString = "?"
        option.UseWildCards = 1;
        option.IgnoreMessage = 1;
        option.Direction = hwp.FindDir("Forward");
        hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);


        hwp.HAction.GetDefault("ConvertToHangul", hwp.HParameterSet.HConvertToHangul.HSet);
        hwp.HAction.Execute("ConvertToHangul", hwp.HParameterSet.HConvertToHangul.HSet);

        set = hwp.GetPosBySet()
        list2 = set.Item("List")
        para2 = set.Item("Para")
        pos2 = set.Item("Pos")

        if (list1==list2 and para1==para2 and pos1==pos2):
            break

    hwp.Clear(3);
hwp.Quit()

안녕하세요

이번 시간에는 한글의 양식개체(체크버튼, 라디오버튼, 콤보박스)의 정보를 엑셀로 옮기는 작업을 해보려 합니다.

먼저 아래와 같은 설문지가 있습니다.

이름을 입력할 수 있는 누름틀(엄밀히 말하면 양식개체는 아님)

 

성별을 선택할 수 있는 라디오버튼

 

결혼여부를 선택할 수 있는 체크버튼

 

거주지를 선택할 수 있는 콤보박스로 구성되어 있습니다.

 

이런 설문조사 파일들의 정보들을 다음의 엑셀파일에 옮기게 됩니다.

 

그럼 코드 내용을 보도록 하겠습니다.

 

많이 보던 아래 코드를 넣어주고요.

# -*- coding: cp949 -*-
import win32com.client as win32

import os
import fnmatch
import time

 

엑셀과 한글 개체를 불러옵니다.
xl=win32.gencache.EnsureDispatch("Excel.Application")
xl.Workbooks.Open("e:/move2/정리.xlsx")
xl.Visible=True
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

폴더내에 들어있는 모든 한글파일을 검색하고요
dir1=os.getcwd()
dir1="E:/move2/접수/"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

print(filename)

 

모든 파일을 열면서
i=1
for file in filename:

  hwp.Open(dir1+file, "HWP", "forceopen:true")

 

"이름"이란 글자를 찾구요
  hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
  option = hwp.HParameterSet.HFindReplace
  option.FindString = "이름"
  option.IgnoreMessage = 1;

  option.Direction = hwp.FindDir("AllDoc");
  hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);

 

옆 칸으로 이동합니다.
  hwp.HAction.Run("MoveRight");

 

한번 더 이동하면 누름틀 안으로 진입하게 됩니다.
  hwp.HAction.Run("MoveRight");

 

마지막 글자까지 선택하고요.
  hwp.HAction.Run("MoveSelLineEnd");

 

카피를 해주고요
  hwp.HAction.Run("Copy");

 

엑셀에 붙여놓을 셀을 선택하고

  xl.ActiveSheet.Cells(i + 1, 1).Select()

 

붙여줍니다.
  xl.ActiveSheet.Paste()

 

그리고 양식개체에 접근하는 법입니다.

gender = hwp.XHwpDocuments.Item(0).XHwpFormRadioButtons.ItemFromName("RadioButton1").Value

여기에서  Item(0) 이 의미하는 것은 첫번째 탭을 의미합니다.

엑셀에서 말하는 시트의 첫번째라고 생각하시면 됩니다.

그리고 해당 탭에 있는 라디오 버튼의 속성 중 이름이  "RadioButton1"이라고 되어 있는 개체의 값을 가져옵니다.

체크박스와 콤보박스의 정보를 가져옵니다.

marriage = hwp.XHwpDocuments.Item(0).XHwpFormCheckButtons.ItemFromName("CheckBox1").Value
address = hwp.XHwpDocuments.Item(0).XHwpFormComboBoxs.ItemFromName("ComboBox1").Text

추가로 콤보박스의 코드는 아래 그림과 같으니 참고하시기 바랍니다.

남자에 체크했으면 남자이고, 체크하지 않았으면 여자입니다.
if gender == 1:
  xl.ActiveSheet.Cells(i + 1, 2).Value = "남자"
else:

  xl.ActiveSheet.Cells(i + 1, 2).Value = "여자"

 

결혼여부에 체크했으면 기혼이고 아니면 미혼입니다.
if marriage == 1:
  xl.ActiveSheet.Cells(i + 1, 3).Value = "기혼"
else:

  xl.ActiveSheet.Cells(i + 1, 3).Value = "미혼"

 

주소를 넣어주고요
  xl.ActiveSheet.Cells(i + 1, 4).Value = address
i=i+1

 

한글과 엑셀을 종료합니다.

hwp.Quit()
xl.ActiveWorkbook.Save()
xl.ActiveWorkbook.Close()

실행을 하시면 아래와 같이 잘 옮겨진 것을 볼 수 있습니다.

 

관련 파일도 같이 올려드립니다. 참고하시기 바랍니다.

 

move2.zip
0.03MB

 

추가로 궁금하신 사항있으시면 댓글부탁드립니다.

 

감사합니다.

 

 


 

# -*- coding: cp949 -*-
import win32com.client as win32
import os
import fnmatch
import time

xl=win32.gencache.EnsureDispatch("Excel.Application")
xl.Workbooks.Open("e:/move2/정리.xlsx")
xl.Visible=True
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

dir1=os.getcwd()
dir1="E:/move2/접수/"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')
print(filename)
i=1
for file in filename:
    hwp.Open(dir1+file, "HWP", "forceopen:true")
    hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
    option = hwp.HParameterSet.HFindReplace
    option.FindString = "이름"
    option.IgnoreMessage = 1;
    option.Direction = hwp.FindDir("AllDoc");
    hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
    hwp.HAction.Run("MoveRight");
    hwp.HAction.Run("MoveRight");
    hwp.HAction.Run("MoveSelLineEnd");
    hwp.HAction.Run("Copy");
    xl.ActiveSheet.Cells(i + 1, 1).Select()
    xl.ActiveSheet.Paste()
    gender = hwp.XHwpDocuments.Item(0).XHwpFormRadioButtons.ItemFromName("RadioButton1").Value
    marriage = hwp.XHwpDocuments.Item(0).XHwpFormCheckButtons.ItemFromName("CheckBox1").Value
    address = hwp.XHwpDocuments.Item(0).XHwpFormComboBoxs.ItemFromName("ComboBox1").Text
    if gender == 1:
        xl.ActiveSheet.Cells(i + 1, 2).Value = "남자"
    else:
        xl.ActiveSheet.Cells(i + 1, 2).Value = "여자"
    if marriage == 1:
        xl.ActiveSheet.Cells(i + 1, 3).Value = "기혼"
    else:
        xl.ActiveSheet.Cells(i + 1, 3).Value = "미혼"
    xl.ActiveSheet.Cells(i + 1, 4).Value = address
    i=i+1
hwp.Quit()
xl.ActiveWorkbook.Save()
xl.ActiveWorkbook.Close()

 

안녕하세요

오늘은 여러개의 한글파일을 하나의 파일로 합쳐보는 프로그램을 작성해보도록 하겠습니다.

한글에 자체적으로 '문서 끼워 넣기'란 기능이 있습니다.

그러나 합칠 파일이 100개, 1000개가 넘어간다면 일일이 합치 여간 힘든일이 아니죠...

그럴 때 요긴하게 사용할 수 있는 프로그램이 되겠습니다.

먼저 합칠 한글파일은 아래와 같습니다.

이 것을 하나의 파일로 합쳐보겠습니다.


시작하기 앞서 관련 라이브러리를 불러와주고요

# -*- coding: cp949 -*-
import win32com.client as win32

import os
import fnmatch

 

한글 개체를 생성해주고요

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

한글파일이 들어있는 폴더를 지정을 해줍니다.
dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

print(filename)

 

그리고 모든 파일을 열면서
i=0
for file in filename:

 

첫번째 파일은 그냥 열어주고요
  if i==0:
    hwp.Open(dir1+file, "HWP", "forceopen:true")

 

그리고 문서의 맨 마지막으로 이동해줍니다. 왜냐면 뒤에 문서를 붙여줄거니까요..
    hwp.MovePos(3, 0, 0)

 

두번째 문서부터는 아래처럼 문서를 끼워넣어 줍니다.
  else:
    hwp.HAction.GetDefault("InsertFile", hwp.HParameterSet.HInsertFile.HSet);
    option=hwp.HParameterSet.HInsertFile

 

끼워넣을 문서를 지정을 해줍니다.
    option.filename = dir1+file
    option.KeepSection = 1;
    option.KeepCharshape = 1;
    option.KeepParashape = 1;
    option.KeepStyle = 1;
    hwp.HAction.Execute("InsertFile", hwp.HParameterSet.HInsertFile.HSet);

 

똑같이 현재 문서의 마지막으로 이동합니다.
    hwp.MovePos(3, 0, 0)

 

계속 반복해줍니다.

  i=i+1

파일을 바탕화면에 저장합니다.
hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet);
option=hwp.HParameterSet.HFileOpenSave
option.Attributes = 0;
option.filename = "C:/Users/BJ/Desktop/111.hwp";
option.Format = "HWP";
hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet);

 

한글을 종료하고요
hwp.Quit()

 

결과파일인 111.hwp  파일을 열면

 

하나의 파일로 잘 합쳐져 있는 것을 보실 수 있습니다!!

 


# -*- coding: cp949 -*-
import win32com.client as win32
import os
import fnmatch

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')
print(filename)

i=0
for file in filename:
    if i==0:
        hwp.Open(dir1+file, "HWP", "forceopen:true")
        hwp.MovePos(3, 0, 0)
    else:
        hwp.HAction.GetDefault("InsertFile", hwp.HParameterSet.HInsertFile.HSet);
        option=hwp.HParameterSet.HInsertFile
        option.filename = dir1+file
        option.KeepSection = 1;
        option.KeepCharshape = 1;
        option.KeepParashape = 1;
        option.KeepStyle = 1;
        hwp.HAction.Execute("InsertFile", hwp.HParameterSet.HInsertFile.HSet);
        hwp.MovePos(3, 0, 0)
    i=i+1


hwp.HAction.GetDefault("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet);
option=hwp.HParameterSet.HFileOpenSave
option.Attributes = 0;
option.filename = "C:/Users/BJ/Desktop/111.hwp";
option.Format = "HWP";
hwp.HAction.Execute("FileSaveAs_S", hwp.HParameterSet.HFileOpenSave.HSet);

hwp.Quit()

 

안녕하세요

 

오늘은 한글파일 내에 존재하는 그림만을 추출하여 파일로 저장하는 프로그램을 만들어 보겠습니다.

 

우선 E드라이브 접수 폴더 내에 아래 한글파일이 있습니다.

 

여기에서 들어있는 증명사진?을 파일로 추출해보겠습니다.

코딩 내용입니다.

우선 관련 라이브러리를 불러와 주고요

import win32com.client as win32
import os
import fnmatch

 

한글개체를 생성합니다.
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

E드라이브 밑에 접수폴더내에 포함되어 있는 한글파일을 검색합니다.
dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

print(filename)

 

모든 파일을 열면서

for file in filename:
  hwp.Open(dir1+file, "HWP", "forceopen:true")

 

문서내에 포함되어 있는 컨트롤을 검색합니다.

컨트롤이란 문서내에 있는 각종 자료? 양식? 같은 것을 말합니다.

그림도 될 수 있고 표도 될 수 있고요

 

맨 처음 obj 에 넣게되는 것은 문서 내에 첫번째 컨트롤입니다.
  obj = hwp.HeadCtrl

 

그리고 마지막 컨트롤까지 검색을 합니다.

  i = 0
  while obj!= None :

 

컨트롤이 그림인지를 판별을 해야 하는데요

CtrlID 값을 보고 판단할 수 있습니다.

저희가 원하는 것은 그림입니다.

아래 표를 보면 gso 가 그림임을 알 수 있습니다.

그래서 그림 컨트롤이면
    idnum = obj.CtrlID
    if(idnum=="gso"):

 

해당 컨트롤으로 커서를 이동하고요
      paramSet = obj.GetAnchorPos(0);
      list1 = paramSet.Item("List")
      para = paramSet.Item("Para")
      pos = paramSet.Item("Pos")
      hwp.SetPos(list1, para, pos)

 

그림 컨트롤을 선택합니다.
      hwp.HAction.Run("SelectCtrlFront")

 

그리고 그림파일 이름을 설정합니다.

이름은 한글파일명(.hwp제외) + 사진번호 + .png로 설정합니다.
      filen=file[:-4]
      name=filen+str(i+1)+".png"

 

그리고 사진추출 폴더내에 저장합니다.
      hwp.HAction.GetDefault("PictureSave",hwp.HParameterSet.HShapeObjSaveAsPicture.HSet)
      option = hwp.HParameterSet.HShapeObjSaveAsPicture
      option.Path = "E:/사진추출/"+name
      option.Ext="png"
      hwp.HAction.Execute("PictureSave",hwp.HParameterSet.HShapeObjSaveAsPicture.HSet)

 

다음 컨트롤 개체로 이동을 해서 위 작업을 반복합니다.

      i=i+1
     obj=obj.Next

 

모든 작업이 끝나면 한글을 종료합니다.
hwp.Clear(1);
hwp.Quit()

 

실행한 결과입니다.

 

그림추출 폴더 내에 사진들이 잘 저장이 되어 있는 것을 확인할 수 있습니다!!

 

감사합니다.

 


import win32com.client as win32
import os
import fnmatch

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')
print(filename)

for file in filename:
    hwp.Open(dir1+file, "HWP", "forceopen:true")
    obj = hwp.HeadCtrl
    i = 0
    while obj!= None :
            idnum = obj.CtrlID
            if(idnum=="gso"):
                paramSet = obj.GetAnchorPos(0);
                list1 = paramSet.Item("List")
                para = paramSet.Item("Para")
                pos = paramSet.Item("Pos")
                hwp.SetPos(list1, para, pos)
                hwp.HAction.Run("SelectCtrlFront")
                filen=file[:-4]
                name=filen+str(i+1)+".png"
                hwp.HAction.GetDefault("PictureSave",hwp.HParameterSet.HShapeObjSaveAsPicture.HSet)
                option = hwp.HParameterSet.HShapeObjSaveAsPicture
                option.Path = "E:/사진추출/"+name
                option.Ext="png"
                hwp.HAction.Execute("PictureSave",hwp.HParameterSet.HShapeObjSaveAsPicture.HSet)
                i=i+1
            obj=obj.Next

hwp.Clear(1);
hwp.Quit()

안녕하세요.

오늘은 한글파일 내에 표의 내용을 엑셀로 옮기는 작업을 해볼까 합니다.

지원서 같은 것을 한글로 접수받고 엑셀로 정리를 한다고 하였을 때

지원가 많다보면 많이 번거로울 것입니다.

이것을 자동화해보도록 하겠습니다.

우선 지원서가 아래와 같다고 해봅시다!!

 

그리고 이 한글파일을 정리할 엑셀파일은 다음과 같습니다.

 

아래는 표의 내용을 엑셀파일로 자동으로 옮겨주는 코드입니다.

 

아래 코드는 전에 작성했던 코드랑 동일하므로 설명은 생략하겠습니다.

# -*- coding: cp949 -*-
import win32com.client as win32

import os
import fnmatch

 

엑셀을 사용할 수 있는도록 엑셀개체를 생성합니다.
xl=win32.gencache.EnsureDispatch("Excel.Application")

 

그리고 E드라이브에 있는 엑셀파일을 열어줍니다.

xl.Workbooks.Open("e:정리.xlsx")

 

여기까지 코드를 실행하면 엑셀이 실행이 안된것 처럼 보여집니다.

그러나 보이지만 않을 뿐 백그라운드 상으로는 파일을 열고 있습니다.

만약에 엑셀을 보고 싶다 그러면 아래 코드를 추가로 써줍니다.

xl.Visible=True

 

그리고 한글개체를 생성하고요.
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

E드라이브의 접수 폴더 밑에 있는 모든  한글파일을 열어 줍니다.
dir1=os.getcwd()
dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

print(filename)

 

지원서 파일에는 아래와 같은 항목이 존재합니다.
data=["이름","생년월일", "직장명", "직위", "주소","연락처"]

 

모든 파일을 열면서
i=1

for file in filename:
  hwp.Open(dir1+file, "HWP", "forceopen:true")
  hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
  option=hwp.HParameterSet.HFindReplace
  j=0

 

각 항목을 검색합니다.
  for item in data:

    option.FindString = data[j]
    option.IgnoreMessage = 1;
    option.Direction = hwp.FindDir("AllDoc");
    hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);

 

각 항목을 찾았으면 해당 항목에서 오른쪽 버튼을 한 번 누름니다.

그러면 찾았던 항목의 옆 칸으로 이동하겠죠?

여기에 우리가 원하는 내용이 있습니다!!

    hwp.HAction.Run("MoveRight");

 

그리고 해당 칸의 마지막까지 선택을 해주고요

    hwp.HAction.Run("MoveSelLineEnd");

 

카피를 해줍니다. Ctrl + C 와 같습니다.
    hwp.HAction.Run("Copy");

 

그리고 엑셀에서 붙여넣기 할 셀을 선택해주고요

    xl.ActiveSheet.Cells(i+1, j+1).Select()

 

붙여넣기 해줍니다. Ctrl + V 와 같습니다.

    xl.ActiveSheet.Paste()

 

반복해줍니다.
     j=j+1
  i=i+
1

 

한글을 종료해주고요.
hwp.Quit()

 

엑셀은 저장해줍니다.
xl.ActiveWorkbook.SaveAs("e:정리.xlsx")

 

엑셀을 종료하고요
xl.ActiveWorkbook.Close()

코딩은 여기까지입니다.

 

코드를 실행해보면....

엑셀에 한그파일 지원서의 내용이 잘 들어가 있는 것을 확인하실 수 있습니다.

 

지원서 파일이 많으면 확실히 도움이 될거라 생각됩니다.

 

첨부파일 참고하시고요.

 

move.zip
0.02MB

 

감사합니다.

 


import win32com.client as win32
import os
import fnmatch

xl=win32.gencache.EnsureDispatch("Excel.Application")
xl.Workbooks.Open("e:정리.xlsx")
#xl.Visible=True
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

dir1=os.getcwd()
dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')
print(filename)
data=["이름","생년월일", "직장명", "직위", "주소","연락처"]
i=1
for file in filename:
    hwp.Open(dir1+file, "HWP", "forceopen:true")
    hwp.HAction.GetDefault("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
    option=hwp.HParameterSet.HFindReplace
    j=0
    for item in data:
        option.FindString = data[j]
        option.IgnoreMessage = 1;
        option.Direction = hwp.FindDir("AllDoc");
        hwp.HAction.Execute("RepeatFind", hwp.HParameterSet.HFindReplace.HSet);
        hwp.HAction.Run("MoveRight");
        hwp.HAction.Run("MoveSelLineEnd");
        hwp.HAction.Run("Copy");
        xl.ActiveSheet.Cells(i+1, j+1).Select()
        xl.ActiveSheet.Paste()
        j=j+1
    print(i)
    i=i+1

hwp.Quit()
xl.ActiveWorkbook.SaveAs("e:정리.xlsx")
xl.ActiveWorkbook.Close()

안녕하세요

 

오늘은 한글파일 내에 존재하는 전화번호를 삭제하는 프로그램을 짜볼까 합니다.

 

하나의 한글파일이라면 수작업으로 전화번호를 삭제할 수 있겠지만

 

파일이 여러개이다 보면 많이 귀찮고 시간도 많이 걸리게 되죠

 

한글파일을 한 곳에 모아 놓고요 여기에서는 E:\접수 폴더에 넣어놨습니다.

 

파일을 열게되면

 

각종 정보가 들어가 있고 마지막에 연락처가 들어가 있습니다.

 

이 부분을 삭제하는 코드를 짜보도록 하겠습니다.

 

한글을 쓸 것이므로 아래 코드를 쓰고요

# -*- coding: cp949 -*-

 

한글  api  를 쓸 것이므로 아래 라이브러리를 불러와 줍니다.
import win32com.client as win32

 

그리고 폴더에 hwp를 검색할 수 있도록 아래 라이브러리도 불러와 줍니다.
import os

import fnmatch

 

한글객체를 불러와 주고요

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

먼저 전화번호를 찾아야 되는데요

전화번호의 형식이 여러개가 있겠죠, 모두 다 써줍니다.

아래에서 ? 표시는 와일드카드로 어떤 숫자가 와도 찾겠다는 뜻 입니다.
data=["(0?-???-????)","(0?-????-????)","(0??-???-????)","(0??-????-????)","0?-???-????","0?-????-????","0??-???-????","0??-????-????"]

 

그리고 E:\접수 폴더에 있는 모든 hwp 파일을 filename 에 건네줍니다.
dir1=os.getcwd()
dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

 

 

모든 파일을 돌면서
for file in filename:

 

파일을 열어줍니다.
  hwp.Open(dir1+file, "HWP", "forceopen:true")

 

그리고 아래 코드에 따라서 '찾아 바꾸기'를 해줍니다.
  hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet);
  option=hwp.HParameterSet.HFindReplace
  i=0

 

 전화번호 형식에 걸리는 것을 모두 찾아서 빈칸으로 바꿔줍니다.
  for j in data:

    option.FindString = data[i];
    option.ReplaceString = "";
    option.IgnoreMessage = 1;
    option.UseWildCards = 1;
    hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet);
    i = i + 1

 

저장하고 닫고요
  hwp.Clear(3);

 

한글을 종료합니다.
hwp.Quit()

 

실행하면

폴더 내의 모든 파일 내 연락처가 삭제된 것을 확인하실 수 있습니다.

 

아래는 코드입니다.

 

참고바랍니다.

 

감사합니다.


# -*- coding: cp949 -*-
import win32com.client as win32
import os
import fnmatch

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
#전화번호 정보
data=["(0?-???-????)","(0?-????-????)","(0??-???-????)","(0??-????-????)","0?-???-????","0?-????-????","0??-???-????","0??-????-????"]

dir1=os.getcwd()
dir1="E:₩₩접수₩₩"
filename=fnmatch.filter(os.listdir(dir1),'*.hwp')

for file in filename:
    hwp.Open(dir1+file, "HWP", "forceopen:true")
    hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet);
    option=hwp.HParameterSet.HFindReplace
    i=0
    for j in data:
        option.FindString = data[i];
        option.ReplaceString = "";
        option.IgnoreMessage = 1;
        option.UseWildCards = 1;
        hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet);
        i = i + 1
    hwp.Clear(3);

hwp.Quit()

+ Recent posts