본 포스트에서는 Visualforce를 통한 csv파일 출력 방법에 대해 알아보겠습니다.

 

csv에 출력할 내용은 Apex 컨트롤러에서 작성하고, csv 출력 기능은 Visualforce 에서 템플릿을 작성합니다.


Apex 코드

/**
 * @description csv 출력 컨트롤러
 */
public with sharing class CntrlCsvDownload {

    // 개행 코드
    final String CSV_LINEFEED = '\r\n';

    /**
     * @description csv 출력 관련 변수
     */
    public String csvFileName { get ; set; }    // csv파일명
    public String csvHeader { get; set; }       // csv헤더
    public List<String> csvBodyList { get; set; }  // csv본문

    /**
     * @description 생성자
     */
    public CntrlCsvDownload() {

        csvBodyList = new List<String>();
    }

    /**
     * @description csv 출력
     */
    public PageReference exportToCsv() {

        // 파일명 : Member[년월일].csv
        csvFileName = 'Member' + Datetime.now().format('yyyyMMdd') + '.csv';

        // csv헤더 설정
        csvHeader = '회원번호,회원명,회원등록일,전화번호,이메일주소' + CSV_LINEFEED;

        // 회원 레코드 습득
        List<Member__c> memberList = [SELECT Id, Name, MemberNo__c, RegistDate__c, Phone__c, Email__c FROM Member__c];

        for (Member__c member : memberList) {

            // csv 본문 생성
            String body = convertNullToBlank(member.MemberNo__c)
                            + ',' + convertNullToBlank(member.Name)
                            + ',' + convertNullToBlank(member.RegistDate__c)
                            + ',' + convertNullToBlank(member.Phone__c)
                            + ',' + convertNullToBlank(member.Email__c);

            // csv 본문에서 행의 마지막에 개행코드를 추가(행 구분)
            body += CSV_LINEFEED;

            // csv 출력에 사용할 본문 리스트에 추가
            csvBodyList.add(body);
        }

        // csv 출력 템플릿 페이지 호출
        return Page.ExportToCsvTemplate.setRedirect(false);
    }

    /**
     * @description csv본문 출력시, null을 공백문자로 표시하기 위해 치환
     * @param str 확인할 문자열
     * @return 공백 또는 문자열
     */
    private String convertNullToBlank(String str) {

        return (String.isBlank(str)) ? '' : str;
    }

    /**
     * @description csv본문 출력시, null을 공백문자로 표시하기 위해 치환
     * @param dt 확인할 날짜 변수
     * @return 공백 또는 날짜
     */
    private String convertNullToBlank(Date dt) {

        // 날짜(년월일) 또는 공백
        // String.leftPad(prm1: 문자수, prm2: 남은 문자수가 빈칸인 경우, 채워 넣을 지정 문자)
        return (dt == null) ? '' : String.valueOf(dt.year()) + String.valueOf(dt.month()).leftPad(2, '0') + String.valueOf(dt.day()).leftPad(2, '0');
    }
}

 

Visualforce 페이지

<apex:page controller="CntrlCsvDownload" sidebar="false">
    <apex:form id="form">
        <apex:pageBlock title="CSV출력">
            <!-- CSV 출력 실행 버튼 -->
            <apex:commandButton value="CSV출력" action="{!exportToCsv}"/>
        </apex:pageBlock>
    </apex:form>
</apex:page>

 

Visualforce 페이지(csv 출력 템플릿)

<apex:page controller="CntrlCsvDownload" cache="true" contentType="text/csv#{!csvFileName};charset=UTF-8">
    <!-- csv헤더(첫번째 행) -->
    <apex:outputText value="{!csvHeader}"/>

    <!-- csv 본문을 1행씩 출력 -->
    <!-- apex:repeat : List를 1개의 요소씩 반복 -->
    <apex:repeat value="{!csvBodyList}" var="body">
        <apex:outputText value="{!body}"/>
    </apex:repeat>
</apex:page>

 

☞ 실행 결과

 


이상으로 Visualforce을 통해 csv 파일을 출력하는 방법을 알아 보았습니다.

 

이렇게 해서 간편하게 csv 파일을 출력할 수 있지만, 문제가 되는 부분이 있습니다.

Gorvoner Limits 중, "1개의 컬렉션에 1000개 까지 출력 가능" 이라는 제한이 있기 때문에,

csv 본문을 표시할 때 리스트 내에 요소가 1000개 이상이 되는 경우 예외가 발생하게 됩니다.

 

본인은 지금까지 이 방법을 회피하기 위해서 1000개 까지 저장 가능한 컬렉션(리스트 등)을 여러개 정의하여,

각 리스트 순서대로 출력시키는 방법을 사용하고 있습니다만, 상당히 불편한 방법입니다.

(혹시 고수분들 중, 좋은 방법이 있다면 알려주시길 바랍니다.)

 

+ Recent posts