今回は、VisualforceでCSVファイルとExcelファイルを出力する方法をご紹介。
○CSVファイル
CSVファイルを出力するには、↓のように、pageタグのcontentTypeに「application/vnd.ms-excel」を指定します。contentTypeに「#<ファイル名>」と記述することで、ファイル名を指定できます。後は、カンマ区切りでヘッダ及びデータを出力するだけです。
・Visualforceページ
<apex:page contentType="application/vnd.ms-excel;charset=Windows-31J;#test.csv" controller="CsvController"> <apex:outputText escape="true" value="{!csvHeader}" /> <apex:repeat value="{!recordList}" var="record" id="csvList">{!record}</apex:repeat> </apex:page>
○Excelファイル(表だけの場合)
Excelファイルに表を出力するには、↓のように、pageタグのcontentTypeに「application/vnd.ms-excel」を指定します。後は普通にHTMLで表を出力すればOKです。表は<table>タグで書いても、<apex:pageBlockTable>タグで書いても構いません。
・Visualforceページ 例1
<apex:page contenttype="application/vnd.ms-excel;charset=Windows-31J#test1.xls" controller="ExcelController"> <table> <tr><td colspan="2">タイトル</td></tr> <tr><td>列1</td><td>列2</td></tr> </table> </apex:page>
・Visualforceページ 例2
<apex:page contenttype="application/vnd.ms-excel;charset=Windows-31J#test2.xls" controller="ExcelController"> <apex:pageBlock title="取引先責任者一覧"> <apex:pageBlockTable value="{!account.Contacts}" var="item"> <apex:column value="{!item.LastName}"/> <apex:column value="{!item.FirstName}"/> </apex:pageBlockTable> </apex:pageBlock> </apex:page>
・出力されるExcelファイル
○Excelファイル(表以外にも細かく指定したい場合)
複数のシートを出力したい、印刷範囲を指定して出力したいなど、表だけではなく、少し凝ったExcelファイルを出力したい場合は、Offirce2007以降で採用されているOpen XMLファイル形式で出力します(Office2003以前では開けないので注意!)。
Open XMLファイルで出力するには、↓のように、pageタグのcontentTypeに「text/xml」を指定し、Open XMLファイル形式に則って記述します(Visualforceページの2~3行目のXMLバージョンとMSO アプリケーションの部分は、Visualforceページの構文の都合上、Visualforceページに直接書けないため、コントローラに記載しています)。同様の方法で、Wordファイルも出力可能です。
・Visualforceページ
<apex:page contenttype="text/xml;charset=UTF-8#test.xml" controller="Excel2Controller"> <apex:outputText escape="true" value="{!xmlVer}" /> <apex:outputText escape="true" value="{!xmlApp}" /> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="4" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5"> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">表1</Data></Cell> <Cell><Data ss:Type="String"></Data></Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">列1</Data></Cell> <Cell><Data ss:Type="String">列2</Data></Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">あ</Data></Cell> <Cell><Data ss:Type="String">A</Data></Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">い</Data></Cell> <Cell><Data ss:Type="String">B</Data></Cell> </Row> </Table> </Worksheet> <Worksheet ss:Name="Sheet2"> <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="4" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5"> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">表2</Data></Cell> <Cell><Data ss:Type="String"></Data></Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">列1</Data></Cell> <Cell><Data ss:Type="String">列2</Data></Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">ア</Data></Cell> <Cell><Data ss:Type="String">a</Data></Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell><Data ss:Type="String">イ</Data></Cell> <Cell><Data ss:Type="String">b</Data></Cell> </Row> </Table> </Worksheet> </Workbook> </apex:page>
・Apex(コントローラー)
public with sharing class Excel2Controller { public String getXmlVer() { return '<?xml version="1.0"?>' + '\r\n'; } public String getXmlApp() { return '<?mso-application progid="Excel.Sheet"?>' + '\r\n'; } }
・出力されるXMLファイル