VisualforceでExcelで開けるファイル(複数シート)を作成してダウンロードする方法

   

指示書を作成する際などにExcelで共有しないといけないというシチュエーションはそれなりにあると思います。

Salesforceには構造化されているデータが有るが、例えばリードと取引先担当者に散っていて、一つのレポートでは出力出来なかったり、一つのレポートでデータリストは出力できるものの、それを適宜フィルタ処理をして別々のシートにリストを記載したり、はたまたそのデータリストを集計するテーブルを別シートに設けたり。

処理が複雑になればなるほどミスが発生しやすくなるので、直接Excelファイルを出力したいと思うことはあるのではないでしょうか。

こんな方法があるとは知らずに手作業していたのですが、感動しました。おすすめです。

OPEN XML形式でファイルを出力すればExcelで読み込むことが出来る

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

Visualforce page

<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>

Workbook > Worksheet > Table > Row > Cell
という階層構造になってます。

apex

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';
    }
}

ファイルのダウンロード

ファイルのダウンロードは
https://yourNameSpace.lightning.force.com/apex/yourVisualforcePageName
にアクセスすれば、xmlファイルがダウンロードされるので、それをExcelで開けばOKです。

Excelでファイルが開けない場合

恐らくシンタックスエラーが出てると思いますので、xmlファイルをテキストエディタ等で開いて、適切な形に直しましょう。

おすすめ記事一覧

 - Salesforce