Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@k-o

VF帳票出力Tips Word編

VF で Word ファイルを出力する方法をかんたんにまとめました。

VF で Word ファイルを出力する

Salesforce で Word ファイルを出力したいという要望がごくたまにあると思います。

主な対応としては次の2通りがあります。

  • htmlを利用して拡張子.docファイルとして出力する(縦書きの出力不可)
  • VBScript と ActiveX を利用して、IE で Wordファイルを出力する(縦書きの出力可能)

上記以外の方法で Word ファイルを出力する方法を紹介します。

docxtemplater を利用する

ブラウザのみでも動作するので、Visualforce ページでも利用することが可能です。
以下の document サイトのサンプルをVF ページで実装してみました。
テンプレートとして利用する Word ファイルは静的リソースにアップしています。

以下はサンプルコードです。

<apex:page id="page" docType="html-5.0" standardStylesheets="false" showHeader="false" sidebar="false" applyBodyTag="false" applyHtmlTag="false">
<html>
    <script src="{!URLFOR($Resource.docxtemplater,'docxtemplater/js/docxtemplater-latest.min.js')}"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.6.1/jszip.min.js"></script>
    <script src="{!URLFOR($Resource.docxtemplater,'docxtemplater/js/file-saver.min.js')}"></script>
    <script src="{!URLFOR($Resource.docxtemplater,'docxtemplater/js/jszip-utils.js')}"></script>
    <script>
    function loadFile(url,callback){
        JSZipUtils.getBinaryContent(url,callback);
    }
    loadFile("https://c.ap4.visual.force.com/resource/1520307484000/tag_example",function(error,content){
        if (error) { throw error };
        var zip = new JSZip(content);
        var doc=new Docxtemplater().loadZip(zip)
        doc.setData({
            first_name: 'John太郎',
            last_name: 'Doe',
            phone: '0652455478',
            description: 'New Website'
        });

        try {
            // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
            doc.render()
        }
        catch (error) {
            var e = {
                message: error.message,
                name: error.name,
                stack: error.stack,
                properties: error.properties,
            }
            console.log(JSON.stringify({error: e}));
            // The error thrown here contains additional information when logged with JSON.stringify (it contains a property object).
            throw error;
        }

        var out=doc.getZip().generate({
            type:"blob",
            mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        }) //Output the document using Data-URI
        saveAs(out,"output.docx")
    })
    </script>
</html>
</apex:page>

docxtemplater で出来ること

  • マルチバイト文字(日本語)を利用することが可能
  • テンプレートファイルに画像を利用することが可能
  • 縦書きのレイアウトで出力することが可能

上記以外にもpptファイルに対応していたり、ループ処理でテーブルレイアウトの出力にも対応しているようです。

Salesforce の差し込み印刷の代わりに利用できるかもしれません。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?