VisualforceでCSVファイルとExcelファイルを出力するには

今回は、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ファイル

test1.xlsをダウンロード

○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ファイル

test.xmlをダウンロード

コメント(0)