사용자 도구

사이트 도구


kb:visualstudiotoolsforoffice

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:visualstudiotoolsforoffice [2014/11/09 21:28] (현재)
줄 1: 줄 1:
 +====== Visual Studio Tools for Office ======
 +오피스 프로그램 애드인 프로그래밍을 좀 더 쉽게 해주는 프레임워크.
 +
 +일단 엑셀이 타겟이다. [[VisualBasic]] 스크립트 및 [[ODBC]]를 통한 자동화에 한계를 느꼈기 때문이다. 사실 게임 제작과 관련된 작업에서 엑셀 말고 다룰 것이 있을까 싶기도 하다.
 +
 +
 +
 +====== 기본 개념 ======
 +일단 Office 자체는 [[ExcelProgramming]] 항목 같은 데서 보았듯이 COM 인터페이스를 제공하고 있다. VSTO는 유저가 만든 애드인과 이 COM 인터페이스 사이에서 동작하는 일종의 미들웨어다. 그렇기 때문에 그냥 프로그램 짜서 DLL만 덜렁 설치하면 되는 게 아니라 VSTO 런타임도 설치해줘야 한다.
 +
 +
 +====== XLS 파일 저장하기 전에 CSV 파일 저장하기 ======
 +WorkbookBeforeSave 이벤트 핸들러를 정의해주면 된다. 참고로 이 샘플에서 생성하는 CSV 파일 포맷은 개인적으로 사용중인 확장(-_-) CSV 포맷이다.
 +
 +> 아...그런데 너무 느리다. 개떡같이 느리다. 혹시나 싶어서 StreamWriter.Write 쓰는 부분 StringBuilder로 대체해봤는데도 똑같다. 그냥 셀 주욱 읽어서 텍스트 파일 생성하는 건데 왜 이리 느리지? 내가 뭘 잘못했나?​
 +>> 나중에 알고 보니, 함수 호출 때문이었다. 객체 옆에 "​."​ 붙여서 멤버 값을 가져오는 것 자체가 다 함수 호출이라고 보면 된다. 최대한 캐싱할 수 있도록 해야 한다.
 +
 +<code c#>
 +private void ThisAddIn_Startup(object sender, System.EventArgs e)
 +{
 +    ...
 +    Application.WorkbookBeforeSave += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler(ThisAddin_Application_WorkbookBeforeSave);​
 +    ...
 +}
 +
 +private void ThisAddin_Application_WorkbookBeforeSave(Excel.Workbook Wb, bool SaveAsUI, ref bool Cancel)
 +{
 +    try
 +    {
 +        string fileName = Wb.FullName + "​.csv";​
 +        ​
 +        using (FileStream file = new FileStream(fileName,​ FileMode.Create,​ FileAccess.Write))
 +        {
 +            StreamWriter writer = new StreamWriter(file,​ System.Text.Encoding.Default);​
 +
 +            foreach (Excel.Worksheet sh in Wb.Worksheets)
 +            {
 +                writer.Write("​$"​ + sh.Name + ",​----------------------------------------------------------------------\r\n"​);​
 +
 +                Excel.Range used = sh.UsedRange;​
 +                for (int r = 1; r <= used.Rows.Count;​ ++r)
 +                {
 +                    for (int c = 1; c <= used.Columns.Count;​ ++c)
 +                    {
 +                        Excel.Range cell = (Excel.Range)sh.Cells[r,​ c];
 +                        writer.Write(MakeCsvEncodedString(cell.Text.ToString()));​
 +                        if (c != used.Columns.Count)
 +                            writer.Write(","​);​
 +                    }
 +
 +                    writer.Write("​\r\n"​);​
 +                }
 +            }
 +
 +            writer.Flush();​
 +        }
 +    }
 +    catch (System.Exception e)
 +    {
 +        System.Windows.Forms.MessageBox.Show(e.ToString());​
 +    }
 +}
 +
 +private string MakeCsvEncodedString(string original)
 +{
 +    string result = "";​
 +
 +    if (original.IndexOfAny(",​\"​\r\n"​.ToCharArray()) == -1)
 +    {
 +        result = original;
 +    }
 +    else
 +    {
 +        result += "​\"";​
 +
 +        for (int k=0; k<​original.Length;​ k++)
 +        {
 +            if (original[k] == '​\"'​)
 +                result += "​\"​\"";​
 +            else 
 +                result += original[k];​
 +        }
 +
 +        result += "​\"";​
 +    }
 +
 +    return result;
 +}
 +</​code>​
 +
 +====== Gotcha ======
 +===== 애드인 에러 메시지 보기 =====
 +VSTO_SUPPRESSDISPLAYALERTS 환경변수 값을 0으로 세팅하면 애드인 로드 에러가 발생했을 때 메시지창이 뜬다.
 +
 +===== 애드인이 제대로 로드되지 않는 경우 =====
 +기본적으로 애드인은 보안 문제 때문에 제대로 로드되지 않는다. 이 문제를 근본적으로 해결하기 위해서는 다음과 같은 방법이 가장 확실하다.
 +
 +  - [[http://​www.microsoft.com/​downloads/​details.aspx?​familyid=6991E869-8D5B-45F4-91E7-B527BD236F4C&​displaylang=en | Deploying Office Solutions Using Windows Installer Version 3]]를 다운받아서 설치한다. ​
 +    * 기본적으로 설치되는 폴더는 C:\Program Files\Microsoft Visual Studio 2005 Tools for Office SE Resources다.
 +  - 설치된 폴더로 가서 project 폴더 안으로 들어가면 SetSecurity 프로젝트가 있다. 이 프로젝트를 폴더 통채로 카피해서 애드인 프로젝트가 있는 폴더에다 복사한다.
 +  - 복사한 SetSecurity 프로젝트를 솔루션에다 추가한다.
 +  - 셋업 프로젝트에다 SetSecurity 프로젝트의 출력을 추가한다.
 +
 +아. 되는 줄 알았는데 아니었다. caspol을 이용해서 미리 세팅해버렸기 때문에 되는 거였다. 더 조사가 필효.
 +
 +
 +===== AddIn 클래스를 못 찾는 경우 =====
 +2005랑 2008을 같이 깔아서 그런 건지는 모르겠다만,​ 이 경우에는 어셈블리 참조를 수정해주면 된다. Microsoft.Office.Tools.Common 어셈블리에 대한 레퍼런스를 C:\Program Files\Reference Assemblies\Microsoft\VSTO\v8.0\Microsoft.Office.Tools.Common.dll로 지정해준다.
 +
 +
 +====== 링크 ======
 +  * [[http://​msdn2.microsoft.com/​en-us/​office/​aa905533.aspx | Visual Studio Tools for Office Developer Portal]]
 +  * [[http://​www.microsoft.com/​downloads/​details.aspx?​familyid=6991E869-8D5B-45F4-91E7-B527BD236F4C&​displaylang=en | Visual Studio 2005 Tools for Office Second Edition Sample: Deploying Office Solutions Using Windows Installer Version 3]]
 +
 +----
 +  * see also [[VisualStudio]],​ [[ExcelProgramming]]
  
kb/visualstudiotoolsforoffice.txt · 마지막으로 수정됨: 2014/11/09 21:28 (바깥 편집)