sql >> データベース >  >> RDS >> Database

ApachePOIを使用してJavaプログラムからExcelドキュメントを作成する方法

    Apache POI は、Javaコードを使用してMSOfficeおよびOpenOfficeファイルの読み取り、書き込み、および操作を行うために使用される一般的なオープンソースライブラリです。このライブラリは、 Apache Software Foundationによって維持されている多くのオープンソース製品の1つです。 (ASF)Javaコミュニティに貢献しました。ライブラリには、OpenOfficeXML標準とMicrosoftOLE2に基づいてファイル形式をデコードするためのクラスとメソッドが含まれています。ライブラリはWord、Excelスプレッドシート、PowerPointファイルを操作できますが、この記事では主にスプレッドシートドキュメントに焦点を当てており、簡単にするだけです。

    JAVAを学び、今すぐ無料トライアルを始めましょう!

    ApachePOIライブラリ

    興味深いことに、Apache POIという名前のPOIは、「Poor Obfuscation Implementation」の略であり、ライブラリの目的は、Office Open XML標準(OOXML)およびMicrosoftのOLE2複合ドキュメント形式に基づいてさまざまなファイル形式を操作するためのJavaAPIを提供することです。 (OLE2)。つまり、これにより、Javaコードを使用してMS Excel、MS Word、およびMSPowerPointファイルを読み書きできます。 XLS、DOC、PPT、MFCシリアル化APIベースのファイル形式などのほとんどのMicrosoft Officeファイルは、OLE2標準に基づいています。 OLEは、基本的に、開発された独自の手法です。 Microsoftによるもので、オブジェクトをリンクし、コンテナドキュメント内にオブジェクトを埋め込むための形式を提供します。最初の形式はOLE1.0形式と呼ばれ、リンクされたオブジェクトと埋め込まれたオブジェクトのデータがコンテナドキュメント内のバイトシーケンスとして配置されます。 2番目のバージョンであるOLE2.0形式は、リンクされたオブジェクトまたは埋め込みオブジェクトのデータがOLE複合ファイルストリームオブジェクトの形式でこのストレージに含まれるOLE複合ファイルテクノロジ(MS-CFB)を利用します。詳細については、OLE1.0およびOLE2.0フォーマットを参照してください。 Apache POIライブラリは、POIFSと呼ばれるOLE2ファイルシステムおよびHPSFと呼ばれるOLE2ドキュメントプロパティ用のライブラリAPIを提供します。

    ApachePOIコンポーネント

    Apache POIライブラリは、MSOfficeのOLE2複合ドキュメントを操作するためのクラスとメソッドを提供します。最も一般的に使用されるものの概要は次のとおりです。

    • POIFS OLE2ドキュメントの場合:POIFSは Poor Obfuscation Implementation File Systemの略です。 。これは、OLE2複合ドキュメントを移植するためにライブラリに実装されている基本的なPOI要素です。非XMLバイナリMicrosoftOffice形式の読み取りおよび書き込み機能をサポートします。 POIライブラリのすべてのAPIは、これに基づいて構築されています。
    • HSSFおよびXSSF:HSSFは Horrible Spread Sheet Formatの略です。 。これは、Excel97ファイル形式または.xlsファイル用のJava実装ポートです。 XSSFは、 XML Spread Sheet Formatの略です。 OOXMLファイル形式または.xlsxファイル形式のポートです。
    • HWPFおよびXWPF:HWPFは Horrible Word Processor Formatの略です。 。これは、古いWord6またはWord95ファイル形式の制限付き読み取り専用ポートです。 XWPFは、 XML Word Processor Formatの略です。 。これは、Word2007.docxファイル形式のJava実装ポートです。どちらの実装も制限された機能をサポートしています。
    • HSLFおよびXSLF:HSLFは Horrible Slide Layout Formatの略です。 。 XSLFは、 XML Slide Layout Formatの略です。 。これらは両方とも、PowerPointプレゼンテーションの読み取り、書き込み、作成、および変更機能を提供しますが、HSLFはPowerPoint 97形式をサポートし、XSLFはそれ以降のバージョンをサポートします。
    • HPSF :HPSFは、 Horrible Property Set Formatの略です。 。特に、ドキュメントのタイトル、カテゴリ、作成者、変更日などの設定など、ドキュメントのプロパティを操作するために使用されます。
    • HDGFおよびXDGF:HDGFは Horrible Diagram Formatの略です。 。このコンポーネントには、Visioバイナリファイル形式で動作するクラスが含まれています。これは、VisioドキュメントおよびVSDファイルにアクセスするための低レベルの読み取り専用APIを提供します。 XDGFは、 XML Diagram Formatの略です。 。これは、VisioXMLファイル形式またはVSDXファイル用です。
    • HPBF :HPBFは Horrible Publisher Formatの略です 。これは、MSPublisherファイル形式で動作する制限付きのJavaポートです。

    これらのファイルシステムは閉じられているはずであり、Microsoftはコードを難読化するために最善を尽くしたため、頭字語はユーモラスに聞こえます。そのため、理解が難しいだけでなく、リバースエンジニアリングも困難です。しかし、Apacheの開発者はそれを簡単にハッキングし、リバースエンジニアリングに成功しました。おそらく、閉鎖系の喜びまたは完全な非難の印として、彼らは冗談めかしてそれらをそのように名付けました。

    HSSFおよびXSSFファイルの操作

    ApacheライブラリのHSSFおよびXSSFコンポーネントは、HSSFおよびXSSFドキュメントに従って、スプレッドシートドキュメントにアクセスするための3つのモデルを提供します。それらは:

    • 特別なニーズのための低レベルの構造
    • Excelドキュメントへの読み取り専用アクセス用のeventmodelAPI
    • Excelファイルを作成、読み取り、変更するためのユーザーモデルAPI

    限定されたイベントモデルAPIは、スプレッドシートデータの読み取りにのみ使用できます。これらのAPIは、 org.apache.poi.hssf.eventusermodelにあります。 パッケージとorg.apache.poi.xssf.eventusermodel パッケージ。最初のパッケージは、 .xlsからデータを読み取るために使用されます。 ファイル形式と2番目の形式は、 .xlsxからデータを読み取るために使用されます ファイル形式。

    ユーザーモデルははるかに柔軟で使いやすいです。 Excelスプレッドシート文書の読み取り、書き込み、作成、および変更を行うことができます。ただし、低レベルのイベントモデルよりもはるかに高いメモリフットプリントがあります。

    また、XSSFを使用して新しいOOXMLベースのファイル形式にアクセスして操作すると、HSSFでサポートされている古いバイナリファイルよりもはるかに高いメモリフットプリントが得られます。

    POI 3.5以降、HSSFモデルとXSSFモデルはSSモデルに組み込まれ、両方のモデルで機能するように調整されています。これは、実際の変更というよりも、名前の微調整です。ある意味、SS =HSSF+XSSFと言えます。

    データベーステーブルデータのExcelスプレッドシートへの移行

    ここでは、いくつかのデータベースデータをExcelシートに移行するための簡単なユーティリティプログラムを作成します。これは、Excelデータをデータベーステーブルに移行するなど、他の方法で機能するように調整することもできます。これは読者の練習問題として残されています。プログラムはシンプルで自明です。クラスまたはメソッドの詳細については、ApachePOIドキュメントにアクセスしてください。次の例を試すために使用したものは次のとおりです。

    • JDK 8
    • MS Excel 2007
    • Intellij IDEA IDE
    • Apache POI 3.17
    • Apache Derby 10.14

    プロジェクトを設定するための適切なドキュメントとヘルプファイルにアクセスしてください。使用したMavenpom.xmlファイルの内容は次のとおりです。

    <project 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
       http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>com.mano.examples</groupId>
       <artifactId>apache-poi-demo</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>jar</packaging>
    
       <name>apache-poi-demo</name>
       <url>http://maven.apache.org</url>
    
       <properties>
          <project.build.sourceEncoding>
             UTF-8
          </project.build.sourceEncoding>
       </properties>
    
       <build>
          <plugins>
             <plugin>
                <artifactId>
                   maven-compiler-plugin
                </artifactId>
                <version>3.7.0</version>
                <configuration>
                   <source>1.8</source>
                   <target>1.8</target>
                </configuration>
             </plugin>
          </plugins>
       </build>
    
       <dependencies>
          <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>3.8.1</version>
             <scope>test</scope>
          </dependency>
    
          <!-- https://mvnrepository.com/artifact
             /org.apache.maven.plugins/maven-compiler-plugin -->
          <dependency>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>3.7.0</version>
          </dependency>
    
          <!-- https://mvnrepository.com/artifact/
             org.apache.poi/poi -->
          <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
             <version>3.17</version>
          </dependency>
    
          <!-- https://mvnrepository.com/artifact/
             org.apache.poi/poi-ooxml -->
          <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
             <version>3.17</version>
          </dependency>
    
          <!-- https://mvnrepository.com/artifact/
             org.apache.derby/derby -->
          <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derby</artifactId>
             <version>10.14.1.0</version>
             <scope>test</scope>
          </dependency>
    
          <!-- https://mvnrepository.com/artifact/
             org.apache.derby/derbyclient -->
          <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derbyclient</artifactId>
             <version>10.14.1.0</version>
          </dependency>
    
       </dependencies>
    </project>
    

    リスト1: pom.xml

    ユーティリティプログラムを実行する前に、いくつかのダミーレコードを使用してデータベーステーブルが作成されます。これがそのファイルのコードです。

    package com.mano.examples;
    
    import java.sql.*;
    
    
    public class DummyDatabase {
    
       public static void createDummyDatabase()
             throws SQLException {
          Connection con=DriverManager.getConnection
             ("jdbc:derby:D:/temp/dummy;create=true");
          Statement stmt=con.createStatement();
          stmt.executeUpdate("drop table semester2");
          stmt.executeUpdate("CREATE TABLE semester2(STUDENT_ID int,
             CARCH INT, DCE INT, WEBTECH INT, JAVA INT, SAD_MIS INT,
             PRIMARY KEY(STUDENT_ID))");
    
          // Insert 2 rows
          stmt.executeUpdate("insert into semester2
             values (23567932,56,78,97,58,85)");
          stmt.executeUpdate("insert into semester2
             values (47250001,96,34,75,68,12)");
          stmt.executeUpdate("insert into semester2
             values (99568955,45,68,69,78,29)");
          stmt.executeUpdate("insert into semester2
             values (89376473,75,23,56,89,47)");
          stmt.executeUpdate("insert into semester2
             values (29917740,85,78,55,15,48)");
          stmt.executeUpdate("insert into semester2
             values (85776649,23,56,78,25,69)");
          stmt.executeUpdate("insert into semester2
             values (38846455,68,95,78,53,48)");
          stmt.executeUpdate("insert into semester2
             values (40028826,63,56,48,59,75)");
          stmt.executeUpdate("insert into semester2
             values (83947759,85,54,69,36,89)");
          stmt.executeUpdate("insert into semester2
             values (92884775,78,59,25,48,69)");
          stmt.executeUpdate("insert into semester2
             values (24947389,12,10,14,54,68)");
          stmt.executeUpdate("insert into semester2
             values (77399465,44,33,26,88,77)");
    
          // Query
          ResultSet rs = stmt.executeQuery
          ("SELECT * FROM semester2");
    
          // Print out query result
          while (rs.next()) {
             System.out.printf
                   ("%dt%dt%dt%dt%dt%dn",
                rs.getLong("STUDENT_ID"),
                rs.getInt("CARCH"),
                rs.getInt("DCE"),
                rs.getInt("WEBTECH"),
                rs.getInt("JAVA"),
                rs.getInt("SAD_MIS"));
          }
          stmt.close();
          con.close();
       }
    }
    

    リスト2: DummyDatabase.java。

    これは私たちが話しているユーティリティプログラムです。コードは急いで書かれ、構造はあまりエレガントではありませんでした。ただし、動作します。適切と思われる場合は、再構築または微調整します。

    package com.mano.examples;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.sql.*;
    
    public class SSFile {
    
       private static String[] header={"STUDENT_ID",
          "CARCH", "DCE", "WEBTECH", "JAVA",
          "SAD_MIS", "TOTAL", "AVERAGE"};
    
       public static void databaseToExcel(File file)
             throws IOException, SQLException {
          Workbook workbook = null;
          if (file.getName().endsWith(".xls"))
             workbook = new HSSFWorkbook();
          else if (file.getName().endsWith(".xlsx"))
             workbook = new XSSFWorkbook();
          else {
             System.out.println("Invalid filename!");
             return;
          }
          Sheet sheet = workbook.createSheet();
          Connection con = DriverManager.getConnection
             ("jdbc:derby:D:/temp/dummy;create=true");
          Statement stmt = con.createStatement();
          ResultSet rs = stmt.executeQuery("SELECT * FROM semester2");
    
    
    
          Row rr = sheet.createRow(0);
          for(int i=0;i<header.length;i++){
             createHeaderCell(rr, (short) i, header[i]);
          }
    
          int i = 1;
          while (rs.next()) {
             rr = sheet.createRow(i++);
             for(int j=0;j<header.length-2;j++){
                createDataCell(rr, (short) j,
                   rs.getLong(header[j]));
             }
          }
          rr = sheet.getRow(1);
          Cell total = rr.createCell(6);
          total.setCellType(CellType.FORMULA);
          total.setCellFormula("SUM(B2:F2)");
          Cell avg = rr.createCell(7);
          avg.setCellType(CellType.FORMULA);
          avg.setCellFormula("AVERAGE(B2:F2)");
    
          FileOutputStream outFile = new
             FileOutputStream(file);
          workbook.write(outFile);
          outFile.flush();
          outFile.close();
          stmt.close();
          con.close();
       }
    
       private static void createHeaderCell(Row row,
             short col, String cellValue) {
          Cell c = row.createCell(col);
          c.setCellValue(cellValue);
       }
    
       private static void createDataCell(Row row,
             short col, Number cellValue) {
          Cell c = row.createCell(col);
          c.setCellType(CellType.NUMERIC);
          c.setCellValue(cellValue.doubleValue());
       }
    }
    

    リスト3: SSFile.java

    これは、ユーティリティプログラムが呼び出されるコントロールパネルです。

    package com.mano.examples;
    
    import java.io.File;
    import java.io.IOException;
    import java.sql.SQLException;
    
    public class App
    {
       public static void main( String[] args )
             throws IOException,SQLException{
          // DummyDatabase.createDummyDatabase();
          SSFile.databaseToExcel(new
             File("d://temp//test1.xls"));
       }
    }
    

    リスト4 :App.java

    実行する前に…

    test1.xls またはtest1.xlsx d:// tempにファイルが存在しません プログラムは、ファイルが作成されるはずのディレクトリ内の同じ名前のファイルを上書きもチェックもしないため、プログラムを実行する前のディレクトリ。プログラムを実行するたびにこれを確認してください。それ以外の場合、コードは厄介なエラーメッセージを表示します。ただし、コードを微調整してチェックすることもできます。

    結論

    Apache POIドキュメントがCocoonシリアライザーを介して示唆しているように、スプレッドシートを操作する別の方法がありますが、それでも間接的にHSSFを使用します。 Cocoonは、スタイルシートを適用し、シリアライザーを指定することにより、任意のXMLデータソースをシリアル化できます。 HSSFおよびXSSFモデルは非常に強力であり、Excelドキュメントのさまざまな側面を処理するための多数のクラスとメソッドを提供します。この記事では、ApachePOIで何ができるかを垣間見ることを試みました。多くの場合、オープンシステムとクローズドシステムの間を橋渡しするユーティリティプログラムを作成する必要があります。 Apache POIは、間違いなくその種の1つとしての目的を果たすことができます。

    参照

    • Apache POI –Microsoftドキュメント用のJavaAPI
    • POI-HSSFおよびPOI-XSSF–MicrosoftExcel形式ファイルにアクセスするためのJavaAPI

    1. postgresqlストアドプロシージャをデバッグする方法は?

    2. PostgreSQLはデータベースをどこに保存しますか?

    3. 特定のフィールドに通貨記号£、$を追加します。ORACLE

    4. PostgreSQLでのページングにカーソルを使用する