Open XLXS

Exel Library

작업을 진행 중 Excel 파일에 대한 고객사의 요청이 발생하는 경우가 있다. 그중 최근까지도 업데이트가 활발한 OpenXLXS를 소개한다.

사실 Excel에 대한 수요는 꾸준히 있어왔고, C++에는 마땅한 라이브러리가 없었다. 물론 구현방법은 존재하였는데, 전제 조건이 따랐다. Microsoft Excel이 설치되어 있어야하고, Active X로 등록하여 작성하는 방법이 있었다. 문제점은 PC에 Excel이 설치되어야 한다는 점인데, 이는 결국 파트비용의 증가이다. (Excel S/W 비용)

그리하여 Excel의 수요를 CSV파일로 양해를 구하였다. CSV파일은 Comma Separated Values 라는 뜻이고 일반 텍스트 파일에 ,를 사용하여 Excel 형식의 데이터를 보여준다. CSV파일의 장점은 추가 프로그램 설치없이 엑셀형태의 데이터를 볼 수 있지만, 단점으로는 양식이나 수식같은 특수 양식을 표현하지 못한다.

Open XLXS 빌드

Excel Library 중에 최근까지도 커밋이 되고 있는 라이브러를 사용해보았다.
https://github.com/troldal/OpenXLSX

여느 라이브러리가 그렇듯이 Master를 다운로드 받아서 CMake로 빌드하여 사용하면 된다.

※ CMake로 만들고 나서 Visual Studio로 빌드를 하면 “set local”로 시작하는 에러 메시지가 나올 때가 있는데, 이때는 Visual Studio를 관리자 권한으로 실행하여 빌드하면 된다. 해당 메시지의 이유는 win 10부터 강화된 보안 정책의 일환으로 C드라이브에 파일을 읽거나 쓸 때 관리자 권한이 필요하기 때문이다. (Open XLXS는 C:\Program Files(x86)\OpenXLXS\ 에 빌드 결과가 복사된다.)

사용법

  • Include
    
    #include "OpenXLSX.hpp"

    #ifdef _DEBUG
      #pragma comment(lib, "OpenXLSXd.lib")
    #else
      #pragma comment(lib, "OpenXLSX.lib")
    #endif
    
  
  • File Create 및 데이터 삽입.
    
    OpenXLSX::XLDocument doc{};
    doc.create("./test.xlsx", OpenXLSX::XLForceOverwrite);
    OpenXLSX::XLWorksheet wks = doc.workbook().worksheet(1);

    // 특정 셀에 데이터 삽입.  
    // 셀 이름으로 접근.  
    wks.cell("A1") = "Data";  
    // 셀 위치로 접근.  
    const auto row = 1;  
    const auto col = 1;  
    wks.cell(row,col).value() = "Data";  
  
    // 셀병합  
    wks.mergeCells("A1:A2");  

    doc.save();  
    doc.close();  
    
  
  • 양식
    
    OpenXLSX::XLDocument doc{};  
  
    doc.create("./test.xlsx", OpenXLSX::XLForceOverwrite);  
    OpenXLSX::XLWorksheet wks = doc.workbook().worksheet(1);  
    // Border 객체 얻기  
    OpenXLSX::XLBorders& borders = doc.styles().borders();  
    // CellFormat 객체 얻기  
    OpenXLSX::XLCellFormats& cellFormats = doc.styles().cellFormats();   
    // Font 객체 얻기  
    OpenXLSX::XLFonts& fonts = doc.styles().fonts();  
    
    // A1 Cell의 포멧 받아오기.
    auto newCellFormat = cellFormats.create(cellFormats[wks.cell("A1").cellFormat()]);  

    // Cell Alignment 설정.
    cellFormats[newCellFormat].alignment(OpenXLSX::XLCreateIfMissing).setHorizontal(OpenXLSX::XLAlignCenter);  
    cellFormats[newCellFormat].alignment(OpenXLSX::XLCreateIfMissing).setVertical(OpenXLSX::XLAlignCenter);  
  
    // 새로운 font는 Create로 생성.
    auto fontBold = fonts.create();  
    // font style 설정.  
    fonts[fontBold].setBold();  
    // font style을 Cell Format에 설정.  
    cellFormats[newCellFormat].setFontIndex(fontBold);  

    // 새로운 Border는 Create로 생성.  
    auto borderFormat = borders.create();  
    // border style 설정.  
    borders[borderFormat].setLeft(OpenXLSX::XLLineStyleThin, OpenXLSX::XLColor("ff000000"));  
    borders[borderFormat].setRight(OpenXLSX::XLLineStyleThin, OpenXLSX::XLColor("ff000000"));  
    borders[borderFormat].setTop(OpenXLSX::XLLineStyleThin, OpenXLSX::XLColor("ff000000"));  
    borders[borderFormat].setBottom(OpenXLSX::XLLineStyleThin, OpenXLSX::XLColor("ff000000"));  
    // Cell Format에 Border 설정.  
    cellFormats[newCellFormat].setBorderIndex(borderFormat);  
      
    // 설정된 스타일 적용.  
    wks.cell("A1").setCellFormat(newCellFormat);  
    wks.cell("A2").setCellFormat(newCellFormat); // 여러 셀에 적용 가능.  
    wks.cell("A3").setCellFormat(newCellFormat); // 여러 셀에 적용 가능.  
      
    doc.save();  
    doc.close();