基于jxl对excel文件的row-bean的处理

最近用jxl包处理excel文件相当的方便,而且它的功能也很强大,用起来很舒服,唯一不足的就是,当我的列名很多时,要写很多的代码来取值,设值,于是就给jxl加了一个小的功能,在此分享一下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE excelfile SYSTEM "jxl-excel-1.dtd">
<excelfiles>
<excel name="student" class="com.bean.Student" path="F:\student.xls">
<column column="学号" field="sno" type="String"></column>
<column column="姓名" field="name" type="String"></column>
<column column="年龄" field="age" type="Integer"></column>
</excel>
</excelfiles>
这是一个配置文件,相当的好理解,excel 为一个excel文件,工程里可以为这类文件起一个别名 name="student", 该文件所对应的实体类,只要配置的列名包含在实体类里就可以了。该文件的路径,可以不用指定,后面可以用File的对象进行文件操作;column:列,三个属性都要有,对应的文件中的列名 column; 实体中的属性名 field, 该字段的类型 type.
一目了然,不做解释了。
下面介绍使用方法:
Jxl 的传统使用方法:
Workbook rwb = Workbook.getWorkbook(new File(sourcefile));//得到工作文件
Sheet rs = rwb.getSheet(0);//设置工作sheet
Cell cell = rs.getCell(0, 0);//获取单元格,再调用getContent() 方法获取值

如果我有一个学生的excel文件,字段有10个,有100行,那我就要一行行的遍历,获取每个单元格的值,在调用student的set方法赋值。注意:要小心该列是什么属性,别设置了错误的值,只要excel文件一变,你的代码就要修改了。
下面介绍我添加功能后的使用方法:
ExcelFile ef = new ExcelFile("student");//获取操作的文件
ef.createReadBook(); //设置只读
Student student = new Student();
try {
ef.row2Bean(1, student);//获取一行的信息,封装到student对象里面
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("name:" + student.getName());//输出
System.out.println("age:" + student.getAge());
System.out.println("sno:" + student.getSno()); //其他的dao操作。。

[img]http://dl.iteye.com/upload/attachment/611280/aa09f2c5-9e34-3a1a-84f2-d36a07fd24ea.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/611283/be629e8f-ed37-33e6-a07e-7aa5ede8c096.jpg[/img]
不管有多少字段,只要你配置正确都可以完成。
下面介绍写入excel文件:
Student student = new Student(); //bean
student.setSno("111");//或者从DB 里取数据
student.setName("Jack");
student.setAge(11);

ExcelFile ef = new ExcelFile("student"); //设置操作文件
ef.createWriteBook();//建立可写的文件
ef.bean2Row(student);//追加到最后一行
ef.bean2Row(3, student);//追加到指定的行数
ef.write(); //写入
ef.closeWriteBook();//关闭

[img]http://dl.iteye.com/upload/attachment/611275/7e0ac992-00a4-394d-81d4-b3d073ea81fb.jpg[/img]
使用就是这样,亲测,处理excel文件更加方便,如果你要更加细致的处理文件,就使用jxl提供的api。这个只能满足一些懒人的小操作。而且还没有开发完,bug那是肯定有的,下面提供设计思路,希望有空的朋友可以把他开发的更完美。
读配置:将每一个excel结点的信息,保存到Excel对象里,然后factory里的Map里,这样当需要操作时,可以获取要操作的文件的信息。
实例化ExcelFile: 主要根据name="student" 这个key 从工厂里得到Excel对象,根据path实例化File,当发现用户没有设path的值时会提示错误;student--\目录下找不到文件!
建立读写文件:调用jxl代码,建立读写文件,这部分大家可以参考jxl的API,就不做介绍了。
封装行信息到Bean 里:
public <T> T row2Bean(int row, T bean) throws Exception {
if (!isMatch || !validation()) {
return null;
}
List<String> names = getColumnsName();
Map<String, Column> map = excel.getColumns();
for (int i = 0; i < names.size(); i++) {
Column c = map.get(names.get(i));
String content = sheet.getCell(i, row).getContents();
if (DataType.STRING.equals(c.getType())) {
// string type
ExcelFileUtil.setProperty(bean, c.getFiled(), content);
}//类型只需在此重构即可
if (DataType.INTEGER.equals(c.getType())) {
// integer type
ExcelFileUtil.setProperty(bean, c.getFiled(), Integer
.parseInt(content));
}
}
return null;
}
先进性验证,看看操作的文件和配置的信息是否符合,只要配置的属性包含在Bean的属性里面,就可以通过验证,如不包含则提示错误并返回。
后面是利用反射的技术,设置Bean的值:
private final static String SET = "set"; // set method
/**set the bean's field*/
public static <T> void setProperty(T t, String name, Object value) {
String methodString = getMethodString(name, SET);
try {
// 利用反射获取方法,设置相关的属性
t.getClass().getMethod(methodString, value.getClass()).invoke(t,
value);
} catch (Exception e) {
e.printStackTrace();
}
}
将Bean 写入文件,也是一样的道理,具体代码就不贴了,下面会提供源码。
文件列名 >= 配置文件 <= 实体Bean
配置文件作为中间的媒介,只需要包含与文件的列名即可,同时包含于实体的属性就可以了。
不知道jxl有没有提供这样的功能,只是自己没有找到,就写了这样的功能,然后重新设计了下,加入到jxl的包里。功能完全可以重构,解析xml用的是dom4j.
欢迎交流。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值