对Excel文件的操作主要有读取、修改、创建和设置样式,下图为本文内容导读图,可根据需要选择性的阅读.
1. 读取Excel文件的内容
为了更好的观察结果,先给出一个简单的Excel文件样例”成绩表.xls“(模拟数据总共是12行、7列).
整个工作簿只有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中的内容 **/
@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”文件内容如下,其中刘一的成绩已改变,并且单元格底色被设置为灰色:
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”文件内容如下:
未完、待续….