.docxドキュメント(Word 2010)のプレースホルダーをMySQLデータベースからのデータに置き換えるための最良のアプローチは何でしょうか?
サーバー側の言語を使用してファイルを開き、プレースホルダーごとに文字列を置き換えることはできますか?
利用可能な既存のツール/ライブラリはありますか?
ありがとう
**開示:私はdocx4jプロジェクトを主導しています**
利用可能な既存のツール/ライブラリのヒープがあります!
はい、文字列の置換を行うことができますが、Wordが文字列を実行間で分割している可能性があるため、これは脆弱なアプローチです。
MERGEFIELD、またはコンテンツ制御データバインディングを使用できます。
docx4jは3つのアプローチすべてをサポートしますが、コンテンツ制御データバインディングが最も強力です。
特に考慮すべきことの1つは、「リピート」です。MySQLテーブルの一致する行ごとに、Wordでテーブルの行を言いたい場合は、これを実現する方法が必要です。
docx4jは、テーブル行の周りの「繰り返し」コンテンツコントロールを使用してこれを行います。どちらのソリューションを選択しても、繰り返しを処理できることを事前に確認します。
開示:私はInvantiveで働いています。
Invantive Composition(http://www.invantive.com/products/invantive-composition)を使用すると、Wordドキュメント(レター、法的訴え、保険ポリシー)にデータベース(IBM DB2、Oracle、MySQL、Teradata、SQL)のデータを入力できます。サーバー)そして、手動で内容を自由に完全に変更します。これは、中央のWebサービスとクエリを使用したモデルを介してデータベースにアクセスする実際のMicrosoft Wordエンドユーザー(テンプレートを作成するユーザーとテンプレートを使用するユーザーの両方)を対象としています。Invantive Compositionを使用すると、データとレイアウトのネストされた繰り返しグループが可能になります。クリックワンスを使用してMicrosoftWordに統合します。
過去には、私は個人的にJasperReports(http://community.jaspersoft.com/project/jasperreports-library)を使用して、JasperReportsのRTF出力ターゲットを使用して文字を生成していました。これは無料で、出力を数語以上編集したくない場合、およびJava/SQL開発スキルを持っている限り正常に機能します。Invantive Compositionと同じように、多数の異なるレポートに対して正常に機能します。
環境を完全に制御できる限り、RTFを中間言語として使用することも検討できます(エンドユーザー向けではなく、実際の開発者のみ)。ドキュメントをRTFとして保存し、置き換え可能にする必要のあるテキストの一部を置き換え、パラメーターを受け入れて結果のRTFをダンプするWebサービスを作成します。より複雑なテーブルを生成するには時間がかかります(テーブルは、RTF仕様が作成された後、明らかに人類によって発明されたものです:-)このアプローチは、非常に限られた数のテンプレートでのみ機能し、開発者が十分な時間を利用できる場合にのみ機能します。実行され、安定しました。
独立したレビューアとして、XMLテンプレートが使用されたケースも見ましたが、結果はJasperReportsほど良くありませんでした。
PHPを使用したい場合、利用可能な最も完全なソリューションはPHPDocXです。
チュートリアルで、プレースホルダー変数を任意のデータソース(MySQL DBなど)からのデータで置き換える方法を確認できます。
特に、テーブルの行に不特定の数のエントリを入力したり、アプリケーションに供給されたデータに応じてWordドキュメントのブロック全体を削除したり、動的なWordチャートを作成したりできます。
利用可能なDEMOをチェックして、単純ですが非常にわかりやすい例を確認できます(その内部動作はチュートリアルセクションで説明されています)。
Open Open XML SDKを使用して、このようにプレースホルダーを置き換えることができます。
開示:私はdocxgenjsプロジェクトを主導しています
すべてを自分でコーディングする必要はないと思います。そのため、docx用にMustacheのようなテンプレートエンジンを作成しました。
デモ:
http://javascript-ninja.fr/docxgenjs/examples/demo.html
レポ
https://github.com/edi9999/docxgenjs
これはJSベースであり、クライアント側とサーバー側で機能します。
はい、サーバー側の言語を使用してそれを行うことができます。ApachePOIを確認してください。
こんにちは私は上記の特にコメントを読みました、そしてIvantiveは印象的です-しかし私が必要とした解決策ははるかに簡単でした。WordでSelection.Range.InsertDatabaseを使用して、Accessデータベース、Excelスプレッドシート、または別のWord文書からレコードをフェッチします。アクセスソリューションを使用すると、フェッチするレコードのレイアウトを選択し、フィールド(IDなど)に基づいて特定のレコードのみをフェッチすることができます。上記の単語をグーグルで検索すると、MSガイダンスとVBスクリプトの例が表示されます。ほんの数分でうまくいきました。これで、dbaseから必要なIDをユーザーに尋ねるVBスクリプトを探して、完了です。
これは、Javaオブジェクトとのマージフィールドを持つdocxテンプレートを使用します(オブジェクトには、mysqlまたはその他のソースからロードした情報が含まれています)。xdocレポートはJava言語用のプロジェクトであり、プロジェクトのホームページはhttps://code.google.com/p/xdocreport/です。
*開示:templ4docxプロジェクトを作成します*
こんにちは
Maven中央リポジトリにあるtempl4docxjavaライブラリを使用できるため、Mavenの依存関係に追加するだけです。
<dependency>
<groupId>pl.jsolve</groupId>
<artifactId>templ4docx</artifactId>
<version>2.0.0</version>
</dependency>
使用例:
Docx docx = new Docx("E:\\template.docx");
Variables variables = new Variables();
variables.addTextVariable(new TextVariable("${firstName}", "John"));
variables.addTextVariable(new TextVariable("${lastName}", "Sky"));
docx.fillTemplate(variables);
docx.save("E:\\filledTemplate.docx");
詳細については、http://jsolve.github.io/java/templ4docx/をご覧ください。