2012-07-25

Force.com : VF 画面から CSV ファイルをアップロードし、内容を画面に表示したい (ファイル文字コード UTF-8 編)


VF 画面から CSV ファイルをアップロードし、内容を画面に表示したい (※ ファイル文字コード UTF-8)



● あらすじ

とある仕様で VF 画面から CSV ファイルをアップロードして、内容をオブジェクトに insert する必要が出たため。
因みに、内容を画面に表示させる必要はない。
(最近、そこまでやるならもう Force.com じゃなくてもいいじゃないか、とか思い始めている ... ;-(。



○ 要件

  • CSV のみアップロードを可能とする
  • アップロードするファイルの文字コードは UTF-8 とする
  • アップロードするファイルの改行コードは \r\n とする



○ Apex クラス : ImportController

■ UTF-8 用
public class ImportController {

    public Attachment d { get; set; }

    public String filename { get; set; }

    public List<List<String>> rows { get; set; }

    public ImportController() {
        if(d == null) {
            d = new Attachment();
        }
    }

    public PageReference read() {
        if(d == null || d.Name == null) {
            return null;
        }

        filename = d.Name;

        // UTF-8 用(1byte 文字のみのであれば可) //
        Blob data = d.Body;
        String body = data.toString();

        List<String> lines = body.split('\r\n');    // ※ System.LimitException: Regex too complicated 発生の可能性あり ※ //
        rows = new List<List<String>>();
        for(String line : lines) {
            if(line.startsWith('"')) line = line.substring(1);
            if(line.endsWith('"')) line = line.substring(0, line.length()-1);
            rows.add(line.split('","', -1));
        }

        return null;
    }
}

※ Attachment ではなく Document にする場合
public class ImportController {

    public Document d { get; set; }

        :

    public ImportController() {
        if(d == null) {
            d = new Document();
            d.folderid = UserInfo.getUserId();
        }
    }

        :
}
且つ、プロファイルにてドキュメントのオブジェクト権限が「参照」「作成」以上であること



○ Visualforce : Import

<apex:page controller="ImportController">
<script type="text/javascript">
    function getExtention(fileName) {
        if (!fileName) {
            return "";
        }
        var fileTypes = fileName.split(".");
        if (fileTypes.length === 0) {
            return "";
        }
        return fileTypes[fileTypes.length - 1];
    }
    function isCsvFile(file) {
        var extention = getExtention(file.name);
        if (extention.toLowerCase() === "csv") {
            return true;
        } else {
            alert("CSVファイルを設定してください.");
            return false;
        }
    }
    function getFile(frm) {
        return frm.elements[2].files[0];
    }
</script>

    <apex:messages />
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockButtons >
                <apex:commandButton value="read" action="{!read}" onclick="return (isCsvFile(getFile(this.form)));" />
            </apex:pageBlockButtons>
            <apex:pageBlockSection >
                <apex:outputPanel >
                    <apex:outputText value="file: " /><apex:inputFile value="{!d.body}" filename="{!d.name}" />
                </apex:outputPanel>
            </apex:pageBlockSection>
        </apex:pageBlock>
        <apex:pageBlock rendered="{!NOT(ISNULL(rows))}">
            <apex:outputText value="{!filename}" />
            <table>
                <apex:repeat value="{!rows}" var="row">
                <tr>
                    <apex:repeat value="{!row}" var="col">
                    <td style="width:80px;"><apex:outputText value="{!col}" /></td>
                    </apex:repeat>
                </tr>
                </apex:repeat>
            </table>
        </apex:pageBlock>
    </apex:form>
</apex:page>



◇ 環境

  • Salesforce - Developer Edition - API バージョン 25.0



◇ 参考


0 件のコメント:

コメントを投稿