อ่านข้อมูลจากไฟล์ excel ด้วย Java โดยใช้ jXLS


หน้าแรก JSP อ่านข้อมูลจากไฟล์ excel ด้วย Java โดยใช้ jXLS
เริ่มต้นสร้างจาวาโปรเจ็ค

โปรเจ็คนี้ จะเป็นการรวมเอาการอ่านและเขียนไฟล์ excel โดยตัวอย่างการเขียนข้อมูลลงไฟล์ excel ได้เคยทำไว้แล้ว ในบทความนี้จะทำตัวอย่างการอ่านข้อมูลไฟล์ excel เมื่อทำเสร็จ ก็จะรวม2ออปชั่น เข้าด้วยกัน และสามารถเลือกได้ว่า จะ อ่านข้อมูล หรือเขียนข้อมูล

สเปค โปรแกรมและlibrary ที่ใช้
OS : Ubuntu 12.10
IDE : Eclipse Juno 4.2.1
JDK : 1.7.0_11
Libraries :
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-digester-2.1.jar
commons-jexl-2.0.1.jar
commons-logging.jar
jxls-core-1.0.1.jar
jxls-reader-1.0.1.jar
poi-3.8-20120326.jar
oi-ooxml-3.8-20120326.jar

สร้างคลาส Student

[1] File >> New >> Java Project โดยบทความนี้ตั้งชื่อว่า JxlsExample

[2] สร้าง Class Student โดยใช้ Class Student จากตัวอย่างเก่า และเพิ่ม contructor เพิ่มขึ้นมา


  Code
package com.devsharing.example.jxls;
public class Student {
int id;
String name;
String lastName;
String address;

//Constructor
public Student(int id, String name, String lastName, String address) {
this.id = id;
this.name = name;
this.lastName = lastName;
this.address = address;
}

public Student() {
// TODO Auto-generated constructor stub
}

//Getter and Setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}



สร้างคลาส Reader

สร้างคลาสสำหรับอ่านข้อมูล Excel ตั้งชื่อคลาสว่า JxlsReader.java


  Code
package com.devsharing.example.jxls;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import net.sf.jxls.reader.ReaderBuilder;
import net.sf.jxls.reader.ReaderConfig;
import net.sf.jxls.reader.XLSDataReadException;
import net.sf.jxls.reader.XLSReadStatus;
import net.sf.jxls.reader.XLSReader;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.xml.sax.SAXException;

public class JxlsReader {
static String pathXML = "res/report/student-config.xml";
static String pathXLS = "res/template/Student-Import.xls";

public XLSReadStatus importFile(Map<String, Object> model) {

ReaderConfig.getInstance().setSkipErrors(true);
InputStream inputXML = null;
InputStream inputXLS = null;
try {

inputXML = new FileInputStream(new File(pathXML));
inputXLS = new FileInputStream(new File(pathXLS));

XLSReader mainReader = ReaderBuilder.buildFromXML( inputXML );
mainReader.read( inputXLS, model);

} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (XLSDataReadException e) {
e.printStackTrace();
}finally {

try {
inputXML.close();
inputXLS.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}



อธิบายโค๊ดด้านบน ดังนี้ เป็นการใช้งาน คลาส XLSReader สิ่งที่จำเป็นคือ ไฟล์ xls และไฟล์ xml (สำหรับคอนฟิคค่า) จึงต้องทำการกำหนด path ที่อยู่ให้กับทั้งสองไฟล์ เก็บไว้ที่ pathXML และ pathXLS

เพิ่ม Library

ทำการเพิ่ม Libraries ทั้งหมด ที่ต้องใช้


  Code
|-- JxlsExample
|--src
|-- main.java.com.devsharing.example.jxls
|--Student.java
|--JxlsReport.java
|--JxlsReader.java
|--lib
|--commons-beanutils-1.8.3.jar
|--commons-collections-3.2.1.jar
|--commons-digester-2.1.jar
|--commons-jexl-2.0.1.jar
|--commons-logging.jar
|--jxls-core-1.0.1.jar
|--jxls-reader-1.0.1.jar
|--poi-3.8-20120326.jar
|--poi-ooxml-3.8-20120326.jar
|--res
|--report
|--template
|--Student.xls



ตั้งค่าการอ่านไฟล์

สร้างไฟล์ Student.xml


  Code
<?xml version="1.0" encoding="utf-8"?>
<workbook>
<worksheet name="Student">
<section startRow="0" endRow="1">
</section>
<loop startRow="2" endRow="2" items="studentList" var="student" varType="com.devsharing.example.jxls.Student">
<section startRow="2" endRow="2">
<mapping row="2" col="0">student.id</mapping>
<mapping row="2" col="1">student.name</mapping>
<mapping row="2" col="2">student.lastName</mapping>
<mapping row="2" col="3">student.address</mapping>
</section>
<loopbreakcondition>
<rowcheck offset="0">
<cellcheck offset="0">-STOP-</cellcheck>
</rowcheck>
</loopbreakcondition>
</loop>
</worksheet>
</workbook>


อธิบาย โค๊ดในไฟล์ Student.xml worksheet คือชื่อชีทที่เราจะตั้งในไฟล์ excel เช่น Sheet 1
แท็ก section startRow=”0&#8243; endRow=”1&#8243; คือ เลือกแถวที่ 1 และ 2 ในไฟล์ excel ( นับ 0 เป็นแนวที่ 1 เหมือนนับ array)
และภายในบอดี้แท็ก section ไม่ได้กำหนดค่าอะไร เพราะเนื่องจากเป็นในส่วน title และ ชื่อคอลั่ม

ต่อมา เริ่มวนลูป โดยใช้ แท็ก loop , items ในแท็กคือ ข้อมูล collection ของ Student ชือ studentList var เหมือนกับประกาศ variable ให้ student = studentList เวลาเรียกใช้ จะได้สั้นลง varType คืออ้างอิงคลาสของ Student(ต้องใช้ ชื่อ package ด้วย)

ต่อมาภายใน section startRow=”2&#8243; endRow=”2&#8243; กำหนดให้ค่าจากแถวที่ 2 คอลั่ม1 ให้ไปเก็บไว้ที่ field id ในคลาส Student , คอลั่มที่ 2 กำหนดไว้ที่ field name , field lastName , field address ตามลำดับ

loopbreakcondition คือ ใช้เพื่อจบการวนลูป โดยใส่เงื่อนไขคือ เมื่อเจอคำว่า -STOP- จะสิ้นสุดการทำงานของโปรแกรม

สร้างคลาส MainApp

ทำการสร้างคลาส MainApp.java
โดยใช้ do loop และปริ้นเมนู ให้เลือก ว่าจะทำการ อ่านไฟล์ excel หรือเขียนไฟล์ excel
หากเลือก ข้อ 1 ก็จะไปเรียก เมธอด jXLSWriter() หากเลือกข้อ 2 ก็จะเรียก เมธอด jXLSReader()


  Code
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class MainApp {

public static void main(String[] args) {
boolean state = true;
Scanner scan = new Scanner(System.in);
do{
System.out.println("Choose option below ");
System.out.println("1 : jXLS Writer");
System.out.println("2 : jXLS Reader");
switch (scan.nextInt()) {
case 1:
jXLSWriter();
state = false;
break;
case 2:
jXLSReader();
state = false;
break;
default:
System.out.println("Please choose only 1 or 2");
}

}while(state);
scan.close();
}
}



เพิ่มเมธอด reader

สร้าง เมธอด reader ใน class MainApp เพื่อไว้เรียก class JxlsReader


  Code
public static void jXLSReader () {
List studentList = new ArrayList();
Map<String, Object> model = new HashMap<String, Object>();
model.put("studentList", studentList);

JxlsReader reader = new JxlsReader();
reader.importFile(model);

for (Student stu : studentList) {
System.out.println( stu.getId() + " " +
stu.getName() + " " +
stu.getLastName() + " " +
stu.getAddress());
}
}


เพิ่มเมธอด writer


เพิ่ม method writer ในคลาส MainApp( ตัวนี้นำมาจากบทความก่อน เรื่องการเขียนข้อมูลจากไฟล์ excel)


  Code
public static void jXLSWriter () {
//Initial student
Student student = new Student(1,"Somsak","Somboon","Bangkok");
Student student2 = new Student(2,"Peter","Ayothaya","ChiangMai");
Student student3 = new Student(3,"Jack","Sparrow","savvy");

//Create List of student
List studentList = new ArrayList();
studentList.add(student);
studentList.add(student2);
studentList.add(student3);

Map<String, Object> modelList = new HashMap<String, Object>();
modelList.put("student", studentList);

JxlsReport jxls = new JxlsReport();
String status = jxls.export(modelList);
System.out.println(status);
}



ใส่ข้อมูลให้ excel

สุดท้าย เพิ่ม data ให้กับไฟล์ excel ที่จะทำการอ่าน โดยอ้างอิงตำแหน่ง row column จากการคอนฟิคที่ student.xml
และตั้งชื่อว่า Student-Import.xls และเก็บไว้ที่ path /res/template ภายในโปรเจ็ค

รับทำเว็บ  webUB.com

แสดงผลลัพธ์

เมื่อรันโปรแกรม


  Code
Choose option below
1 : jXLS Writer
2 : jXLS Reader





  Code
1
Complete to Write Excel File.
Location : /home/devsharing/Exercises/Devx/JXLS/JxlsExample/res/report/StudentCompleted.xls





  Code
2
Jan 19, 2013 7:02:20 PM net.sf.jxls.reader.XLSReaderImpl readSheet
INFO: Processing sheet Student
1 Leonel Messi Argentina
2 Cristiano Ronaldo Portugal
3 Radamel Falcao Columbia
4 Zinedine Zidane France
5 Teerasil Dangda Thailand



สรุป

นี่เป็นเพียงแค่ตัวอย่างการใช้งาน jXLS Reader และ jXLS Writer อย่างง่ายครับ ขั้นตอนจริงๆเมื่อนำไปใช้งาน อาจจะอยู่ในรูปแบบ Web Application และรับส่งข้อมูลผ่าน database เช่น MySQL , ProsgeSQL ครับโดยคลาส JxlsWriter อาจจะไปดึงข้อมูลจาก database มาเขียน เช่นเดียวกัน คลาส JxlsReader อ่านข้อมูลจาก excel เมื่อนำไปใช้งานจริงๆ ไม่ได้กำหนด path ภายในโปรเจ็คแบบนี้ อาจจะต้องอยู่ในรูปแบบ file upload ใน html ครับ ให้ผู้ใช้ ทำการอัพโหลด ไฟล์ excel ที่ฟอแมตตรงกับที่ได้ตั้งค่าไว้ student.xml

refer: http://devsharing.com/2013/java/java-jxls-file-reader/
Download Source Code : JxlsExample 2013-Jan-19

ขึ้นไปด้านบน