티스토리 뷰



업무의 자동화가 점점 진행되는 과정에서 프로그래머의 역할이 일자리를 줄이기 보다는 보다 생산적이고 창의적인 일을 만드는 것에 기여 했으면 하는 바램입니다.


오늘 글은 C#에서 엑셀 파일을 직접 읽고, 수정하고, 저장하는 과정을 다룰까 합니다. 저의 경우 지금까지는 혹시 엑셀 파일을 생성해야만 하는 경우라 하더라도 왠만하면 CSV 파일 형태로 제작해서 파일을 엑셀로 읽을 수 있을 뿐만 아니라 리브레 오피스와 같은 무료 오피스로도 활용할 수 있게 했는데, 이번 경우에는 미리 준비된 엑셀 양식 파일에 데이터를 반영해서 새로운 엑셀 파일을 생성해야 하는 필요를 해결할까 합니다. 물론 프로그램 실행 과정에 엑셀을 활용하기 때문에 시스템에는 엑셀이 설치되어 있어야 합니다.



C#에서 엑셀 파일의 셀 단위로 직접 읽고 쓰는 작업을 하려면 엑셀용 PIA(Primary Interop Assemblies)가 시스템에 설치되어 있어야 하는데 통상 MS 오피스를 설치할때 자동적으로 설치되지만 오피스 설치 시점에 .NET 프레임워크가 설치되어 있지 않았거나 하는 경우에는 PIA가 자동 설치되지 않을 수도 있으므로 프로그래밍 이전에 먼저 확인해야 합니다.(시스템에 PIA가 없다면 오피스를 재설치하거나 재배포 가능 PIA 패키지를 설치하면 됩니다)


우선 비주얼 스튜디오에서 프로젝트의 참조>참조 추가 메뉴로 위와 같은 대화창을 엽니다. ".NET" 탭에서 Microsoft.Office.Interop.Excel 구성 요소를 찾아서 선택하면 됩니다. 버전은 용도에 따라 적절하게 선택합니다.


using Excel = Microsoft.Office.Interop.Excel;


코드 상단에 위와 같은 구문을 추가해 주면 좀더 간편하게 코드를 작성할 수 있습니다.


Excel.Application excelApp = null;

excelApp = new Excel.Application();

........

if (excelApp != null) excelApp.Quit();


코드의 모든 과정은 일단 Excel.Application 객체를 생성하는 것으로 시작합니다. 이 과정에서 실제 Excel.exe가 백그라운드에서 실행되어 응용 프로그램과 연결됩니다. 작업 관리자를 띄워서 수행중인 프로세스들을 살펴 보면 이 작업을 할 때마다 Excel.exe가 실행됨을 확인할 수 있습니다. 그러므로 사용이 끝나면 반드시 Quit()로 종료 시켜 주어야 합니다.


Excel.Workbook wb = null;
Excel.Worksheet ws = null;
try
{
    wb = excelApp.Workbooks.Open(formFileName);
    ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;

    object chkcell1 = ws.Range["C3"].Value;
    object chkcell2 = ws.Range["Z3"].Value;
    if (!chkcell1.ToString().Equals("report_date") || !chkcell2.ToString().Equals("print_date"))
    {
        throw new Exception("양식 오류");
    }
    ws.Range["C3"].Value = workdate.ToString("yyyy-MM-dd");
    ws.Range["Z3"].Value = DateTime.Now.ToString("yyyy-MM-dd");

    if (File.Exists(savFileName)) File.Delete(savFileName);
    wb.SaveAs(savFileName);
}
catch (Exception ex)
{
    if (wb != null) wb.Close();
    if (excelApp != null) excelApp.Quit();
    // process error message
    return;
}

if (wb != null) wb.Close();


코드의 내용은 양식 엑셀 파일을 읽어서 특정 셀 위치의 값을 확인하고 날짜를 수정해서 다른 이름으로 저장하는 간단한 과정입니다.


코드 작성전 주의할 점은 우선 양식으로 사용할 엑셀 파일을 *.xls의 엑셀 2003 이하 형태로 작성할 것이라면 호환성 위배 사항이 없도록 만드셔야 합니다. 그렇지 않으면 저장 시점에 경고 창이 나옵니다. 코드를 보면 기존 파일 업데이트 경고를 방지하기 위해서 기존 파일이 있다면 삭제하도록 코드를 추가했습니다.


또 한가지 주의할 점은 원본 양식 파일을 경로 지정 문제로 절대 경로를 기술한다면 반드시 C:, D:와 같은 드라이브 문자도 반드시 기술해야 했습니다. ws.Range[].Value로 특정 셀의 데이터만 가져올 수도 있지만 범위를 지정해서 한꺼번에 가져올 수도 있습니다.


끝으로 비스타 이전의 윈도우에서는 참조 추가시 COM 오브젝트를 사용하는 다른 방법을 활용해야 합니다. 





댓글
댓글쓰기 폼