JXL API(Java Excel API)是開源的API,使用Java專門用來處理Microsoft Office系列Excel(.xls)中活頁簿的讀取、寫入、修改和創建新的活頁簿。
他有一個小缺點,不能處理.xlsx類型的檔案,但整體上已經很夠用。
如果需要其他更完整的功能,可以用Apache POI。
JXL API download: API檔案下載
JXL API document: API文件
JXL API觀念
Workbook | 只能用於讀取,沒有寫入權限的Excel檔案 |
WritableSheet | 有寫入權限的Excel檔案 |
Sheet | 只能用於讀取,沒有寫入權限的活頁簿 |
WritableSheet | 有寫入權限的活頁簿 |
Cell | 一個儲存格 |
Column | 行方向,縱向方向 |
Row | 列方向,橫向方向 |
Label | 包含文字內容的儲存格 |
Number | 包含數字內容的儲存格 |
JXL API實作練習
下方為使用JXL API的實作練習(JExcelTest.java)
分別就讀取現有Excel檔案(DataRead.java),和創建新的Excel檔案(DataWrite.java)寫成function做練習
JExcelTest.java
import java.util.ArrayList;
import jxl.write.WriteException;
public class JExcelTest {
public static void main(String[] args) {
// Read existed excel file
DataRead dr = new DataRead();
dr.readExcel("/Users/eyes/Documents/Preparatory/ExcelOperate/file/score.xls");
System.out.println(dr.getValueFromCell(1, 1));
System.out.println(dr.getValueFromCell(2, 1));
System.out.println(dr.getValueFromCell(1, 2));
System.out.println(dr.getValueFromCell(2, 2));
// Get designated column with all row data
ArrayList columnData = dr.getColumnData(1);
for (Object o : columnData) {
System.out.println(o);
}
// Get total column number
System.out.println(dr.getColumnNumber());
// Get designated row with all column data
ArrayList rowData = dr.getRowNumber(1);
for (Object o : rowData) {
System.out.println(o);
}
dr.closeFile();
// Create a new excel file
try {
DataWrite dw = new DataWrite();
dw.createExcel("/Users/eyes/Documents/Preparatory/ExcelOperate/file/result.xls");
dw.createSheet("t0", 0);
dw.setValueIntoCell(0, 0, 8);
dw.setValueIntoCell(0, 1, "YT");
dw.closeFile();
} catch (WriteException ex) {
System.out.println(ex);
}
}
}
DataRead.java
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import jxl.Cell;
import jxl.CellType;
import jxl.LabelCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class DataRead {
private Workbook wbook;
private Sheet sheet;
private String strSheetName;
public void readExcel(String path) {
try {
wbook = Workbook.getWorkbook(new File(path));
int numberOfSheet = wbook.getNumberOfSheets();
if (numberOfSheet != 1) {
strSheetName = JOptionPane.showInputDialog("Whih sheet do you want to read?");
sheet = wbook.getSheet(strSheetName);
} else {
sheet = wbook.getSheet(0);
strSheetName = sheet.getName();
}
} catch (IOException | BiffException ex) {
System.out.println(ex);
}
}
public String getValueFromCell(int iColumnNumber, int iRowNumber) {
String result
= sheet.getCell(iColumnNumber, iRowNumber).getContents();
return result;
}
public ArrayList getColumnData(int columnNumber) {
ArrayList cellResult = new ArrayList();
Cell[] cellList = sheet.getColumn(columnNumber);
for (Cell cell : cellList) {
if (cell.getType() == CellType.LABEL) {
LabelCell lbc = (LabelCell) cell;
cellResult.add(lbc.getString());
} else if (cell.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) cell;
cellResult.add(nc.getValue());
}
}
return cellResult;
}
public int getColumnNumber() {
return sheet.getColumns();
}
public ArrayList getRowNumber(int rowNumber) {
ArrayList cellResult = new ArrayList();
Cell[] cellList = sheet.getRow(rowNumber);
for (Cell cell : cellList) {
if (cell.getType() == CellType.LABEL) {
LabelCell lbc = (LabelCell) cell;
cellResult.add(lbc.getString());
} else if (cell.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) cell;
cellResult.add(nc.getValue());
}
}
return cellResult;
}
public void closeFile() {
wbook.close();
}
}
DataWrite.java
import java.io.File;
import java.io.IOException;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class DataWrite {
private WritableWorkbook wwbCopy;
private WritableSheet shSheet;
private String strSheetName;
public void createExcel(String path) {
try {
wwbCopy = Workbook.createWorkbook(new File(path));
} catch (IOException ex) {
System.out.println(ex);
}
}
public void createSheet(String strSheetName, int number) {
this.strSheetName = strSheetName;
shSheet = wwbCopy.createSheet(strSheetName, number);
}
public void setValueIntoCell(int iColumnNumber, int iRowNumber, Object data) throws WriteException {
WritableSheet wshTemp = wwbCopy.getSheet(strSheetName);
if (data instanceof String) {
Label labTemp = new Label(iColumnNumber, iRowNumber, (String) data);
wshTemp.addCell(labTemp);
} else if (data instanceof Double) {
jxl.write.Number number
= new jxl.write.Number(iColumnNumber, iRowNumber, (double) data);
wshTemp.addCell(number);
} else if (data instanceof Integer) {
jxl.write.Number number
= new jxl.write.Number(iColumnNumber, iRowNumber, Integer.parseInt(data.toString()));
wshTemp.addCell(number);
}
}
public void closeFile() {
try {
wwbCopy.write();
wwbCopy.close();
} catch (IOException | WriteException ex) {
System.out.println(ex);
}
}
}