사용자 도구

사이트 도구


kb:visualstudiotoolsforoffice

Visual Studio Tools for Office

오피스 프로그램 애드인 프로그래밍을 좀 더 쉽게 해주는 프레임워크.

일단 엑셀이 타겟이다. VisualBasic 스크립트 및 ODBC를 통한 자동화에 한계를 느꼈기 때문이다. 사실 게임 제작과 관련된 작업에서 엑셀 말고 다룰 것이 있을까 싶기도 하다.

기본 개념

일단 Office 자체는 ExcelProgramming 항목 같은 데서 보았듯이 COM 인터페이스를 제공하고 있다. VSTO는 유저가 만든 애드인과 이 COM 인터페이스 사이에서 동작하는 일종의 미들웨어다. 그렇기 때문에 그냥 프로그램 짜서 DLL만 덜렁 설치하면 되는 게 아니라 VSTO 런타임도 설치해줘야 한다.

XLS 파일 저장하기 전에 CSV 파일 저장하기

WorkbookBeforeSave 이벤트 핸들러를 정의해주면 된다. 참고로 이 샘플에서 생성하는 CSV 파일 포맷은 개인적으로 사용중인 확장(-_-) CSV 포맷이다.

아…그런데 너무 느리다. 개떡같이 느리다. 혹시나 싶어서 StreamWriter.Write 쓰는 부분 StringBuilder로 대체해봤는데도 똑같다. 그냥 셀 주욱 읽어서 텍스트 파일 생성하는 건데 왜 이리 느리지? 내가 뭘 잘못했나?
나중에 알고 보니, 함수 호출 때문이었다. 객체 옆에 ”.” 붙여서 멤버 값을 가져오는 것 자체가 다 함수 호출이라고 보면 된다. 최대한 캐싱할 수 있도록 해야 한다.
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;
}

Gotcha

애드인 에러 메시지 보기

VSTO_SUPPRESSDISPLAYALERTS 환경변수 값을 0으로 세팅하면 애드인 로드 에러가 발생했을 때 메시지창이 뜬다.

애드인이 제대로 로드되지 않는 경우

기본적으로 애드인은 보안 문제 때문에 제대로 로드되지 않는다. 이 문제를 근본적으로 해결하기 위해서는 다음과 같은 방법이 가장 확실하다.

    • 기본적으로 설치되는 폴더는 C:\Program Files\Microsoft Visual Studio 2005 Tools for Office SE Resources다.
  1. 설치된 폴더로 가서 project 폴더 안으로 들어가면 SetSecurity 프로젝트가 있다. 이 프로젝트를 폴더 통채로 카피해서 애드인 프로젝트가 있는 폴더에다 복사한다.
  2. 복사한 SetSecurity 프로젝트를 솔루션에다 추가한다.
  3. 셋업 프로젝트에다 SetSecurity 프로젝트의 출력을 추가한다.

아. 되는 줄 알았는데 아니었다. caspol을 이용해서 미리 세팅해버렸기 때문에 되는 거였다. 더 조사가 필효.

AddIn 클래스를 못 찾는 경우

2005랑 2008을 같이 깔아서 그런 건지는 모르겠다만, 이 경우에는 어셈블리 참조를 수정해주면 된다. Microsoft.Office.Tools.Common 어셈블리에 대한 레퍼런스를 C:\Program Files\Reference Assemblies\Microsoft\VSTO\v8.0\Microsoft.Office.Tools.Common.dll로 지정해준다.

링크

kb/visualstudiotoolsforoffice.txt · 마지막으로 수정됨: 2014/11/09 21:28 (바깥 편집)