寒假以后在做移动的项目。关于权限控制了。最近移动的项目经理让我额外做一个简单系统实现。大概是这样的。
他给我两张暗访问卷的excel表格。让我将之弄成静态网页。然后做一个管理系统。登陆者有两类。一类是暗访者。就是提
交表格的。另外一类是管理员。对提交的数据进行管理。管理员把暗访者提交到数据库里面的数据导入到excel表格中。
然后实现远程下载。比如。服务器在武汉。暗访者在长沙登陆。提交完暗访问卷数据保存到武汉的数据库里。然后假如管理
员在广州登陆。通过执行操作将数据库里面的数据导入到武汉服务器里生成excel表格。然后。管理员可以进行下载。
其实整个流程蛮简单的。我使用xml作为数据库的。这样我觉得移动性比较强。和access差不多。要将从前天暗访者提交
的数据提交到xml数据库里面。我们需要借助一个开源包 dom4j。这个另外会写的。今天主要讲一下如何用jxl
操作excel表格。jxl 是java excel api 的简称。
官网 :http://www.andykhan.com/jexcelapi/tutorial.html#writing
这个开源包是韩国人写的。看来我们有理由相信,韩国人不止会整容和拍电视剧。而且会写程序。
当然解析excel文件的不止是有jxl这么一种开源包。还有另外一种叫做 poi 。这是apache公司的杰作。但是因为操作复
杂,代码量大的缘故。不压代码量小。操作简便。易懂易学的jxl而用户量比较小。我们在使用jxl进行操作之前首先要下载
一个叫做jxl.ar 的包。这个包在附件里面我会上传。下载完之后引入项目里面即可。
既然是操作 excel文件。那么免不了进行增删改查。
首先我们从简单的创建一个excel文件开始。
1.新创建一个excel文件。
/**
*
* createWorkbook(); 传入的是文件对象
*
*/
WritableWorkbook wb = Workbook.createWorkbook(new File("a.xls"));
WritableSheet ws = wb.createSheet("表一", 0);
// 传入一个标签对象,0 0表示1行1列。这里和数组的下标一样都是减一的;
Label la = new Label(0, 0, "第一个位置");
ws.addCell(la);
// 添加一个数字对象这儿的数字可以是整数也可以是浮点数。
Number n = new Number(0, 1, 2000.454);
ws.addCell(n);
wb.write();
// 千万别忘了关闭的情况
wb.close();
// 这样就算是简单的完成了一个写入的操作。
我们的excel是丰富多彩的。不仅仅是简单的文字之类的。我们还需要对文字加上字体和大小。
代码如下:
其实,逻辑很简单。我们是对单元格进行操作的,所以就有一个单元格格式对象WritableCellFormat
只要我们想改变某个单元格的相关格式。比如字体,大小颜色之类的。就在要加入的每种单元格对象后面加上单元格格式 对象。这样我们就可以改变这个单元格的格式了。而我们究竟要改变这个单元格的哪种格式。是字体还是图像还是颜色。那我们就必须交代清楚。这样WritableCellFormat对象传入到单元格对象就知道是具体改变那种格式了
WritableWorkbook wb= Workbook.createWorkbook(new File("a.xls"));
WritableSheet ws= wb.createSheet("表一", 0);
WritableFont wf=new WritableFont( WritableFont.ARIAL,20);
WritableCellFormat cf=new WritableCellFormat(wf);
//传入一个标签对象;
Label la=new Label(0,0,"第一个位置",cf);
ws.addCell(la);
//添加一个数字对象这儿的数字可以是整数也可以是浮点数。
Number n=new Number(0, 1, 2000.454,cf);
ws.addCell(n);
wb.write();
wb.close();
System.out.println("创建完成@!");
上述是生成excel文件的方法。
2.
读取excel的方法。这里有两种方法。一种是从文件里面读取。也就是我们很普遍的方法。另外一种方法是从输入流中读取。 先看事例。
这种方法直接读取:
Workbook wb=Workbook.getWorkbook(new File("a.xls"));
这种方法先将文件编程文件流。然后传入其中
java.io.InputStream in=new java.io.FileInputStream(new File("a.xls"));
Workbook wbb=Workbook.getWorkbook(in);
1.我们先来看看第一种情况。
直接读取
Workbook wb = null;
try {
wb = Workbook.getWorkbook(new File("a.xls"));
// 获取这个excel文件的第1个表;
Sheet sheet = wb.getSheet(0);
// 通过行和列值得到确定的单元格
for (int i = 0; i < 5; i++) {
Cell c = sheet.getCell(i, i);
// 可以直接读取单元格的内容。不管此单元格式什么类型的。字符串型的还是数字型的。还是标签性的。得到的内容都是字符串型的;
String content = c.getContents();
System.out.println("content" + content);
}
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
wb.close();
}
//另外一种就不是一锅端了。而是去判断每个单元格的类型;
Workbook wb = null;
try {
wb = Workbook.getWorkbook(new File("a.xls"));
// 获取这个excel文件的第1个表;
Sheet sheet = wb.getSheet(0);
// 通过行和列值得到确定的单元格
for (int i = 0; i < 5; i++) {
Cell c = sheet.getCell(i, i);
// 判断单元格的类型进行读取;
if (c.getType() == CellType.NUMBER) {
Number no = (Number) c;
System.out.println("no:" + no.getValue());
}
String content = c.getContents();
System.out.println("content" + content);
}
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
wb.close();
}
2.第二种读取文件的方式就不是根据文件名了。而是根据流来进行读取;
最好的例子是我们上传文件的情况。假如我们需要从客户端向浏览器端传送一个文件。那么我们就需要用到这个流对象来保存。
好比这么一个情形。我上传的excel文件在后台要生成对应的excel文件。那么我们最好的方式就是一边写入流。另一边服务器端写出流直接到某个excel文件。
我们的前端是下面的代码:
<body>
<form action="JxlServlet" enctype="multipart/form-data" method="post">
<input type=file name=file />
<input type=submit value='上传图片' />
</form>
</body>
我们会发现一个很神奇的东西 enctype="multipart/form-data" 这在我们以前好像没有加这个东西。那么这么个东西是干啥的呢?
请看下面详解:
application/x-www-form-urlencoded | 在发送前对所有字符进行编码(默认)。 |
multipart/form-data | 不对字符编码。当使用有文件上传控件的表单时,该值是必需的。 |
text/plain | 将空格转换为 "+" 符号,但不编码特殊字符。 |
也就是说我们默认是这种情况:
<form action="demo_post_enctype.asp"
method="post" enctype="application/x-www-form-urlencoded">
First name: <input type="text" name="fname" /><br />
Last name: <input type="text" name="lname" /><br />
<input type="submit" value="Submit" />
</form>
后台代码则是
要是不取出垃圾信息。就会报错。这个垃圾信息我也没有搞明白。希望知情人可以给出解答。
// 获取它的输入流;
ServletInputStream ins = request.getInputStream();
byte[] junk = new byte[1024];
int bytesRead = 0;
// the first four lines are request junk
// 去除掉垃圾信息。
bytesRead = ins.readLine(junk, 0, junk.length);
System.out.println(bytesRead);
bytesRead = ins.readLine(junk, 0, junk.length);
System.out.println(bytesRead);
bytesRead = ins.readLine(junk, 0, junk.length);
System.out.println(bytesRead);
bytesRead = ins.readLine(junk, 0, junk.length);
System.out.println(bytesRead);
try {
Workbook wb = Workbook.getWorkbook(ins);
System.out.println("对象创建成功!");
Sheet s = wb.getSheet(0);
for (int i = 0; i < 5; i++) {
Cell c = s.getCell(i, i);
String content = c.getContents();
System.out.println(content);
}
wb.close();
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这就是两种读取excel文件的方式。
下一节讲述修改和复制excel文件的方式。