jxl.jar(JExcel)的使用
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:字体颜色......
=====================原创—转载请注明出处====================
未完待续... ...