[Nexacro N] 엑셀 내보내기·가져오기

Nexacro N에서 Grid와 Dataset의 데이터를 엑셀로 내보내는 exportExcel 패턴, 엑셀 파일을 업로드해 Dataset으로 가져오는 Import 패턴, 서버 파싱 연동 방법을 설명합니다.

· 5 min read · PALDYN Team

지난 글에서 파일 업로드의 서버 측 처리 방법을 살펴보았다. 업무 시스템에서 엑셀은 거의 필수 기능이다. 조회 결과를 엑셀로 저장하거나, 엑셀 양식에 입력한 데이터를 시스템으로 업로드하는 요구는 어느 프로젝트에나 있다. Nexacro N은 이 두 방향 모두를 지원한다.

엑셀 내보내기 기본

Nexacro N에서 엑셀 내보내기는 ExcelExportObject를 생성하고 nexacro.exportObject()를 호출하는 방식이다.

function fn_exportExcel() {
    var oExcel = new ExcelExportObject();
    oExcel.addObject("Sheet1", this.grdMain);
    oExcel.fileName = "매출현황_" + gfn_getToday() + ".xlsx";
    nexacro.exportObject(oExcel);
}

addObject(시트명, 대상객체) 메서드에 Grid 또는 Dataset을 전달한다. Grid를 사용하면 컬럼 헤더가 자동으로 포함되고, 셀 너비도 Grid 컬럼 너비를 따른다.

엑셀 내보내기·가져오기 흐름

Grid vs Dataset 내보내기 차이

구분Grid 내보내기Dataset 내보내기
헤더Grid 컬럼 헤더 자동 포함Dataset 컬럼명(영문)
숨김 컬럼제외 가능모든 컬럼 포함
서식Grid 셀 서식 반영기본 서식
사용 목적화면 출력용 엑셀데이터 원본 저장

Grid 내보내기가 일반적으로 사용자에게 더 친화적인 엑셀을 만들어 준다. 한글 헤더와 화면 표시 형식이 그대로 반영되기 때문이다.

엑셀 내보내기 코드

다중 시트 내보내기

한 파일에 여러 시트를 생성할 수 있다.

function fn_exportMultiSheet() {
    var oExcel = new ExcelExportObject();
    oExcel.addObject("매출현황",  this.grdSales);
    oExcel.addObject("재고현황",  this.grdStock);
    oExcel.addObject("원본데이터", this.dsRaw);
    oExcel.fileName = "종합보고서_" + gfn_getToday() + ".xlsx";
    nexacro.exportObject(oExcel);
}

addObject()를 여러 번 호출하면 시트 순서대로 추가된다.

내보내기 옵션

ExcelExportObject에는 몇 가지 옵션 속성이 있다.

var oExcel = new ExcelExportObject();
oExcel.addObject("Sheet1", this.grdMain);
oExcel.fileName       = "export.xlsx";
oExcel.exporttype     = "xls";     // xls 또는 xlsx (기본 xlsx)
oExcel.headerdisplay  = true;      // 헤더 표시 여부
nexacro.exportObject(oExcel);

headerdisplay = false로 헤더 행 없이 데이터만 내보낼 수도 있다.

엑셀 가져오기 패턴

엑셀 파일을 시스템으로 가져오는 Import는 두 단계로 진행된다. 먼저 FileUpload.xlsx 파일을 서버에 전송하고, 서버에서 파싱한 결과를 Dataset으로 받는다.

// 1단계: 엑셀 파일 업로드
function btn_import_onclick(obj, e) {
    if (this.fileUpload.getFileCount() == 0) {
        this.gfn_alert("가져올 엑셀 파일을 선택해 주세요.");
        return;
    }
    this.fileUpload.uploadURL = "/excel/parse";
    this.fileUpload.upload();
}

// 2단계: 파싱 결과 Dataset 로드
function fileUpload_onuploadcompleted(obj, e) {
    if (e.errcode != 0) {
        this.gfn_alert("파일 처리 실패: " + e.errmsg);
        return;
    }
    // 서버가 Nexacro Dataset XML 형식으로 응답
    this.dsImport.loadXML(e.responsedata);
    this.gfn_alert(this.dsImport.rowcount + "건을 가져왔습니다.");
}

서버 엑셀 파싱 (Spring Boot + POI)

서버에서 Apache POI로 엑셀을 파싱해 Nexacro Dataset XML 형식으로 응답한다.

@PostMapping("/excel/parse")
public ResponseEntity<String> parseExcel(
        @RequestParam("file") MultipartFile file) throws Exception {

    Workbook wb    = WorkbookFactory.create(file.getInputStream());
    Sheet    sheet = wb.getSheetAt(0);

    StringBuilder sb = new StringBuilder();
    sb.append("<Root><Parameters>");
    // 첫 행을 헤더로 사용해 컬럼 정의
    Row header = sheet.getRow(0);
    for (Cell c : header) {
        sb.append("<Parameter id=\"").append(c.getStringCellValue())
          .append("\" type=\"STRING\"/>");
    }
    sb.append("</Parameters><Rows>");
    for (int i = 1; i <= sheet.getLastRowNum(); i++) {
        Row row = sheet.getRow(i);
        if (row == null) continue;
        sb.append("<Row>");
        for (Cell c : row) {
            sb.append("<Col id=\"")
              .append(header.getCell(c.getColumnIndex()).getStringCellValue())
              .append("\">").append(getCellValue(c)).append("</Col>");
        }
        sb.append("</Row>");
    }
    sb.append("</Rows></Root>");

    return ResponseEntity.ok()
        .contentType(MediaType.TEXT_XML)
        .body(sb.toString());
}

가져오기 데이터 검증

Dataset으로 가져온 데이터를 Grid에 표시한 뒤 사용자가 확인하고 저장하는 2단계 방식이 실무 표준이다.

// 가져온 데이터 저장
function btn_save_onclick(obj, e) {
    // 먼저 필수 항목 검증
    for (var i = 0; i < this.dsImport.rowcount; i++) {
        var sCode = this.dsImport.getColumn(i, "ITEM_CD");
        if (!sCode || sCode.trim() == "") {
            this.gfn_alert((i + 1) + "행: 품목코드가 없습니다.");
            return;
        }
    }
    this.transaction("saveBulk", "/bulk/save", this.dsImport, null,
        "", "fn_saveCallback");
}

정리

엑셀 내보내기는 ExcelExportObject.addObject() + nexacro.exportObject()로 클라이언트에서 직접 처리한다. 엑셀 가져오기는 FileUpload로 서버에 전송 → 서버 POI 파싱 → Dataset XML 응답 → loadXML()로 로드하는 서버 파싱 방식이 필요하다. Grid를 통한 사전 검증 후 저장 트랜잭션을 호출하는 2단계 패턴이 데이터 품질을 보장한다.


지난 글: 파일 서버 처리

다음 글: 엑셀 템플릿


읽어주셔서 감사합니다. 😊