いいね!数

0

閲覧数
443

POI4XPagesを使ってビューにある文書一覧の値をエクセルへ書き出す方法を試してみたのですが、

ビューにチェックボックスをつけて、チェックされた文書の値のみをエクセルに書き出す方法がわかりません。

チェックされた文書の値のみをPOI4XPagesでエクセルに書き出すすることは可能なのでしょうか?

可能でしたらどのように設定をすれば良いでしょうか?

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:Jun 7, 2016, 3:48:33 PM

回答・コメント

いいね!数

0

<追記>

以下の方法を試してみたのですが、ファイルのダウンロードはできても形式が違うと怒られて

エクセルで読みだすことができませんでした。使用したエクセルはExcel2010です。

setContentTypeの書き方に問題があると思い、ネットで検索したのですが、書き換え方がわかりませんでした。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.afterRenderResponse><![CDATA[#{javascript:
   var exCon = facesContext.getExternalContext();
   var writer = facesContext.getResponseWriter();
   var response = exCon.getResponse();

   response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
   response.setHeader("Cache-Control", "no-cache");
   response.addHeader("Content-Disposition", "inline; filename=dynamic.xlsx");
  writer.write("<table>\n");
   writer.write("<thead><tr>\n");
   writer.write("<td><b>申請日</b></td>");
   writer.write("<td><b>部門コード</b></td>");
   writer.write("<td><b>部署名</b></td>");
   writer.write("<td><b>申請者</b></td>");
   writer.write("<td><b>持帰り期間(From)</b></td>");
   writer.write("</tr></thead>\n");

//   var view:NotesView = database.getView("list");
//   var doc = view.getFirstDocument()
  var panel = getComponent("viewPanel1");
  var id_arr = panel.getSelectedIds();
  for(var docid in id_arr) {
    var doc = database.getDocumentByID(docid);

     var kanri_no = doc.getItemValueDate("Shinseibi");
     var group = doc.getItemValueString("ShinseisyaBuCode");
     var username = doc.getItemValueString("ShinseisyaBu");
     var os_name = doc.getItemValueString("ShinseisyaKJName");
     var hostname = doc.getItemValueDate("KikanFrom");

     writer.write("<tr>");
     writer.write("<td>" + kanri_no + "</td>");
     writer.write("<td>" + group + "</td>");
     writer.write("<td>" + username + "</td>");
     writer.write("<td>" + os_name + "</td>");
     writer.write("<td>" + hostname + "</td>");
     writer.write("</tr>\n");
     doc = view.getNextDocument(doc);
     doc.recycle();
     doc = tmp_doc
  
   }
   writer.write("</table>");
   writer.endDocument();
 }]]></xp:this.afterRenderResponse>
 </xp:view>

回答日時:Jun 7, 2016, 3:52:43 PM

いいね!数

0

コメントの内容は、文字列で HTMLのtableタグを出力しているだけなので、content-typeをエクセルにしたところで、エクセル形式に勝手に変換されるわけではありません。

content-typeはあくまでの、クライアントにこういうデータで送るよ、と宣言するだけなので、サーバーの動作が変わるわけではないです。

選択した文書のみをエクセルに出力するには、POI4XPagesのプロパティで、dataSource を dominoViewSource ではなく、ListObjectDataSource を選択してください。

そして、その buildValues に、エクセルに出力したいデータを JavaScriptのオブジェクトの配列として、返すようにコーディングします。

回答日時:Jun 8, 2016, 9:11:46 AM

いいね!数

0

EBIHARA Kenjiさん、

ご回答ありがとうございます!

以下の式をbuildValuesに書いてみました。

var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
var entryItems = [];
for(var docid in id_arr) {
    var doc = database.getDocumentByID(docid);
    var item = [
    @Text(doc.getItemValue("Shinseibi"), "S0D0"),
    doc.getItemValue("bu")
    ];
    entryItems.push(item);
    doc.remove(true);
  }
return entryItems;

 

そして、columnsのconputeValueに以下を書きました。

entryItems[0];

エクセルはダウンロードされるのですが、何も書き出されていませんでした。

いまいちPOI4XPagesがわかっていないのですが、どこが間違っておりますでしょうか?

回答日時:Jun 8, 2016, 10:38:06 AM

いいね!数

0

チェックをし忘れていました(汗)

以下の値が書き出されました。

[2016/06/03, [0000], null]

配列の書き方が問題なのだと思うのですが、何をどう間違っているのか

わかりません・・・。

初心者的な質問で申し訳ないです。

今度はbuildVauesの式を以下に書き換えてみました。

var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
for(var docid in id_arr) {
    var doc = database.getDocumentByID(docid);
    var item = [
    @Text(doc.getItemValue("Shinseibi"), "S0D0"),
    doc.getItemValueString("ShinseisyaBuCode"),
    doc.getItemValueString("ShinseisyaBu")
    doc.getItemValueString("ShinseisyaKJName")        
    ];
    return item;
  }

今度は、各列に値は書き出されましたが、1文書チェックしてある状態でも

なぜかエクセルの4行分、同じ値が書き出されてしまいます。

回答日時:Jun 8, 2016, 3:04:22 PM

いいね!数

0

buildVauesの式を以下の式に書き換えたところ、なんとか書き出しができました。

var ret = new java.util.Vector();
var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
for(var docid in id_arr) {
    var doc = database.getDocumentByID(docid);
    var item = {
    shinseibi:@Text(doc.getItemValue("Shinseibi"), "S0D0"),
    BuCode:doc.getItemValueString("ShinseisyaBuCode"),
    Bu:doc.getItemValueString("ShinseisyaBu"),
    KJName:doc.getItemValueString("ShinseisyaKJName")        
}
    ret.add(item)
  }
    return ret;

columnsのconputeValueの式には以下を書いています。

entry.shinseibi;

 

ここでまた別の問題が出てきました。

一度、エクセル書き出しのボタンをクリックして書き出しを行った後、画面はそのままもう一度ボタンを

クリックしても何も動作しません。画面をリフレッシュするか別の画面に切り替えてまた戻ってボタンを

クリックすると動作します。2回連続で書き出しのボタンをクリックすると動作しないのはなぜでしょうか?

また回避する方法はあるでしょうか?

 

回答日時:Jun 8, 2016, 3:46:36 PM

いいね!数

0

2回以上連続で書き出しのボタンをクリックすると動作しない問題に関してはまだ

解決策が見つかっておりません。何もいじらず暫く時間を置くと再び動作するということがわかりました。

この問題以外に、表題の質問とはずれてしまうのですが、わからないところが2点あります。

②まず、以下のbuildVauesの式の中で、リッチテキストを書き出す方法がわかりません。

var ret = new java.util.Vector();
var panel = getComponent("viewPanel1");
var id_arr = panel.getSelectedIds();
for(var docid in id_arr) {
    var doc = database.getDocumentByID(docid);
    var item = {
    shinseibi:@Text(doc.getItemValue("Shinseibi"), "S0D0"),
    BuCode:doc.getItemValueString("ShinseisyaBuCode"),
    Bu:doc.getItemValueString("ShinseisyaBu"),
    KJName:doc.getItemValueString("ShinseisyaKJName")        
}
    ret.add(item)
  }
    return ret;

ここで、リッチテキストBodyを書き出すために以下の式を追加したのですが、書き出せるものと

書き出せないものが出てしまいます。

body:doc.getItemValue("Body")     

リッチテキストを書き出す方法はどのように書けばよいのでしょうか?

②ラジオボタングループの値を書き出すために以下の式を設定したのですが値がとれません。

    flg:doc.getItemValueString("Flg")

ラジオボタングループの値を取得するにはどうしたら良いでしょうか?

 

 

回答日時:Jun 9, 2016, 2:01:47 PM

いいね!数

0

②については解決しました。

どうも式をいじってる中でキャッシュが邪魔していたようで、ブラウザを再立ち上げしたら

さきほどの式で値がとれました。

①についてはXpages上でリッチテキストに書き込んだ情報をクライアントで文書プロパティから

値をのぞくと以下のようになっていました。


"Content-Type: text/html; charset="utf-8"

ノーツクライアント側でリッチテキストを書き込んだ場合は、body:doc.getItemValue("Body") で

値が取れるようです。Xpages上で書き込んだ情報を取得するにはどうしたら良い

でしょうか?

回答日時:Jun 9, 2016, 3:26:25 PM

いいね!数

0

①について、リッチテキストの内容をプレーンテキストで別フィールドに保存時に書き出し、

それを取得するようにしました。

プレーンテキストで書き出すときに、なぜか余分な改行が入ってしまうのですが、それで

不自由はないのでそのまま取得することで解決しました。

EBIHARA Kenjiさん、ありがとうございました。

回答日時:Jun 10, 2016, 10:05:44 AM