私が使用していますjackson-dataformat-csv
次のようにCSVにPOJOのコレクションをエクスポートします:
CsvSchema.Builder schemaBuilder = CsvSchema.builder()
.addColumn("id")
.addColumn("name")
etc...
CsvSchema schema = schemaBuilder.build().withHeader();
CsvMapper mapper = new CsvMapper();
mapper.enable(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS);
String csv = mapper.writer(schema).writeValueAsString(pojoCollection);
私はそれをCSVに書き込まれる前にすべてのフィールドの値を検査し、必要に応じてExcelは、シート、などが実行可能性があることを数式やその他のコンテンツを防ぐために、その値を変更したいです。たとえば、値がで始まる場合@
や=
、私が先頭に追加可能性がある'
実行を防ぐために、その値に文字を。
どのようにして設定することができCsvMapper
、私はCSVに書き込まれた値ごとにコールバックを取得するように?
両方CsvGenerator
とCsvEncoder
、CSV出力の値を処理するジョブを実行され、コールバックオプションを含めていないように見えます。だから私は、目標は、ジャクソンで達成可能ではないと思われます。
しかし、もちろん、この作業は他のアプローチを通じて解決することができます。
他のライブラリを使用せずに、pojoCollection
文字列フィールドを消毒する目的で前処理することができます。これらのPOJOの実際の構造を知らない、選択肢は次のようになります。
POJOのは、コンパクトであり、プロセスへのフィールドはよく知られている場合は、引数としてPOJOのそれぞれのゲッターとセッターへの参照を期待メソッドを作成し、値を取得するためにゲッターを呼び出し、サニタイズそれとクリーンな値を設定します。以上のループ
pojoCollection
それらをすべて処理します。文字列フィールドが多数あるとPOJOは、さまざまな種類のものであり、彼らはすべての必要性をクリーニングする場合は、使用リフレクションは、大規模、すべての文字列フィールドを処理します。
あなたはジャクソンを使用するように制約されていない場合は、コールバックを使用する可能性を提供するライブラリがあります。例えば、内Univocityパーサー、ObjectRowWriterProcessorは、複数の変換の可能性との組み合わせで、それを達成することを可能にします。