[Java] Membuat Laporan Excel di Aplikasi Web Based

Excel adalah salah satu format output yang disukai oleh enduser, selain dari pdf. Karena di excel pengguna bisa melakukan perhitungan-perhitungan, modifikasi ataupun kustomisasi yang lebih bebas dibandingkan dari pdf.

Di tutorial ini, akan dibahas bagaimana membuat export laporan aplikasi web-based ke format xls. Gw menggunakan library jxls (http://jxls.sourceforge.net/) karena lebih mudah dalam pembuatan format template excel jika dibandingkan dengan jasper. Konsepnya sebenarnya sederhana, sebuah servlet yang jika diinvoke dari method GET, akan meng-generate file excel dan mengirimkan ke pengguna langsung via browser.

Dimulai dengan membuat template excel yang akan kita isi dengan data (perhatikan baris ke-5), kemudian diletakkan dibawah folder WEB-INF.

Untuk sourcecodenya seperti biasa, sebuah java bean sederhana sebagai tempat untuk menampung data

package com.edw.bean;

public class Mahasiswa {

    private String nama;
    private String alamat;
    private int usia;

	// jangan lupa setter dan getter-nya    
}

Berikut adalah servlet yang digunakan untuk meng-generate laporan berformat xcel

package com.edw.servlet;

import com.edw.bean.Mahasiswa;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.ss.usermodel.Workbook;

public class ReportServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // set output header
        ServletOutputStream os = response.getOutputStream();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=\"report." + new SimpleDateFormat("yyyyMMdd.hhmm").format(new Date()) + ".xls\"");

        // ambil file excelnya
        ServletContext context = getServletContext();
        String reportLocation = context.getRealPath("WEB-INF");

        // buat data
        List<Mahasiswa> mahasiswas = new ArrayList<Mahasiswa>();
        for (int i = 0; i < 10; i++) {
            Mahasiswa mahasiswa = new Mahasiswa();

            mahasiswa.setNama("Edwin " + new Random().nextInt());
            mahasiswa.setAlamat("Jakarta " + new Random().nextInt());
            mahasiswa.setUsia(new Random().nextInt());

            mahasiswas.add(mahasiswa);
        }

        // kirim ke excel
        Map beans = new HashMap();
        beans.put("x", mahasiswas);

        try {
            XLSTransformer transformer = new XLSTransformer();
            Workbook workbook = transformer.transformXLS(new FileInputStream(reportLocation + "/report.xls"), beans);
            workbook.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            os.flush();
        }
    }
}

Jangan lupa daftarkan servletnya di web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app  version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <display-name>Reporting Excel</display-name>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>  
    
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
	
    <servlet>
        <servlet-name>reportServlet</servlet-name>
        <servlet-class>com.edw.servlet.ReportServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>reportServlet</servlet-name>
        <url-pattern>/reportServlet</url-pattern>
    </servlet-mapping>	  

</web-app>

Kemudian file jsp yang akan dijadikan sebagai halaman landing page

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Download</h1>
        <a href="reportServlet">here</a>        
    </body>
</html>

Jika dijalankan, akan menghasilkan aplikasi web seperti ini,

Ini adalah isi file excel hasil download ketika dibuka

Berikut adalah konfigurasi dan library yang gw gunakan di Netbeans gw,

Ga terlalu sulit kan bikin laporan pakek JXLS ;)

Google+

2 Comments

Yogi Wijaya

about 5 years ago

buat saya yang lagi belajar sedikit bingung, :-) itu jxls sama jasper perbedaanya apa ya?? berarti itu intinya membuat tampilan download file xls yg kita buat

Reply

edwin

about 5 years ago

Hi Yogi, bedanya hanya di templating, di jasper kita bikin templatenya kan via iReport / Jasper Report sedangkan di JXLS menggunakan excel sebagai templatenya, sehingga jauh lebih mudah dimodifikasi, misakanl ingin menambahkan kalkulasi atau fungsi sorting.

Leave a Comment

Please be polite. We appreciate that.
Your email address will not be published and required fields are marked


:-[ (B) (^) (P) (@) (O) (D) :-S ;-( (C) (&) :-$ (E) (~) (K) (I) (L) (8) :-O (T) (G) (F) :-( (H) :-) (*) :-D (N) (Y) :-P (U) (W) ;-)