JExcel API
简介:
大多数情况下,应用程序需要生成一些报告。 在excel中生成这些报告可能是一个不错的方法,因为大多数人都知道如何使用excel,除此之外,它还提供了共享报告的灵活性。 在这个简短的系列教程中,我们将看到如何使用JExcel API处理Java中的Excel文件。
读取excel文件
在本教程中,我们将使用JExcel API以Java语言读取Excel文件。 这里是我们将阅读的Excel文件:

在本教程中,请确保您下载最新版本的jexcelapi,并将其放在您的计算机或eclipse项目的classpath路径下。 或者,您可以下载附在本页末尾的eclipse项目,它已经包含了API。
这是读取excel文件并显示其内容的程序的Java源代码:
public static void main(String[] args) {
try {
//从指定位置的文件创建工作簿对象;根据计算机上的位置更改文件的路径。
Workbook wrk1 = Workbook.getWorkbook(new File("C:/test.xls"));
//获取工作簿中第一个工作表的引用
Sheet sheet1 = wrk1.getSheet(0);
//使用工作表的getCel(int col, int row)方法获取对单元的引用
Cell colArow1 = sheet1.getCell(0, 0);
Cell colBrow1 = sheet1.getCell(1, 0);
Cell colArow2 = sheet1.getCell(0, 1);
//使用单元格引用的getContents()方法获取单元格的内容,返回值为一个字符串
String str_colArow1 = colArow1.getContents();
String str_colBrow1 = colBrow1.getContents();
String str_colArow2 = colArow2.getContents();
// 显示单元格内容
System.out.println("Contents of cell Col A Row 1: \"" + str_colArow1 + "\"");
System.out.println("Contents of cell Col B Row 1: \"" + str_colBrow1 + "\"");
System.out.println("Contents of cell Col A Row 2: \"" + str_colArow2 + "\"");
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
1)下面一行创建封装Excel文件的Workbook对象。 本例中,getWorkbook()方法接受指向位于“C:/test.xls”处的Excel文件的File对象。
Workbook wrk1 = Workbook.getWorkbook(new File("C:/test.xls"));
2)下面的行用于获取Excel文件中第一个工作表。 以类似方式,如果您正在处理的Excel文件有多个工作表,则可以获取任何其他工作表。
Sheet sheet1 = wrk1.getSheet(0);
3)下面的代码根据传递给getCell方法的参数为我们提供了对工作表中特定单元格的引用。 第一个参数表示列,第二个参数表示行。 确保只访问非空单元格,否则此方法将抛出ArrayIndexOutOfBoundsException。
Cell colArow1 = sheet1.getCell(0, 0);
4)下面这行调用getContents()方法提取Cell的内容。 内容以字符串形式返回。
String str_colArow1 = colArow1.getContents();
运行结果:

使用不同的数据类型读取Excel文件
正如在前面的教程中指出的那样,在实际应用程序中,您可能不得不处理除String之外的多个数据类型的Excel文件数据。 在本教程中,我们将使用不同的数据类型读取Java中的excel文件。
我们将尝试读取下面的excel,因为可以看出,excel在前四个单元中有Date,Number,Boolean和Label(常规字符串)数据。

这是读取excel文件并显示其内容的程序的Java源代码:
public static void main(String[] args) {
//从指定位置的文件创建工作簿对象;根据计算机上的位置更改文件的路径。
Workbook wrk1;
try {
wrk1 = Workbook.getWorkbook(new File("C:/test.xls"));
//获取工作簿中第一个工作表的引用
Sheet sheet1 = wrk1.getSheet(0);
//使用工作表的getCel(int col, int row)方法获取对单元的引用
Cell cell1 = sheet1.getCell(0, 0);
Cell cell2 = sheet1.getCell(1, 0);
Cell cell3 = sheet1.getCell(2, 0);
Cell cell4 = sheet1.getCell(3, 0);
DateCell dCell = null;
NumberCell nCell = null;
BooleanCell bCell = null;
LabelCell lCell = null;
// 检查单元格内容的类型,并将该对象转换为适当的引用类型
if (cell1.getType() == CellType.DATE)
dCell = (DateCell) cell1;
if (cell2.getType() == CellType.NUMBER)
nCell = (NumberCell) cell2;
if (cell3.getType() == CellType.BOOLEAN)
bCell = (BooleanCell) cell3;
if (cell4.getType() == CellType.LABEL)
lCell = (LabelCell) cell4;
// 显示单元格内容
System.out.println("Value of Date Cell is: " + dCell.getDate());
System.out.println("Value of Number Cell is: " + nCell.getValue());
System.out.println("Value of Boolean Cell is: " + bCell.getValue());
System.out.println("Value of Label Cell is: " + lCell.getString());
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
1)下面一行创建封装Excel文件的Workbook对象。 本例中,getWorkbook()方法接受指向位于“C:/test.xls”处的Excel文件的File对象。
Workbook wrk1 = Workbook.getWorkbook(new File("C:/test.xls"));
2)下面的行用于获取Excel文件中第一个工作表。 以类似方式,如果您正在处理的Excel文件有多个工作表,则可以获取任何其他工作表。
Sheet sheet1 = wrk1.getSheet(0);
3)下面的代码根据传递给getCell方法的参数为我们提供了对工作表中特定单元格的引用。 第一个参数表示列,第二个参数表示行。 确保只访问非空单元格,否则此方法将抛出ArrayIndexOutOfBoundsException。
Cell cell1 = sheet1.getCell(0, 0);
4)下面几行创建DateCell(日期类型数据)、NumberCell(数值类型数据)、BooleanCell(布尔类型数据)、:LabelCell(字符串数据)
DateCell dCell=null; NumberCell nCell=null; BooleanCell bCell=null; LabelCell lCell=null;
5)在下面的行中,我们调用Cell对象的getType()方法。 此方法返回表示Cell内容的数据类型的枚举。并将其转换为相应类型的Cell对象。
if(cell1.getType() == CellType.DATE)
dCell = (DateCell)cell1;
if(cell2.getType() == CellType.NUMBER)
nCell = (NumberCell)cell2;
if(cell3.getType() == CellType.BOOLEAN)
bCell = (BooleanCell)cell3;
if(cell4.getType() == CellType.LABEL)
lCell = (LabelCell)cell4;
6)最后我们打印单元格的值。 DateCell对象的getDate()方法返回Cell的日期内容。 NumberCell和BooleanCell对象的getValue()方法分别返回单元格的数值(双精度)和布尔值内容。 LabelCell对象的getString()方法返回Cell上的String内容。
System.out.println("Value of Date Cell is: " + dCell.getDate());
System.out.println("Value of Number Cell is: " + nCell.getValue());
System.out.println("Value of Boolean Cell is: " + bCell.getValue());
System.out.println("Value of Label Cell is: " + lCell.getString());
输出结果:

总之,在本教程中,我们看到了如何使用jexcelapi读取包含Java中不同数据类型的Excel文件。 在本系列的下一篇教程中,我们将看到如何写入excel文件。
附件:
JavaExcelReadDataTypes.zip (659KB)
写入Excel
了解了如何在Excel中处理不同的数据类型,在本教程中,我们将看到如何使用JExcel API在Java中写入Excel。
public static void main(String[] args) {
try {
File exlFile = new File("c:/write_test.xls");
//使用指定路径的文件创建用于写出的工作簿对象和工作表对象
WritableWorkbook writableWorkbook = Workbook.createWorkbook(exlFile);
WritableSheet writableSheet = writableWorkbook.createSheet("Sheet1", 0);
//使用不同数据类型的内容创建单元格,并在构造器中(col,row,value)指定单元格的 坐标
Label label = new Label(0, 0, "Label (String)");
DateTime date = new DateTime(1, 0, new Date());
Boolean bool = new Boolean(2, 0, true);
Number num = new Number(3, 0, 9.99);
// 将被创建的单元格加入工作表
writableSheet.addCell(label);
writableSheet.addCell(date);
writableSheet.addCell(bool);
writableSheet.addCell(num);
// 将工作簿写入到文件中,并关闭工作簿
writableWorkbook.write();
writableWorkbook.close();
} catch (IOException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
1)在下面的行创建一个WritableWorkbook对象,它代表我们想写的excel文件。
WritableWorkbook writableWorkbook = Workbook.createWorkbook(exlFile);
2)下面的行在我们上面创建的工作簿中创建一个WritableWorksheet对象,表示工作簿中的一个工作表,第一个参数表示工作表名称,第二个参数表示该表的索引位置。
WritableSheet writableSheet = writableWorkbook.createSheet( "Sheet1", 0);
3)下面的行创建不同数据类型的单元格,即Label(String),DateTime(Date),Boolean和Number(double):
Label label = new Label(0, 0, "Label (String)"); DateTime date = new DateTime(1, 0, new Date()); Boolean bool = new Boolean(2, 0, true); Number num = new Number(3, 0, 9.99);
4)将单元格添加入工作表中
writableSheet.addCell(label); writableSheet.addCell(date); writableSheet.addCell(bool); writableSheet.addCell(num);
输出结果:

附加功能,限制和替代方法
1)类WritableFont和WritableCellFormat使您可以使用您选择的字体添加单元格内容。例如:下面的行将创建一个字体Tahoma的标签和字体大小10并添加到表单:
WritableFont fontCell = new WritableFont(WritableFont.TAHOMA, 10); WritableCellFormat fontCellformat = new WritableCellFormat (fontCell); Label lbl = new Label(0,0,"Label Content",fontCellformat); writableSheet.addCell(lbl); (fontCell);
2)类NumberFormat和WritableCellFormat使您可以格式化数字数据。例如 Double值:下面几行创建小数点后有两个地方的双重内容并将其添加到表单中:
NumberFormat dbl = new NumberFormat("#.##");
WritableCellFormat dblFormat = new WritableCellFormat(dbl);
Number num = new Number(0, 0, 9.99, dblFormat);
writableSheet.addCell(num);
Integer值:
WritableCellFormat intFormat = new WritableCellFormat (NumberFormats.INTEGER); Number num = new Number(0, 0, 9.99, intFormat); writableSheet.addCell(num);
3)类DateFormat和和WritableCellFormat使您能够格式化日期例如 在这里,我们以dd MMM yy hh:mm:ss格式格式化日期并添加到工作表中:
Date dt = new Date();
DateFormat dtFormat = new DateFormat ("dd MMM yy hh:mm:ss");
WritableCellFormat cellDateFormat = new WritableCellFormat (dtFormat);
DateTime dateCell = new DateTime(0, 0, dt, cellDateFormat);
writableSheet.addCell(dateCell);
4)您可以将上面第1点中描述的字体格式与日期或数字格式组合起来,以您选择的字体显示日期和数字。
5)WritableSheet对象支持添加图像(addImage)和超链接(addHyperlink)
JExcelapi的局限性:
1)不支持图表
2)不支持Excel 2007(.xlsx)
3)没有密码保护支持
JExcelapi的替代品:
1) Apache POI (Support XLSX)
2) Aspose.Total for Java
======================上述内容翻译自 链接=======================
====================原创—转载请注明出处======================
====================下面内容为实践测试======================
在实际项目中,比如我们通过HQL或其他方法获取了学生列表,需要将它导出到Excel中,并指定需要导出的信息,下面简单例子就可以实现这一步骤。
源码:
/**
* @author maxd
* 学生表
*/
public class Student {
private String id;
private String name;
private int age;
private Date birth;
private boolean marStatus;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public boolean isMarStatus() {
return marStatus;
}
public void setMarStatus(boolean marStatus) {
this.marStatus = marStatus;
}
}
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import jxl.Workbook;
import jxl.format.BoldStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.write.DateTime;
import jxl.write.Font;
import jxl.write.Label;
import jxl.write.Boolean;
import jxl.write.DateFormat;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableFont.FontName;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class JavaExcelWrite {
public static void main(String[] args) {
List<Student> stuList = new ArrayList<Student>();
Calendar calendar = Calendar.getInstance();
//为了方便,循环添加8个学生对象
for(int i=0;i<8;i++){
Student stu = new Student();
stu.setId("NO00180"+i);
stu.setName("STU0"+i);
stu.setAge(10+i);
calendar.set(Calendar.DAY_OF_MONTH, i);
stu.setBirth(calendar.getTime());
if(i%2==0)
stu.setMarStatus(true);
else
stu.setMarStatus(false);
stuList.add(stu);
}
try {
//使用指定文件创建工作簿-工作表
WritableWorkbook workbook = Workbook.createWorkbook(new File("c:/student.xls"));
WritableSheet sheet = workbook.createSheet("sheet1", 0);
//指定excel文件的头信息,并在第一行中输出
String[] heads = {"学号","姓名","年龄","出生日期","婚姻状况"};
for(int i=0;i<heads.length;i++){
Label label = new Label(i,0,heads[i]);
sheet.addCell(label);
}
//将stuList中的内容循环写入sheet中
Student stu = null;
Label id = null;
Label name = null;
DateTime birth = null;
Number age = null;//导包jxl.write.Number;默认的是java.lang.Number;
Boolean marStatus = null;//导包jxl.write.Boolean;默认的是java.lang.Boolean;
//设置Label(String)样式,为了展示效果将颜色设置不一样,其他参数可参考源码
WritableFont lableFont = new WritableFont(WritableFont.TAHOMA, 15, WritableFont.BOLD, true, UnderlineStyle.DOUBLE, Colour.RED);
WritableCellFormat labelFormat = new WritableCellFormat (lableFont);
//设置日期类型的样式
DateFormat dtFormat = new DateFormat("yyyy-MM-dd hh:mm:ss");
WritableCellFormat dateFormat = new WritableCellFormat (dtFormat);
//设置整数的样式
WritableFont number = new WritableFont(WritableFont.TAHOMA, 15, WritableFont.BOLD, true, UnderlineStyle.DOUBLE, Colour.GREEN);
WritableCellFormat numberFormat = new WritableCellFormat (number);
//设置布尔类型的样式
WritableFont bolFont = new WritableFont(WritableFont.TAHOMA, 15, WritableFont.BOLD, true, UnderlineStyle.DOUBLE, Colour.BROWN);
WritableCellFormat bolFormat = new WritableCellFormat (bolFont);
//循环将学生列表内容写出到对应单元格
for(int i=0;i<stuList.size();i++){
stu = stuList.get(i);
id = new Label(0, i+1, stu.getId(),labelFormat);
name = new Label(1, i+1, stu.getName(),labelFormat);
age = new Number(2, i+1,stu.getAge(),numberFormat);
birth = new DateTime(3, i+1, stu.getBirth(),dateFormat);
marStatus = new Boolean(4, i+1, stu.isMarStatus(),bolFormat);
sheet.addCell(id);
sheet.addCell(name);
sheet.addCell(birth);
sheet.addCell(age);
sheet.addCell(marStatus);
} //写出并关闭工作簿
workbook.write();
workbook.close();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:Jxl定义Boolean、Number对象是使用的是jxl.write.*对应的类,需要手动添加。否则使用的是java.lang.*中的类,会出现错误
结果展示:为了效果,主要设置了颜色属性,具体的单元格居中、宽度高度可以在WritableCellFormat对象中设置,不在赘述

=====================原创—转载请注明出处====================
=======================下面为一些常用类=======================
Workbook:用于创建、获取工作簿
Sheet:用于创建、获取、修改等对工作表的操作。
WritableFont:设置字体样式
DateFormat:设置日期格式
NumberFormat:设置数值格式
WritableCellFormat:设置单元格样式
Label:用于String类型
DateTime:用于创建日期类型
Number:用于创建数值类型
Boolean:用于创建布尔类型
UnderlineStyle:下划线样式
Colour:字体颜色......
=====================原创—转载请注明出处====================
未完待续... ...
来源:https://www.cnblogs.com/maxudong/p/8951565.html