Java修道之路:jxl操作excel的Demo和详细注释

其实也不是工作中用到了,只是有朋友在问怎么用,也觉得以后多半会用到,所有周末有时间就学学。既然学了又不用,那肯定会忘得比火箭飞得还快……记下来就是最保险的了,将就练习写的几个Demo贴出来,当作技术储备吧,虽说是Demo,但是注释超详细,至少我是这么认为的。

Demo有4个,代码比较长,分段贴出,但是所有代码是在一个类里面的。

下面是引入的包和JUnit的@Before注解

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

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

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.CellFormat;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class ExcelOperTest {

	private String xlsPath;

	@Before
	public void init() {
		xlsPath = "D:/test.xls";
	}

Demo1,jxl读取excel的代码

	/**
	 * 测试jxl对excel的读取
	 *
	 * 使用的对象:
	 * Workbook, Sheet, Cell
	 */
	@Test
	public void testExcelRead() throws BiffException, IOException {

		// jxl对excel文件读取,创建Workbook对象来存放
		Workbook workbook = Workbook.getWorkbook(new File(xlsPath));
		// 读取工作表,创建Sheet对象,0表示第一张表,可以是表名
		Sheet sheet = workbook.getSheet(0);
		// 读取表中的单元格,2,7表示第3列,第8行,注意:行列是从0开始算的
		Cell cell = sheet.getCell(5, 5);
		// 读取单元格中的内容
		String content = cell.getContents();

		// 还可以读取单元格类型,通过判断类型来执行其他的方法
		// 单元格是CellType.DATE格式的
		CellType type = cell.getType();
		if (type == CellType.DATE) {

			// 设置日期时间格式
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			// 对于jxl必须设置时区格式为GMT,否则会多出8个小时
			TimeZone zone = TimeZone.getTimeZone("GMT");
			sdf.setTimeZone(zone);

			// 转为DateCell就可以得到Date了
			DateCell dc = (DateCell) cell;
			// 判断为Date,可以getDate获取Date对象
			System.out.println(sdf.format(dc.getDate()));
		}

		// CellType.LABLE类型:对应LableCell和getString()
		// CellType.NUMBER类型:对于NumberCell和getValue()
		// 还有其他类型可以查API

		// 如果是时间格式,直接输出content貌似是12小时制显示
		System.out.println("--- " + content);

		// 用完要关闭
		workbook.close();

	}

Demo2,jxl写入excel的代码

	/**
	 * 测试jxl对excel的写操作
	 *
	 * 用到的对象:
	 * WritableWorkbook, WritableSheet, Label(Cell的实现类,代表各种类型的单元格,还有Number、DateTime等)
	 */
	@Test
	public void testExcelWrite() throws IOException, RowsExceededException, WriteException {

		// 创建xls文档,参数也可以是一个输出流
		WritableWorkbook workbook = Workbook.createWorkbook(new File(xlsPath));
		// 创建工作表
		WritableSheet sheet = workbook.createSheet("名单", 1);

		// 创建单元格,如果单元格是字符,就是Label,同理,日期和数字是DateTime和Number
		// 设置格式:顺序为:字体(FontName<-WritableFont.常量),大小(int),粗体(int<-WritableFont.常量),
		//				斜体(boolean),下划线(UnderLineStyle<-UnderLineStyle.常量),
		// 				颜色(Colour<-Colour.常量),ScriptStyle(不知道是什么)
		// 上述都是类似常量的使用方法
		WritableFont wf = new WritableFont(WritableFont.createFont("微软雅黑"),20,WritableFont.BOLD,
				true, UnderlineStyle.DOUBLE, Colour.RED);
		CellFormat cf1 = new WritableCellFormat(wf);
		Label labelCell = new Label(1, 1, "这是在第2列第2行",cf1);
		// 将单元格加入到工作表
		sheet.addCell(labelCell);

		// 添加其他类型的单元格
		// DateTime
		// 设置时间格式,注意:必须要设置,否则会显示1900-1-0的日期
		// 解释下接口和类的关系:
		// class DateFormat implements DisplayFormat,WritableCellFormat构造要求传入DisplayFormat
		// class WritableCellFormat implements CellFormat,DateTime最后一个参数要求传入CellFormat
		DateFormat df = new DateFormat("yyyy-MM-dd HH:mm:ss");
		CellFormat cf2 = new WritableCellFormat(df);
		DateTime dateTimeCell = new DateTime(2, 1, new Date(), cf2); // 必须传入CellFormat,否则日期显示有错
		sheet.addCell(dateTimeCell);

		// Number
		// 设置数字格式
		NumberFormat nf = new NumberFormat("#.##");
		CellFormat cf3 = new WritableCellFormat(nf);
		jxl.write.Number numberCell = new Number(3, 1, 1.116, cf3);
		sheet.addCell(numberCell);

		// 公式
		Formula formula = new Formula(4, 1, "SUM(A1:A10)");
		sheet.addCell(formula);

		// 操作单元格
		// 合并
		// 从A11,A12,B11,B12合并,就是4个各自,左上角是第1列第11行,右下角是第2列第12行
		sheet.mergeCells(0, 10, 1, 11);

		// 设置2和6列的宽度为40,设置行setRowView(?,?);
		sheet.setColumnView(1, 40);
		sheet.setColumnView(5, 40);

		// 设置字体颜色,可以单独对WritableFont设置setColour(...)
		WritableFont cf4 = new WritableFont(WritableFont.ARIAL);
		cf4.setColour(Colour.GREEN);
		// 设置单元格样式
		WritableCellFormat format = new WritableCellFormat(cf4);
		format.setAlignment(Alignment.RIGHT);
		format.setBorder(Border.ALL, BorderLineStyle.DASH_DOT, Colour.RED);
		format.setBackground(Colour.YELLOW);
		Label label = new Label(5, 5, "这是设置了样式的单元格", format);
		sheet.addCell(label);

		// 写入xls文件
		workbook.write();
		// 关闭文件
		workbook.close();

	}

Demo3,jxl修改excel的代码

	/**
	 * 修改xls
	 */
	@Test
	public void testExcelUpdate() throws BiffException, IOException, WriteException {

		// 步骤是:先读取xls,再修改xls
		// 创建读取xls的Workbook
		Workbook workbook = Workbook.getWorkbook(new File(xlsPath));
		// 创建写入xls的WritableWorkbook
		WritableWorkbook writeWorkbook = Workbook.createWorkbook(new File(xlsPath), workbook);
		// 获取写入xls的工作表
		WritableSheet sheet = writeWorkbook.getSheet(0);
		// 获取写入xls的工作表要改的cell
		Cell cell = sheet.getCell(5, 5);
		if (cell.getType() == CellType.LABEL) {
			Label label = (Label) cell;
			// 经测试边框会被设置成默认的实线,重新设置边框,如果其他样式丢失也可以用通用的方法设置
			// 先获取原来的样式
			CellFormat format_o = label.getCellFormat();
			// 在创建单元格样式
			WritableCellFormat format = new WritableCellFormat(format_o);
			// 重新设置边框
			format.setBorder(Border.ALL, BorderLineStyle.DASH_DOT, Colour.RED);
			// 将样式应用到单元格
			label.setCellFormat(format);
			// 修改单元格,如果不做其他修改,可以使用setString(...)
			label.setString("修改后的内容");
		}

		// 修改后写入
		writeWorkbook.write();

		writeWorkbook.close();
		workbook.close();

	}

Demo4,jxl设置条件格式,如下拉菜单

	/**
	 * 补充一个:
	 * jxl设置条件格式,如下拉菜单
	 * 可以在API中寻找或猜测出相关方法
	 */
	@Test
	public void testSetValideData() throws BiffException, IOException, RowsExceededException, WriteException {

		Workbook workbook = Workbook.getWorkbook(new File(xlsPath));
		WritableWorkbook writeWorkbook = Workbook.createWorkbook(new File(xlsPath), workbook);
		WritableSheet sheet = writeWorkbook.getSheet(0);
		sheet.setColumnView(7, 40);

		// 设置条件格式,即下拉列表的值
		// 设置条件格式中的有效值,貌似要addCell才能添加
		// 创建CellFeatures
		WritableCellFeatures cellFeatures = new WritableCellFeatures();
		// 创建值的collection
		List<String> list = new ArrayList<String>();
		list.add("值1");
		list.add("值2");
		list.add("值3");
		// 为单元格的特征设置条件格式列表
		cellFeatures.setDataValidationList(list);

		// 创建Label单元格
		Label label = new Label(7, 7, "这里是条件格式,即下拉菜单");
		// 将特征设置入Label单元格
		label.setCellFeatures(cellFeatures);
		// 添加修改后的单元格,如果要设置下拉菜单,需要使用addCell(...)
		sheet.addCell(label);

		writeWorkbook.write();

		writeWorkbook.close();
		workbook.close();
	}
}

总结:
1,
读取的cell是:LabelCell
写入的cell是:Label
其他以此类推

2,设置类型单元格的format的步骤都是统一的:
new WritableFont(…)->XXXFormat(…,WritableFont)->WritableCellFormat(XXXFromat)->new XXX(…,WritableCellFormat)
注意:没有LabelFormat
如果不设置单元格样式,那么就没有WritableCellFormat,直接new XXX(…,XXXFormat)即可
用文字来说明就是:设置字体->设置单元格类型样式->设置单元格样式->创建单元格对象,单元格样式不设置可以跳过

3,jxl很多方法或用法根据名字都能猜出来是干什么的,再查查API就会用了,应该…

4,边框样式丢失估计是BUG,或者是我没有操作正确,但是可以重新设置

5,注意:CellFormat是jxl.format包下面的接口

6,jxl的jar包下载:(链接: http://pan.baidu.com/s/1gf8TW7x 密码: 94pn)

7,jxl的文档下载:(链接: http://pan.baidu.com/s/1jHKIRZK 密码: ex9r)

本文《Java修道之路:jxl操作excel的Demo和详细注释》来自 www.juwends.com ,欢迎转载或CV操作,但请注明出处,谢谢!