본문 바로가기
Programing/C#

C#으로 Visio파일 다루기

by june._.note 2017. 3. 16.

MS사의 Excel이나 Word는 사용들을 많이해서 검색을하면 C#으로 Control하는 많은 방법들이 검색되는데,

 

Visio의 경우에는 검색해도 잘 나오질 않음.

 

 

그래도 다른 MS 제품과 비슷한 방법을 이용될것이라고 생각되며, 실제 사용한걸 정리해봄.

 

Microsoft.Office.Interop.Visio를 참조추가해두고 수행.

 

 

Using Visio = Microsoft.Office.Interop.Visio;

 

...

Visio.Application app = (Application을 받아온다.)

//Visio랑 연계되는 프로그램에서 메소드를 통해 Application을 받아왔지만, 새로 생성은 검색하면 있을듯.)

Visio.Document diagramDoc = app.ActiveDocument; // 활성화 된 Diagram 도면 객체를 받아옴.

 

Visio.Page visioPage = app.ActivePage; //현재 활성화된 Page를 읽어옴. Excel에서 WorkBook, Sheet객체를 받아오는것과 같은 작업.

(or Visio.Page visioPage = diagramDoc.Pages[페이지 번호] //Diagram의 특정 도면을 열 수 있음. 페이지 번호는 1페이지부터 시작됨)

  • Page에 도형 넣기.
    Visio.Shape anyShape = visioPage.DrawRectangle(double x1, double y1, double y1, double y2)
    // X1, Y1와 X2, Y2가 이루는 네모난 Shape을 화면에 그려준다.
    // 메소드 명을 보면 알겠지만 DrawCircle, DrawLine 등등 여러가지 메소드가 준비되어있음.)
  • Shape에 Text 넣기.
    anyShape.Text = "내용"; //Shape의 Text 속성값을 이용해서 내용을 넣을 수 있음.
  • Shape 속성 Control
    VisioOption > 고급 탭에서 개발자 모드로 실행을 설정하고, 재실행하면 심볼 우클릭 시 Show ShapeSheet라는
    버튼이 나타난다. 해당 속성값으로 Visio Shape을 Control 할 수 있다.
    (http://movingpackets.net/2011/05/08/visio-shapesheets-my-misunderstood-friend-part-3/)

    Cells in the User-defined cells' and Events sections of the ShapeSheet window after changing their contents
    • Shape의 속성값 Control방법(https://msdn.microsoft.com/en-us/library/office/ff767394.aspx)
    • Shape.get_CellsSRC(Short Section, Short Row, Short Column) 메소드를 통해 속성값을 var형식으로 받아서 값을 입력.
      ex) Shape의 Font Size 변경 (SRC는 Section, Row, Cell을 의미하는 듯)
      var fontSize = anyShape.get_CellSRC((short)Visio.VisSectionIndices.visSectionCharacter
                                                      , (short)Visio.VisRowIndices.visRowCharacter
                                                      , (short)Visio.VisCellIndices.visCharacterSize);
      fontSize.Formula = "15pt";
      //형식에 맞추어 넣겠다는 뜻인듯. pt없이 숫자만 넣으면 단위가 pt가 아닌 다른 단위를 이용하는듯.

      VisSectionIndices 참조 : https://msdn.microsoft.com/en-us/library/office/ff765983.aspx
      VisRowIndices 참조 : https://msdn.microsoft.com/en-us/library/office/ff765539.aspx
      VisCellIndices 참조 : https://msdn.microsoft.com/en-us/library/office/ff767991.aspx

      ** 빨간색 속성이 아닌 경우에는 get_CellSRC를 이용해 Section, Row, Cell Indices를 지정해서 값을 입력해야 함
    • Shape의 위치 이동 (http://stackoverflow.com/questions/9885382/in-c-sharp-change-visio-shape-position)
      Size&Position Window에서 X,Y값을 바꿔서 이동시키는 방법을 프로그램으로 수행(Shape의 Center점이 기준)

      shape.CellsU["PinX"].Formula = "2";
      shape.
      CellsU["PinY"].Formula = "2";

      CellsU 메소드는 ShapeSheet Cell의 값을 return해주는 함수라고 하는데, Read Only라고 설명이 되어있지만,
      위와 같은 방법으로 데이터를 입력하면 적용이 된다.

      ** SHAPE SHEET에서 빨간색 글씨로 되어있는 속성값들은 CellsU["속성이름"].Formula를 통해 값을 입력하면 적용됨.
      ex) shape.CellsU["FillPattern"].Formula = "0";
  • Stencil 불러오기 & Stencil의 Item 이름 불러오기
    작업하고 있는 프로그램 특성상 프로그램 내부에서 Stencil Revision관리를 하고 있음. 따라서 프로그램 API를 통해
    최신 Stencil파일의 Path가져와서 Stencil을 불러옴

    Visio.Document stencil = app.Documents.OpenEx(filePath, (short)Visio.VisOpenSaveArgs.visOpenDocked);
    (https://msdn.microsoft.com/en-us/library/office/ff767229.aspx)

    Array itemNameList; // Item 이름을 받을 Array 형태의 객체

    stencil.Masters.GetNames(out itemNameList); // 해당 Stencil에 포함되어있는 Item의 이름을 가져옴
    (https://msdn.microsoft.com/en-us/library/office/ff768131.aspx)