jxl.jar(JExcel)的使用

 

JExcel API

简介:

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

读取excel文件

  在本教程中,我们将使用JExcel API以Java语言读取Excel文件。 这里是我们将阅读的Excel文件:

  在本教程中,请确保您下载最新版本的jexcelapi,并将其放在您的计算机或eclipse项目的classpath路径下。 或者,您可以下载附在本页末尾的eclipse项目,它已经包含了API。

  JavaExcelExport.zip

  test.xls

 

  这是读取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)

  test.xls (6.5KB)   

 

写入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:字体颜色......

=====================原创—转载请注明出处====================

未完待续... ...

 

posted @ 2018-04-26 12:32  maxudong  阅读(1752)  评论(0编辑  收藏  举报