VisualforceでExcelで開けるファイル(複数シート)を作成してダウンロードする方法
指示書を作成する際などにExcelで共有しないといけないというシチュエーションはそれなりにあると思います。
Salesforceには構造化されているデータが有るが、例えばリードと取引先担当者に散っていて、一つのレポートでは出力出来なかったり、一つのレポートでデータリストは出力できるものの、それを適宜フィルタ処理をして別々のシートにリストを記載したり、はたまたそのデータリストを集計するテーブルを別シートに設けたり。
処理が複雑になればなるほどミスが発生しやすくなるので、直接Excelファイルを出力したいと思うことはあるのではないでしょうか。
こんな方法があるとは知らずに手作業していたのですが、感動しました。おすすめです。
OPEN XML形式でファイルを出力すればExcelで読み込むことが出来る
参照:VisualforceでCSVファイルとExcelファイルを出力するには
Visualforce page
[code]
<apex:page controller="使用するコントローラー名" showHeader="false" sidebar="false" readOnly="true" contentType="text/xml#ファイル名.xml;charset=UTF-8">
<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="シート名"><!-- ここからシート内部のデータを書く -->
<Table>
<Column ss:Index="1" ss:AutoFitWidth="0" ss:Width="110"/>
<Row ss:AutoFitHeight="0">
<Cell ss:MergeAcross = "6"><Data ss:Type="String">7個のセルを結合する</Data></Cell><!-- ss:MergeAcrossは、そのセルと右側いくつ分をマージするか -->
<Cell><Data ss:Type="String">テキストの場合はtypeをStringに</Data></Cell>
<Cell><Data ss:Type="Number">数字の場合はtypeをNumberに</Data></Cell>
</Row>
</Table>
</Worksheet>
<Worksheet ss:Name="複数のシートを出力する場合はここに書き連ねる"><!-- ここからシート内部のデータを書く -->
</Worksheet>
</Workbook>
</apex:page>
[/code]
Workbook > Worksheet > Table > Row > Cell
という階層構造になってます。
apex
[code]
public with sharing class 使用するコントローラー名 {
public String getXmlVer() {
return '<?xml version="1.0"?>' + '\r\n';
}
public String getXmlApp() {
return '<?mso-application progid="Excel.Sheet"?>' + '\r\n';
}
}
[/code]
ファイルのダウンロード
ファイルのダウンロードは
https://yourNameSpace.lightning.force.com/apex/yourVisualforcePageName
にアクセスすれば、xmlファイルがダウンロードされるので、それをExcelで開けばOKです。
Excelでファイルが開けない場合
恐らくシンタックスエラーが出てると思いますので、xmlファイルをテキストエディタ等で開いて、適切な形に直しましょう。