본 포스트에서는 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개 까지 저장 가능한 컬렉션(리스트 등)을 여러개 정의하여,
각 리스트 순서대로 출력시키는 방법을 사용하고 있습니다만, 상당히 불편한 방법입니다.
(혹시 고수분들 중, 좋은 방법이 있다면 알려주시길 바랍니다.)
'Salesforce.com > Force.com' 카테고리의 다른 글
[SFDC] Visualforce 화면을 pdf로 표시하기 (0) | 2020.09.08 |
---|---|
[SFDC] Apex에서 Email 송신 (0) | 2020.08.29 |
[SFDC] Visualforce에서 Javascript 사용하기 (0) | 2020.08.21 |
[SFDC] Salesforce 기초5) Apex와 Visualforce 개발 연습 - 도서 관리 프로그램 ver2 (0) | 2020.07.20 |
[SFDC] Salesforce 기초4) Apex와 Visualforce 개발 연습 - 도서 관리 프로그램 (2) | 2020.07.02 |