`
王树雄
  • 浏览: 239286 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

浅谈jxl解析excel —————生成、读取excel表

阅读更多

寒假以后在做移动的项目。关于权限控制了。最近移动的项目经理让我额外做一个简单系统实现。大概是这样的。

他给我两张暗访问卷的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文件的方式。

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 贝塔ZQ 2017-07-04  
之前用过jxl实现生成excel文件,后来找了插件PageOffice用着更方便点 

相关推荐

Global site tag (gtag.js) - Google Analytics