excel 读取

JXL(Java Excel API)是一个用来动态读写Excel文件的开源框架,利用它可以在任何支持Java的操作系统上动态读写Excel文件。
JXL的主页是:http://www.andykhan.com/jexcelapi/,可以在这里下载到它的最新的版本。

你可以分别通过如下命令

java -jar jxl.jar -xml test.xls

java -jar jxl.jar -cvs test.xls

以xml和cvs格式查看test.xls,这是因为JXL作者实现了一个用来演示的jxl.demo.Demo的类。
当然我们使用JXL主要是用它来动态读写Excel文件。现在就来看看JXL在对Excel的读和写上都提供了那些支持。
先来看看Excel文件中都有写上面对象

1 文件对象 2工作簿对象 3 单元格对象。

相应的在JXL中就有Workbook,Sheet ,Cell 。通过这三个对象我们就可以实现Excel文件的读取工作。
我们先想想一下读取步骤,不管是什么样的Excel操作框架必定都要经历
1选取Excel文件,2选择工作簿,3选择Cell,4读取信息。

那么现在就可以看看JXL中这四步骤如何体现:

//通过Workbook的静态方法getWorkbook选取Excel文件
Workbook workbook = Workbook.getWorkbook(new File("Book1.xls"));

//通过Workbook的getSheet方法选择第一个工作簿(从0开始)
Sheet sheet = workbook.getSheet(0);
//通过Sheet方法的getCell方法选择位置为C2的单元格(两个参数都从0开始)
Cell c2 = sheet.getCell(2,1);
//通过Cell的getContents方法把单元格中的信息以字符的形式读取出来
String stringc2 = c2.getContents();

可以看到正是刚才所说的四个步骤。
我们都知道Excel单元格是有格式的,那么这些信息如何取得。
Cell提供了一个getType方法能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数值、日期类型的单元格。所以我们可以这样写:
if (c2.getType() == CellType.NUMBER)
{
NumberCell nc = (NumberCell) c2;
numberb2 = nc.getValue();
}
最后不要忘记关闭workbook以释放资源:
workbook.close();

public static String readExcel(String excelFileName) {
// 创建一个list 用来存储读取的内容
Workbook rwb = null;
Cell cell = null;
String str = "";
try {
// 创建输入流
InputStream stream = new FileInputStream(excelFileName);

// 获取Excel文件对象
rwb = Workbook.getWorkbook(stream);

// 获取文件的指定工作表 默认的第一个
Sheet sheet = rwb.getSheet(0);
for (int i = 0; i < sheet.getRows(); i++) {

// 获取 第一列的所有值
cell = sheet.getCell(0, i);

//得到单元个的数据类型
System.out.println("*********8"+cell.getType());
str +=cell.getContents();
}

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
// 返回值集合
return str;
}




public static void writeExcel() {
//第一步是创建一个工作簿可写上使用Workbook类的工厂方法
WritableWorkbook workbook;
try {
//G:\\Book1.xls需存在
workbook = Workbook.createWorkbook(new File("G:\\Book1.xls"));
//创建在第一个位置称为“第一单”一表。
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
//下面的代码片段放在一个单元格A3中的标签,
Label label = new Label(0, 2, "A label record");
sheet.addCell(label);
//并在单元格D5数字3.14159。
jxl.write.Number number = new jxl.write.Number(3, 4, 3.1459);
System.out.println("******************************"+number);
sheet.addCell(number);
//一旦你添加完表和单元格到工作簿,您调用write()的工作簿,然后关闭该文件。这最后一步产生的输出文件(在此情况下output.xls),它可能是由Excel读取。如果你调用close(不调用的write())第一,一个完全空白的文件将被生成。

workbook.write();
workbook.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


JExcelApi的版本可以读取本地文件系统或从输入流中存储的文件,Excel电子表格。阅读的第一步从一个文件或电子表格输入流创建一个工作簿。下面的代码片段演示如何创建一个从文件在本地文件系统的工作簿。
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
(注意:当创建一个从ServletInputStream您必须删除在创建Workbook对象的HTTP头信息的电子表格。)一旦您访问工作簿,您可以用它来访问单个表。这些都是零索引 - 第一个表为0,第二页为1,依此类推。 (您也可以使用API来检索按名称表)。
Sheet sheet = workbook.getSheet(0);
一旦你有一个表,然后你可以进入细胞。您可以通过使用检索方便的方法getContents()作为字符串单元格的内容。在下面的示例代码,A1是一个文本单元,数值为B2和C2是一个日期。这些细胞可以访问的内容如下
Cell a1 = sheet.getCell(0,0);
Cell b2 = sheet.getCell(1,1);
Cell c2 = sheet.getCell(2,1);

String stringa1 = a1.getContents();
String stringb2 = b2.getContents();
String stringc2 = c2.getContents();
演示程序CSV.java和XML.java使用便捷方法getContents()为了输出电子表格的内容。但是,如果它是需要访问的确切类型,即单元格的内容。作为一个数值或一个日期,然后检索细胞必须被强制转换为正确的类型和适当的方法调用。下面的代码段说明了如何JExcelApi的版本,可用于检索一个真正的Java双和java.util.Date从Excel电子表格对象。为了完整的标签也转换为它的正确的类型,虽然在实践中,这没有什么区别。这个例子还说明如何确认预期的细胞类型 - 这可能是有用的电子表格时,已确认在正确的位置细胞。
String stringa1 = null;
double numberb2 = 0;
Date datec2 = null;

Cell a1 = sheet.getCell(0,0);
Cell b2 = sheet.getCell(1,1);
Cell c2 = sheet.getCell(2,1);

if (a1.getType() == CellType.LABEL)
{
LabelCell lc = (LabelCell) a1;
stringa1 = lc.getString();
}

if (b2.getType() == CellType.NUMBER)
{
NumberCell nc = (NumberCell) b2;
numberb2 = nc.getValue();
}

if (c2.getType() == CellType.DATE)
{
DateCell dc = (DateCell) c2;
datec2 = dc.getDate();
}

当您完成处理所有的细胞,使用close()方法。这将释放分配的内存时使用任何电子表格和阅读是阅读时特别重要的大型电子表格。
workbook.close();

写作电子表格
电子表格基础写作本节介绍如何写出不带任何格式信息的简单的电子表格数据,如字体或小数。同样地阅读电子表格,第一步是创建一个工作簿可写上使用Workbook类的工厂方法。

import java.io.File;
import java.util.Date;
import jxl.*;
import jxl.write.*;

...

WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls"));

这将创建工作簿对象。生成的文件将位于当前工作目录,称为“output.xls”。该API还可以用来传送工作簿,直接到输出流,例如。从Web服务器到用户的浏览器。如果HTTP头设置正确,那么这将启动Excel并显示生成的电子表格。下一阶段是创建工作簿表。再次,这是一个工厂方法,该方法的工作表和位置,将占据在工作簿的名称。下面的代码片断创建在第一个位置称为“第一单”一表。
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
现在,所有剩下的工作就是添加到工作表的单元格。这是一个简单的实例单元格对象并将它们添加到工作表的问题。下面的代码片段放在一个单元格A3中的标签,并在单元格D5数字3.14159。
Label label = new Label(0, 2, "A label record");
sheet.addCell(label);

Number number = new Number(3, 4, 3.1459);
sheet.addCell(number);
这里有两点需要注意这里。首先,细胞的表中的位置被指定为构造函数的信息的一部分。一旦创建,它是无法改变一个单元格的位置,尽管单元格的内容可能被改变。另一点要注意的是,该单元格的位置指定为(列,行)。两者都是零的整数索引值 - A1的正代表(0,0),B1的(1,0),由(0,1),A2和等。一旦你添加完表和单元格到工作簿,您调用write()的工作簿,然后关闭该文件。这最后一步产生的输出文件(在此情况下output.xls),它可能是由Excel读取。如果你调用close(不调用的write())第一,一个完全空白的文件将被生成。
...
// All sheets and cells added. Now write out the workbook
workbook.write();
workbook.close();
添加格式信息上一节说明生成一个Excel兼容的电子表格使用JExcelApi的版本的基础知识。然而,由于它代表Excel将默认的字体呈现的数据,并会显示数字为3位小数。为了提供格式信息到Excel,我们必须重载的构造函数,它带有一个额外的对象包含该单元格的格式信息(包括字体和样式)的使用。下面的代码片段演示如何创建一个为新细明体10点字体标记细胞。

// Create a cell format for Arial 10 point font
WritableFont arial10font = new WritableFont(WritableFont.ARIAL, 10);
WritableCellFormat arial10format = new WritableCellFormat (arial10font);

// Create the label, specifying content and format
Label label2 = new Label(1,0, "Arial 10 point label", arial10format);
sheet.addCell(label2);

单元格格式对象是共享的,所以许多细胞可能使用相同的格式对象,例如。
Label label3 = new Label(2, 0, "Another Arial 10 point label", arial10format);
sheet.addCell(label3);

这将创建另一个具有相同格式的标签,在单元格C1。因为细胞格式共享,这是不可能改变一个单元格的格式对象的内容。 (如果这是允许的,然后改变对象的内容可以对工作簿的其他人看起来意外repurcussions)。为了改变的一个特定的单元格显示,该API允许您指定一个新的格式,单个单元格的方式。为WritableFont对象的构造有很多重载。通过举例来说,下面的代码片段中创建一个标签时报16点,粗体斜体并将其分配给D1的位置。

// Create a cell format for Times 16, bold and italic
WritableFont times16font = new WritableFont(WritableFont.TIMES, 16, WritableFont.BOLD, true);
WritableCellFormat times16format = new WritableCellFormat (times16font);

// Create the label, specifying content and format
Label label4 = new Label(3,0, "Times 16 bold italic label", times16format);
sheet.addCell(label4);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值