0

JSFを使用してオンザフライ/ランタイムでCSVファイルを生成しています。コードは次のとおりです。

FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = HttpServletResponse)context.getExternalContext().getResponse();

int read = 0;
byte[] bytes = new byte[1024];

response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");

ServletOutputStream os = null;

StringBuffer stringBuffer1 = new StringBuffer("");

stringBuffer1.append("Disconnect Time");
stringBuffer1.append(',');
stringBuffer1.append("Calling Number");

stringBuffer1.append("01/06/2010 01:00:35 AM");
stringBuffer1.append(", ");
stringBuffer1.append("447744369900");


ByteArrayInputStream bis1;
try {
    bis1 = new ByteArrayInputStream(stringBuffer1.toString().getBytes("UTF-8"));

    os = response.getOutputStream();

    while ((read = bis1.read(bytes)) != -1) {
        os.write(bytes, 0, read);
    }

    os.flush();
    os.close();
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

FacesContext.getCurrentInstance().responseComplete();

以下は開いたときのファイルの内容です

Disconnect Time Calling Number
1/6/2010 1:00   4.47744E+11

実際に期待される結果は、AM/PMと完全な長さの数値を含む完全な日付形式になります。

Excel CSVの二重引用符の例をすでに試しました-数値セル形式とその他の空白スペースの追加の例ですが、機能しませんでした。また、ユーザーは数値列に対して算術演算を実行します。

前もって感謝します。

4

6 に答える 6

1

私は JSF の専門家ではありませんが、これは Excel がこの情報を読み取る方法に完全に関連しているようです。

データを少しいじってみましたが、CSV でやりたいことを実行できませんでした。

この内容のサンプル CSV ファイルを作成しました (Nopepad++ を使用):

Disconnect Time, Calling Number
01/06/2010 01:00:35 AM,447744369900

そして、Excelを使用して表示すると、あなたが得たのと同じ出力が得られたので、あなたが直面している質問は、JSFではなく、ExcelでCSVを表示することに関連しています。

于 2012-09-09T10:51:36.970 に答える
1

ファイルを動的に生成していると述べました。dataTable からデータをエクスポートする場合は、PrimeFaces のp:dataExporterコンポーネントの使用を検討することをお勧めします (ただし、 p:dataTableを使用する必要があります)。データテーブルの正しい構造に既にある場合は、プログラムで Excel ファイルを作成する手間を省くことができます。

次に、 p:dataExporter をリンクにアタッチし、それを dataTable (tblこの場合) にポイントするのと同じくらい簡単です。

<h:commandLink>  
    <p:graphicImage value="/images/excel.png" />  
    <p:dataExporter type="xls" target="tbl" fileName="cars" />  
</h:commandLink>

ちなみに、CSVとPDFもサポートしています。

于 2012-09-19T22:39:16.080 に答える
0

CSV を Excel で開いた後、「発信者番号」セルの形式を数値として変更できます。列を選択 -> セルの書式設定 -> 数値に変更

于 2012-09-09T14:55:07.853 に答える
0

RonK そうですね。CSV ファイルを使用する場合、データの書式設定方法を Excel に指示する方法はありません。Excel は、CSV 列のデータが何であるかについて最善の推測を使用し、その種類のデータに既定の形式を適用します。
Excel に正しいデータが残っている可能性が非常に高く (つまり、時間列の秒数がまだ残っている)、これは Excel での書式設定の問題にすぎません。
Excel で別の形式を適用しようとしましたか?

Excel でデータを正しくフォーマットする方法をユーザーに伝えるか、直接 ( Apache POIを使用して) Excel ファイルを作成し、その方法で正しいフォーマットを適用する必要があります。

于 2012-09-09T11:16:15.660 に答える
0

CSV で日付と数値の正しい形式を表示するために、=("447744369900") アプローチを使用しました。欠点は、セルに対して算術演算を実行できないことです。RonK と Turismo と議論したように、Excel ファイルの形式を定義し、CSV の代わりに XLS ファイルを作成できる Apache Excel ライブラリに移行しました。CSV より少し遅いですが、私の要件を満たしています。Java を使用して巨大な Excel ファイルを書き込む API を参照してください。

RonKとTurismoに感謝します

于 2012-09-09T13:26:30.477 に答える
0

申し訳ありませんが、Excel のバグ ("feature"、"deficit") のようです。

数値のように見えるものはすべて数値であると想定します (そして、それを読み取ると精度が失われます)。

おそらく最も簡単な方法は、電話番号が数字のように見えないようにすることです。たとえば、(および類似の文字を含めることによって。

Excel'=123+456では、方程式を計算させたくない場合は、書くことが期待される場合があることを思い出してください。これも試してみてください。

日付はおそらくフォーマットだけです。秒を含むように列をフォーマットしてみてください。

于 2012-09-09T12:54:44.270 に答える