使用JXL操作Excel文件

对Excel文件的操作主要有读取、修改、创建和设置样式,下图为本文内容导读图,可根据需要选择性的阅读.

内容导读图

1. 读取Excel文件的内容

为了更好的观察结果,先给出一个简单的Excel文件样例”成绩表.xls“(模拟数据总共是12行、7列).

Excel文件样例

整个工作簿只有1个工作表Sheet1,从表格内容构成上看,第1行是总标题,第2行是列标题,第3行到第12行是正文内容.

下面代码的3个方法分别实现的是读取总标题读取列标题读取正文内容JXL的Jar包下载或Maven引用信息请点击此处).

package test;

import java.io.File;
import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class ReadExcelTest {

    /** JXL只支持对Excel 2003(.xls)及以下版本的解析,不支持.xlsx文件**/   
    private static final String FILE_PATH = "d:/test/成绩表.xls";

    /** 读取总标题 **/
    @Before
    public void readHeadline() throws BiffException, IOException {
        //获取工作簿
        Workbook wb = Workbook.getWorkbook(new File(FILE_PATH));
        //获取工作簿中第一个工作表,第一个下标默认都是从0开始,下同
        Sheet sheet = wb.getSheet(0);
        //获取第1列、第1行的单元格,列在前、行在后,即坐标为(0, 0)
        Cell cell = sheet.getCell(0, 0);
        //读取单元格中的内容
        String content = cell.getContents();
        wb.close();
        System.out.println("总标题 :" + content);
        System.out.println("-----------------");
    }

    /** 读取列标题 **/
    @Test
    public void readColumnTitle() throws BiffException, IOException {
        Workbook wb = Workbook.getWorkbook(new File(FILE_PATH));
        Sheet sheet = wb.getSheet(0);
        //获取第2行所有单元格
        Cell[] row = sheet.getRow(1);
        System.out.println("列标题:");
        for (int i = 0; i < row.length; i++) {
            System.out.println("第" + (i + 1) + "列 :" + row[i].getContents());
        }
        wb.close();
        System.out.println("-----------------");
    }

    /** 读取正文内容 **/
    @After
    public void readContent() throws BiffException, IOException {
        Workbook wb = Workbook.getWorkbook(new File(FILE_PATH));
        Sheet sheet = wb.getSheet(0);
        //获取总行数
        int rows = sheet.getRows();
        //获取总列数
        int columns = sheet.getColumns();
        System.out.println("正文内容:");
        //循环读取行,再读取列
        for (int r = 2; r < rows; r++) {
            Cell[] row = sheet.getRow(r);
            StringBuffer sb = new StringBuffer();
            sb.append("第" + (r + 1) + "行 :");
            for (int c = 0; c < columns; c++) {
                Cell cell = row[c];
                sb.append(cell.getContents() + " | ");
            }
            System.out.println(sb.toString());
        }
        wb.close();
    }
}

代码中引入了JUnit的注解@Before、@Test、@After(三个方法并没有前后依赖关系),运行需要引入junit.jar包(不引用junit.jar也可以,直接把上面的3个方法放到main方法中依次执行即可).

控制台Console的打印信息如下:

打印信息

如果一个工作簿中有多个Sheet,例如下面图片所展示的,一共有3个Sheet,分别对应“建筑学院”、“信息学院”、“管理学院”的学生成绩.

多个Sheet

读取多个Sheet的思路和读取一个Sheet类似,具体实现代码如下:

    /** 读取多个Sheet中的内容  **/
    @After
    public void readContent2() throws BiffException, IOException {
        Workbook wb = Workbook.getWorkbook(new File(FILE_PATH));
        //读取工作簿中所有的Sheet
        Sheet[] sheets = wb.getSheets();
        //循环读取每个Sheet中的内容
        for (int i = 0; i < sheets.length; i++) {
            Sheet sheet = sheets[i];
            int rows = sheet.getRows();
            int columns = sheet.getColumns();
            System.out.println("---------第" + (i + 1) + "个Sheet----------");
            for (int r = 2; r < rows; r++) {
                Cell[] row = sheet.getRow(r);
                StringBuffer sb = new StringBuffer();
                sb.append("第" + (r + 1) + "行 :");
                for (int c = 0; c < columns; c++) {
                    Cell cell = row[c];
                    sb.append(cell.getContents() + " | ");
                }
                System.out.println(sb.toString());
            }
        }
        wb.close();
    }

2. 修改Excel文件的内容

还是以上面的Excel文件“成绩表.xls”作为样例,修改其中“刘一”的成绩,具体实现代码如下:

package test;

import java.io.File;

import org.junit.Test;

import jxl.Cell;
import jxl.CellType;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Boolean;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class ModifyExcelTest {

    /** JXL只支持对Excel 2003(.xls)即以下版本的解析,不支持.xlsx文件**/
    private static final String FILE_PATH = "d:/test/成绩表.xls";

    /** 修改excel内容  **/
    @Test
    public void modifyContent() throws Exception {
        //获取工作簿,只可读取,不可写入
        Workbook wb = Workbook.getWorkbook(new File(FILE_PATH));
        //创建一个可写的工作簿,它作为wb的副本,对副本的修改,即可写入excel文件中
        WritableWorkbook writableWb = Workbook.createWorkbook(new File(FILE_PATH), wb);
        //获取工作簿中第一个工作表,第一个下标默认都是从0开始,下同
        WritableSheet wSheet = writableWb.getSheet(0);

        //创建一个样式,突出被修改的单元格
        WritableCellFormat format = new WritableCellFormat();
        //设置单元格背景颜色为灰色
        format.setBackground(Colour.GRAY_25);
        //设置单元格内容水平居中
        format.setAlignment(Alignment.CENTRE);
        //设置单元格内容垂直居中
        format.setVerticalAlignment(VerticalAlignment.CENTRE);

        //修改第7列、第3行的单元格,将“刘一”的成绩修改为100
        WritableCell wCell = wSheet.getWritableCell(6, 2);
        wCell.setCellFormat(format);
        setValue(wCell, "100");

        //将数据写入到副本工作簿writableWb中
        writableWb.write();
        writableWb.close();
        wb.close();
    }

    /** 根据单元格的类型来赋值,如果类型不匹配,强行写入可能会导致excel文件内容丢失  **/
    public void setValue(Cell cell, String value) {
        CellType type = cell.getType();
        if (type == CellType.LABEL) {
            Label label = (Label) cell;
            label.setString(value);
        } else if (type == CellType.NUMBER) {
            Number number = (Number) cell;
            number.setValue(Double.parseDouble(value));
        } else if (type == CellType.BOOLEAN) {
            Boolean bool = (Boolean) cell;
            bool.setValue(java.lang.Boolean.parseBoolean(value));
        }
    }
}

修改后的“成绩表.xls”文件内容如下,其中刘一的成绩已改变,并且单元格底色被设置为灰色:

修改Excel文件

3. 创建Excel文件

创建Excel文件和修改Excel类似,需要创建可写入的工作簿对象,具体实现代码如下:

package test;

import java.io.File;

import org.junit.Test;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class CreateExcelTest {

    /** 新Excel文件的保存路径  **/
    private static final String FILE_PATH = "d:/test/test2.xls";

    @Test
    public void createExcelFile() throws Exception {
        //创建一个可写入的工作簿wb
        WritableWorkbook wb = Workbook.createWorkbook(new File(FILE_PATH));
        //创建一个可写入的工作表sheet,名称叫做“第1个工作表”
        WritableSheet sheet = wb.createSheet("第1个工作表", 0);
        //在第1列、第1行位置写入字符串
        createCellAndSetValue(sheet, 0, 0, "使用JXL创建Excel文件");
        //在第1列、第2行位置写入整数
        createCellAndSetValue(sheet, 0, 1, 1002);
        //在第1列、第3行位置写入小数
        createCellAndSetValue(sheet, 0, 2, 85.223);
        //在第1列、第4行位置写入布尔值
        createCellAndSetValue(sheet, 0, 3, false);
        //将数据写入到工作簿中
        wb.write();
        wb.close();
    }

    /** 写入字符串  **/
    public void createCellAndSetValue(WritableSheet sheet, int col, int row, String value) throws Exception {
        Label label = new Label(col, row, (String)value);
        sheet.addCell(label);
    }

    /** 写入数字  **/
    public void createCellAndSetValue(WritableSheet sheet, int col, int row, Number value) throws Exception {
        jxl.write.Number number = new jxl.write.Number(col, row, Double.parseDouble(value.toString()));
        sheet.addCell(number);
    }

    /** 写入布尔值  **/
    public void createCellAndSetValue(WritableSheet sheet, int col, int row, Boolean value) throws Exception {
        jxl.write.Boolean bool = new jxl.write.Boolean(col, row, (Boolean) value);
        sheet.addCell(bool);
    }

    /** 根据传入的值创建相应类型的单元格,并给单元格赋值, 此方法等同于上面的3个createCellAndSetValue方法  **/
    public void createCellAndSetValue(WritableSheet sheet, int col, int row, Object value) throws Exception {
        if (value instanceof String) {
            Label label = new Label(col, row, (String)value);
            sheet.addCell(label);
        } else if (value instanceof Number) {
            jxl.write.Number number = new jxl.write.Number(col, row, Double.parseDouble(value.toString()));
            sheet.addCell(number);
        } else if (value instanceof Boolean) {
            jxl.write.Boolean bool = new jxl.write.Boolean(col, row, (Boolean) value);
            sheet.addCell(bool);
        }
    }
}

创建的“test2.xls”文件内容如下:

JXL创建Excel

未完、待续….

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值