Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Membuat Dokumen Excel dari Program Java Menggunakan Apache POI

PoI Apache adalah perpustakaan open source populer yang digunakan untuk membaca, menulis, dan memanipulasi file MS Office dan Open Office dengan menggunakan kode Java. Pustaka adalah salah satu dari banyak produk sumber terbuka yang dikelola oleh Apache Software Foundation (ASF) berkontribusi pada masyarakat Jawa. Pustaka berisi kelas dan metode untuk memecahkan kode format file berdasarkan standar Open Office XML dan Microsoft OLE2. Meskipun perpustakaan mampu memanipulasi file Word, spreadsheet Excel, dan PowerPoint, artikel ini terutama berfokus pada dokumen spreadsheet, hanya untuk membuatnya singkat.

Pelajari JAVA dan Mulai Uji Coba Gratis Anda hari ini!

Perpustakaan Apache POI

Menariknya, dalam nama Apache POI, POI adalah singkatan dari “Poor Obfuscation Implementation” dan tujuan dari library ini adalah untuk menyediakan Java API untuk memanipulasi berbagai format file berdasarkan standar Office Open XML (OOXML) dan format Microsoft OLE 2 Compound Document (OLE2). Singkatnya, ini memungkinkan seseorang untuk membaca dan menulis file MS Excel, MS Word, dan MS PowerPoint dengan menggunakan kode Java. Sebagian besar file Microsoft Office—seperti format file berbasis XLS, DOC, PPT, dan MFC serialisasi API—berdasarkan standar OLE2. OLE, pada dasarnya, adalah teknik berpemilik yang dikembangkan oleh Microsoft, dan menyediakan format untuk menautkan objek dan menyematkan objek dalam dokumen kontainer. Format pertama disebut format OLE1.0 di mana objek yang ditautkan dan data objek yang disematkan diletakkan sebagai urutan byte dalam dokumen kontainer. Versi kedua, format OLE2.0, memanfaatkan OLE Compound File Technology (MS-CFB) di mana objek tertaut atau data objek yang disematkan terkandung dalam penyimpanan ini dalam bentuk objek OLE Compound File Stream. Lihat Format OLE1.0 dan OLE2.0 untuk detail selengkapnya tentang ini. Pustaka Apache POI menyediakan API pustaka untuk sistem file OLE2 yang disebut POIFS dan Properti Dokumen OLE2 yang disebut HPSF.

Komponen Apache POI

Pustaka Apache POI menyediakan kelas dan metode untuk bekerja dengan OLE2 Compound Documents dari MS Office. Berikut adalah ikhtisar singkat dari yang paling umum digunakan:

  • POIFS untuk Dokumen OLE2:POIFS adalah singkatan dari Sistem File Implementasi Kebingungan yang Buruk . Ini adalah elemen POI dasar yang diimplementasikan di perpustakaan ke Port OLE2 Compound Document. Ini mendukung fungsi baca dan tulis untuk format Microsoft Office biner non-XML. Semua API perpustakaan POI dibuat berdasarkan ini.
  • HSSF dan XSSF:HSSF adalah singkatan dari Format Spread Sheet yang Mengerikan . Ini adalah port implementasi Java untuk format file Excel 97 atau untuk file .xls. XSSF adalah singkatan dari XML Spread Sheet Format dan ini adalah port untuk format file OOXML atau format file .xlsx.
  • HWPF dan XWPF:HWPF adalah singkatan dari Format Pengolah Kata yang Mengerikan . Ini adalah port baca-saja terbatas untuk format file Word 6 atau Word 95 yang lebih lama. XWPF adalah singkatan dari Format Pengolah Kata XML . Ini adalah port implementasi Java untuk format file .docx Word 2007. Kedua implementasi mendukung fungsionalitas terbatas.
  • HSLF dan XSLF:HSLF adalah singkatan dari Format Tata Letak Slide yang Mengerikan . XSLF adalah singkatan dari Format Tata Letak Slide XML . Keduanya menyediakan kemampuan membaca, menulis, membuat, dan memodifikasi presentasi PowerPoint sedangkan HSLF mendukung format PowerPoint 97 dan XSLF mendukung versi yang lebih baru.
  • HPSF :HPSF adalah singkatan dari Format Kumpulan Properti Mengerikan . Hal ini terutama digunakan untuk bekerja dengan properti dokumen seperti pengaturan judul, kategori, penulis, tanggal modifikasi dan sebagainya dari sebuah dokumen
  • HDGF dan XDGF:HDGF adalah singkatan dari Format Diagram Mengerikan . Komponen ini berisi kelas untuk bekerja dengan format file biner Visio. Ini menyediakan API tingkat rendah, hanya-baca untuk mengakses Dokumen Visio dan file VSD. XDGF adalah singkatan dari Format Diagram XML . Ini untuk format file Visio XML atau file VSDX.
  • HPBF :HPBF adalah singkatan dari Format Penerbit Mengerikan . Ini adalah port Java terbatas untuk bekerja dengan format file MS Publisher.

Akronim terdengar lucu karena sistem file ini seharusnya ditutup dan Microsoft melakukan yang terbaik untuk mengaburkan kode sehingga tidak hanya sulit untuk dipahami tetapi juga sulit untuk direkayasa balik. Namun, para pengembang di Apache meretasnya dengan mudah dan merekayasa baliknya dengan sukses. Mungkin, sebagai tanda kegembiraan atau kecaman terhadap sistem tertutup, mereka dengan bercanda menamakannya demikian.

Bekerja dengan File HSSF dan XSSF

Komponen HSSF dan XSSF dari pustaka Apache menyediakan tiga model untuk mengakses dokumen spreadsheet sesuai dengan Dokumentasi HSSF dan XSSF. Mereka adalah:

  • Struktur tingkat rendah untuk kebutuhan khusus
  • API model acara untuk akses hanya baca ke dokumen Excel
  • API model pengguna untuk membuat, membaca, dan memodifikasi file Excel

API eventmodel terbatas hanya dapat digunakan untuk membaca data spreadsheet. API ini terletak di org.apache.poi.hssf.eventusermodel paket dan org.apache.poi.xssf.eventusermodel paket, di mana yang pertama digunakan untuk membaca data dari .xls format file dan yang kedua digunakan untuk membaca data dari .xlsx format file.

Model pengguna jauh lebih fleksibel dan lebih mudah digunakan; itu dapat membaca, menulis, membuat, dan memodifikasi dokumen spreadsheet Excel. Namun, ia memiliki jejak memori yang jauh lebih tinggi daripada model acara tingkat rendah.

Selain itu, mengakses dan memanipulasi format file berbasis OOXML yang lebih baru dengan XSSF memiliki jejak memori yang jauh lebih tinggi daripada file biner lama yang didukung HSSF.

Dari POI 3.5 dan seterusnya, model HSSF dan XSSF telah dimasukkan ke dalam model SS, agak diubah agar berfungsi untuk kedua model. Ini lebih merupakan tweak nama daripada perubahan nyata. Di satu sisi, kita dapat mengatakan bahwa SS=HSSF+XSSF.

Memigrasikan Data Tabel Database ke Spreadsheet Excel

Di sini, kami akan membuat program utilitas sederhana untuk memigrasikan beberapa data database ke dalam lembar Excel. Ini juga dapat diubah untuk bekerja dengan cara lain, seperti memigrasikan data Excel ke tabel database. Ini dibiarkan sebagai latihan untuk pembaca. Program ini sederhana dan cukup jelas. Kunjungi Dokumentasi POI Apache untuk informasi mendetail tentang kelas atau metode apa pun. Untuk mencoba contoh berikut, yang kami gunakan adalah sebagai berikut:

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

Kunjungi dokumen yang sesuai dan file bantuan untuk menyiapkan proyek. Berikut adalah konten untuk file pom.xml Maven yang telah kami gunakan.

<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>

Cantuman 1: pom.xml

Sebuah tabel database dibuat dengan beberapa catatan dummy sebelum menjalankan program utilitas. Berikut adalah kode dari file tersebut.

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();
   }
}

Cantuman 2: DummyDatabase.java.

Ini adalah program utilitas yang sedang kita bicarakan. Kode ditulis dengan tergesa-gesa dan strukturnya tidak terlalu elegan. Namun, itu berhasil. Susun ulang atau sesuaikan sesuai keinginan Anda.

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());
   }
}

Daftar 3 SSFile.java

Ini adalah panel kontrol tempat program utilitas dipanggil.

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"));
   }
}

Cantuman 4 :App.java

Sebelum Berlari…

Pastikan bahwa test1.xls atau test1.xlsx file tidak ada di d://temp direktori sebelum menjalankan program karena program tidak menimpa atau memeriksa file dengan nama yang sama di direktori tempat file seharusnya dibuat. Pastikan ini setiap kali program dijalankan; jika tidak, kode tersebut memberikan pesan kesalahan yang buruk. Namun, Anda dapat mengubah kode untuk memeriksanya.

Kesimpulan

Ada alternatif lain untuk bekerja dengan spreadsheet, seperti yang disarankan oleh Dokumentasi POI Apache melalui serializer Cocoon, meskipun masih menggunakan HSSF secara tidak langsung. Cocoon dapat membuat serialisasi sumber data XML apa pun dengan menerapkan style sheet dan menunjuk serializer. Model HSSF dan XSSF cukup kuat dan menyediakan sejumlah kelas dan metode untuk menangani berbagai aspek dokumen Excel. Artikel ini mencoba memberikan gambaran sekilas tentang apa yang dapat kita lakukan dengan Apache POI. Kita sering perlu menulis program utilitas untuk menjembatani antara sistem terbuka dan tertutup. Apache POI pasti dapat memenuhi tujuan kami sebagai salah satu dari jenisnya.

Referensi

  • Apache POI – Java API untuk Dokumen Microsoft
  • POI-HSSF dan POI-XSSF – Java API untuk Mengakses File Format Microsoft Excel

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjembatani RDBMS dan NoSQL:Pengantar 2DX UI cluster

  2. Python, Ruby, dan Golang:Perbandingan Aplikasi Layanan Web

  3. Penggabungan Nested Loops dan Performance Spool

  4. Cara Mengeksekusi SQL Mentah di SQLAlchemy

  5. Menggunakan ODBC dengan Salesforce dan Azure Active Directory (AD) Single Sign On (SSO)