Apache POI、docx4jおよびspringframework.jdbcを適用します

こんにちは

データベースと* .xslxファイルからデータを読み取り、 * .docxドキュメントを作成してmergefieldフィールドに入力する単純なJavaコンソールアプリケーションの例を紹介します 。 Apache POI、docx4j、およびspringframework.jdbcライブラリを使用します。 この例では、自動化のプロセスでしばしば発生するいくつかのタスクの実装をまとめています。 彼は誰かに役立つ可能性があります。



アプリについて

できること:



この種のアプリケーションの必要性は、さらに印刷してメールで送信するために、同じタイプの特定の数のドキュメントを手動で生成する必要があるときに発生しました。 彼の他の小さな開発からさまざまな部分を集めて、このアプリケーションが登場しました。

Apache POIライブラリの選択は、それを使用するタスクを既に実装していたため、価値がありませんでした。 しかし、docx4jは、MS Word文書の差し込み項目に入力できるという事実のために適用されました。 これは私が必要としていたものでした。

入り口には、特定のMS Excelファイルがあり、そこには顧客を識別する情報があります。 顧客情報は完全ではありません。 追加のデータを抽出するには、jdbcを介してOracleデータベースにアクセスする必要があります。 その後、アプリケーションはクライアントごとにMS Wordファイルを生成します。



実装

  1. mavenを使用して作成されたアプリケーション。 まず、必要な依存関係を把握しましょう。 pom.xmlファイルに追加する必要があるものは次のとおりです。

    依存関係
    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>2.5.6</version> <type>jar</type> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-dao</artifactId> <version>2.0.6</version> <type>jar</type> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>2.5.6</version> <type>jar</type> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>2.5.6</version> <type>jar</type> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>2.5.6</version> <type>jar</type> </dependency> <dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>14</version> </dependency> <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j</artifactId> <version>2.8.1</version> </dependency>
          
          





  2. クラスApp-アプリケーションのメインクラスを検討してください。 HelperWordクラスのオブジェクトは、単にこのクラスのmainメソッドで作成され、そのcreateWord()メソッドが呼び出されます

    アプリクラス
     public class App { public static void main( String[] args ) { HelperWord helper = new HelperWord(); helper.createWord(); } }
          
          



  3. HelperWordクラスでは、クライアントデータを取得して処理し、MS Wordファイルを作成します。

    HelperWordクラス
     import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.exceptions.InvalidFormatException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; public class HelperWord { //   MyDataManager     private MyDataManager dmg; //    *.xslx private List<HashMap> clientsRows; //     private List<HashMap> additionalData; //    MS Word public void createDocs() { //    MyDataManager     dmg = new MyDataManager(); try { //     MS Excel clientsRows = dmg.getDataBlock(); // <editor-fold defaultstate="collapsed" desc="Catch clauses"> } catch (FileNotFoundException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); //</editor-fold> } //   MS Word    addDataBlock(); } //   MS Word    private void addDataBlock() { int num = 0; //      for (HashMap row : clientsRows) { try { num++; //      MS Word WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(new File("template.docx")); //         List<Map<DataFieldName, String>> data = new ArrayList<Map<DataFieldName, String>>(); //        additionalData = dmg.getAddress(row.get("NAME").toString(), row.get("DOCDATE").toString()); //      Map<DataFieldName, String> map = new HashMap<DataFieldName, String>(); map.put(new DataFieldName("NAME"), row.get("NAME").toString()); map.put(new DataFieldName("ADDRESS"), additionalData.get(0).get("ADDRESS").toString()); data.add(map); //    MS Word     //    WordprocessingMLPackage output = MailMerger.getConsolidatedResultCrude( wordMLPackage, data); //     output.save(new File("T:\\VIPISKI_KK\\\\" + num + ". " + row.get("NAME") + ".docx")); // <editor-fold defaultstate="collapsed" desc="Catch clauses"> } catch (InvalidFormatException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); } catch (Docx4JException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); } catch (FileNotFoundException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(HelperWord.class.getName()).log(Level.SEVERE, null, ex); } // </editor-fold> } } }
          
          







    ここで、docx4jライブラリを使用してドキュメントの差し込み項目に入力します。 おそらく、DataFieldNameクラスとMailMergerクラスのみに注意を払う必要があります。 どちらもdocx4jライブラリに存在するはずですが、アセンブリには含まれていません。 したがって、それらはプロジェクトに個別に追加されました。 これらのクラスについて一言

    • DataFieldNameクラスには名前フィールドがあり、equalsメソッドはオーバーライドされます。 これは、大文字の差し込み項目の名前を比較するために行われます
    • MailMergerクラスは、文書の差し込みフィールドに値を挿入するだけです。 クラスコードは、公式サイトdocx4jから完全に借用しています。 リンクはこちら
  4. MyDataManager-データを操作するためのクラス。 Apache POIライブラリを使用してMS Excelファイルを読み取り、springframework.jdbcクラスを使用してデータベースを操作します。

    クラスMyDataManager
     import java.io.*; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import oracle.jdbc.pool.OracleDataSource; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; public class MyDataManager { public NamedParameterJdbcTemplate namedPar; private OracleDataSource getDataSource() throws SQLException { //         OracleDataSource ods = new OracleDataSource(); ods.setDriverType("thin"); ods.setServerName("192.168.xx"); ods.setPortNumber(); ods.setDatabaseName("SID"); ods.setUser("user"); ods.setPassword("password"); return ods; } //   MS Excel public List<HashMap> getDataBlock() throws FileNotFoundException, IOException { ArrayList<HashMap> res = new ArrayList<HashMap>(); FileInputStream file = new FileInputStream(new File("clients.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); //   .        if(rowIterator.hasNext()) rowIterator.next(); //    while (rowIterator.hasNext()) { Row row = rowIterator.next(); HashMap line = new HashMap(); //        1-  4-  Cell cell = row.getCell(0); line.put("NAME", cell.getStringCellValue()); cell = row.getCell(3); line.put("DOCDATE", cell.getStringCellValue()); res.add(line); } file.close(); return res; } //    public List<HashMap> getAddress(String name, String date) throws SQLException, FileNotFoundException, IOException { //    OracleDataSource ds = getDataSource(); //   FileInputStream fins = new FileInputStream("query.txt"); BufferedReader br = new BufferedReader( new InputStreamReader(fins, "UTF8")); String query = ""; String line = ""; while ((line = br.readLine()) != null) { query += "\n"; query += line; } //    namedPar = new NamedParameterJdbcTemplate(ds); MapSqlParameterSource namedParameters = new MapSqlParameterSource(); namedParameters.addValue("NAME", name); namedParameters.addValue("DOCDATE", date); //      List<HashMap> res = (List<HashMap>) namedPar.query(query, namedParameters, new DataMapper()); try { return res; } finally { ds.close(); } } }
          
          









おわりに

これがアプリケーション全体です。 もちろん、その多くはコード(データベースに接続するための設定、ファイルパス)に接続され、コンソールでもあります。 さまざまなチェックを追加して、GUIを作成できます。 タスクは一度きりのタスクだったので、私はこれをしませんでした。 とにかく、この投稿が誰かに役立つことを願っています!

ご清聴ありがとうございました!



All Articles