实现要点:通过开源项目jExcel提供的jxl.jar包,实现Excel文件的读写。
要求从Excel文件的某个Sheet中读出班级所有同学的名单,然后通过产生一个随机数选中其中一个同学回答问题,然后输入回答问题的得分,并将该得分存入Excel表的另外一个Sheet中。
环境:win10,jdk8
工具:eclipse,Adobe Photoshop CS6,火狐,谷歌
使用的jar包: jxl.jar(对Excel解析)
GUI图形界面
IO流
从文件中选中一个Excel(Excel97-2003)文件,再从Excel文件的某个Sheet中读出班级所有同学的名单,然后通过产生一个随机数函数选中其中一个同学回答来问题,然后在文本输入框里输入得分情况,并将该得分存入Excel表的另外一个Sheet中,如果Excel中不存在分数sheet表的话,系统将会自动创建一个,然后全部赋值分数为0,再进行分数的操作。
功能分析图如下:
Fun.java
package function;
import java.io.File;
import java.io.IOException;
import java.util.List;
import jxl.read.biff.BiffException;
import jxl.write.WriteException;
import window.ErrorWindow;
/***
* 这个类主要处理JxExcel的异常
*/
public class Fun {
JxExcel jce;
public Fun(File file) {
try {
jce = new JxExcel(file);
} catch (BiffException | IOException e) {
e.printStackTrace();
}
}
public List getRowName(String name){
try {
return jce.getRowName(name);
} catch (BiffException | WriteException | IOException | InterruptedException e) {
new ErrorWindow("文件发生错误");
e.printStackTrace();
}
System.out.println("获取名单失败!");
return null;
}
public void addScore(String studentName , int score) {
try {
jce.addScore(studentName, score);
} catch (WriteException | BiffException | IOException e) {
new ErrorWindow("文件发生错误");
e.printStackTrace();
}
}
public String findScore(String studentName) {
try {
return jce.findScore(studentName);
} catch (WriteException | BiffException | IOException e) {
new ErrorWindow("文件发生错误");
e.printStackTrace();
}
return null;
}
}
JxExcel.java
package function;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class JxExcel {
public Workbook wb;
public File file;
public JxExcel(File file) throws BiffException, IOException {
this.file=file;
}
public List getRowName(String name) throws BiffException, IOException, WriteException, InterruptedException {
wb = Workbook.getWorkbook(file);
// InputStream is = new FileInputStream(file);
List list = new ArrayList();
// 2、声明工作簿对象
// Workbook rwb = Workbook.getWorkbook(is);
Sheet oFirstSheet = wb.getSheet(0);
int row = oFirstSheet.getRows();
int col = oFirstSheet.getColumns();
for (int i = 0; i < col; i++) {//找到名字为mame的这列
if(oFirstSheet.getCell(i, 0).getContents().equals(name)) {
col=i;
break;
}
}
for (int i = 1; i < row; i++) {
list.add(oFirstSheet.getCell(col, i).getContents());
}
//获取名单时就创建得分的sheet
Sheet sheet = wb.getSheet(1);
if (sheet==null)createSheel(name);
wb.close();
return list;
}
public void createSheel(String name) throws BiffException, IOException, WriteException, InterruptedException{
//以下是参考博客
// //获得文件
// Workbook wb = Workbook.getWorkbook(new File ("Test.xls"));
// //打开一个文件的副本,并且指定数据写回到原文件
// WritableWorkbook book = Workbook.createWorkbook(new File ("Test.xls"), wb);
// WritableSheet sheet = book.createSheet("sheet_two", 1);
// sheet.addCell(new Label(0,0,"Test data for sheet_two"));
// //输出
// System.out.println(sheet.getCell(0, 0).getContents());
// book.write();
// book.close();
// Workbook wb = Workbook.getWorkbook(file);
wb = Workbook.getWorkbook(file);
WritableWorkbook ww = Workbook.createWorkbook(file,wb);
//第一个sheel
Sheet sheet1 = wb.getSheet(0);
int row = sheet1.getRows();
//创建sheet
WritableSheet sheet2=ww.createSheet("得分", 1);
sheet2.addCell(new Label(1, 0, "分数"));
int col = sheet1.getColumns();
for (int i = 0; i < col; i++) {//找到名字为mame的这列
if(sheet1.getCell(i, 0).getContents().equals(name)) {
col=i;
break;
}
}
for (int i = 0; i < row; i++) {
//第一个参数是列,第二个是行 ,第三个是value
sheet2.addCell(new Label(0, i, sheet1.getCell(col, i).getContents()));
if(i!=0)sheet2.addCell(new Label(1, i, "0"));
}
ww.write();
ww.close();
wb.close();
}
public void addScore(String studentName , int score) throws IOException, RowsExceededException, WriteException, BiffException {
wb = Workbook.getWorkbook(file);
WritableWorkbook ww = Workbook.createWorkbook(file,wb);
Sheet sheet0 = wb.getSheet(1);
WritableSheet sheet = ww.getSheet(1);
int row = sheet.getRows();
for (int i = 1; i < row; i++) {
if(sheet0.getCell(0, i).getContents().toString().equals(studentName)) {
int n = Integer.parseInt(sheet0.getCell(1, i).getContents().toString());
sheet.addCell(new Label(1, i, String.valueOf(n+score)));
}
}
ww.write();
ww.close();
wb.close();
}
public String findScore(String studentName) throws IOException, RowsExceededException, WriteException, BiffException {
wb = Workbook.getWorkbook(file);
Sheet sheet0 = wb.getSheet(1);
int row = sheet0.getRows();
for (int i = 1; i < row; i++) {
if(sheet0.getCell(0, i).getContents().toString().equals(studentName)) {
return sheet0.getCell(1,i).getContents().toString();
}
}
wb.close();
return null;
}
}
RandomNumber.java
package function;
public class RandomNumber {
public int getRandomNumber(int len) {
return (int) (Math.random()*len);
}
}
ErrorWindow.java
package window;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class ErrorWindow {
JFrame jf;
Button bt;
public ErrorWindow(String ss) {
jf = new JFrame("error");
bt = new Button(ss);
bt.setBounds(20, 20, 40, 80);
jf.setSize(320, 200);
jf.setLayout(new BorderLayout());
jf.add(bt,BorderLayout.CENTER);
new MyTool().setJFrameLcotionCenter(jf);
jf.setIconImage(Toolkit.getDefaultToolkit().getImage("img\\close.png"));
bt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jf.dispose();
}
});
jf.setVisible(true);
}
}
MyTool.java
package window;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;
import javax.swing.JFrame;
//给窗体设置图标
public class MyTool {
public void setJFrameImage(JFrame jf) {
Toolkit t1 = Toolkit.getDefaultToolkit();
String ss = "img"+File.separator+"JFrameImage.jpg";
Image image = t1.getImage(ss);
jf.setIconImage(image);
}
//窗体位置自动居中
public void setJFrameLcotionCenter(JFrame jf) {
int jfw = jf.getWidth();
int jfh = jf.getHeight();
Toolkit t1 = Toolkit.getDefaultToolkit();
Dimension screen = t1.getScreenSize();
int winw = screen.width;
int winh = screen.height;
jf.setLocation((winw-jfw)/2,(winh-jfh)/2);
}
}
Window.java
package window;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import function.Fun;
import function.RandomNumber;
public class Window implements ActionListener {
JFrame jf;
JMenuBar bar;
JMenu fileMenu;
JMenuItem openItem, closeItem;
ImageIcon openIcon, closeIcon;
JFileChooser chooser;
JLabel jt1,jt2,jt3,jt4,jt5;
JButton bt1,bt2;
JTextField jtext;
File file;
ArrayList list;
public Window() {
newWindow();
MyTool tool = new MyTool();
tool.setJFrameImage(jf);
jf.setSize(380, 250);
tool.setJFrameLcotionCenter(jf);
jf.setVisible(true);
jf.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void newWindow() {
jf = new JFrame("随机点名器");
jf.setLayout(null);
bar = new JMenuBar(); // new一个菜单条
fileMenu = new JMenu("打开文件"); // 菜单栏里面的菜单
openIcon = new ImageIcon("img\\open.png");
closeIcon = new ImageIcon("img\\close.png");
openItem = new JMenuItem("打开(O)", openIcon);
closeItem = new JMenuItem("关闭(X)", closeIcon);
jt1 = new JLabel("姓名:");
jt2 = new JLabel("***");
jt3 = new JLabel("当前分数:");
jt4 = new JLabel("**");
jt5 = new JLabel("请输入当前得分:");
jtext = new JTextField();
bt1 = new JButton("提交");
bt2 = new JButton("开始抽取");
jt1.setBounds(70, 15, 150, 20);
jt2.setBounds(110, 15, 150, 20);
jt3.setBounds(190, 15, 150, 20);
jt4.setBounds(250, 15, 150, 20);
jt5.setBounds(55, 50, 150, 20);
jtext.setBounds(155, 50, 150, 20);
bt1.setBounds(105, 90, 150, 20);
bt2.setBounds(105, 120, 150, 20);
bt1.addActionListener(new ActionListener() {//提交
public void actionPerformed(ActionEvent e) {
if(file==null) new ErrorWindow("请选取文件");
else {
String name = jt2.getText();
String text = jtext.getText();
int score = 0;
try {
score = Integer.parseInt(text);
} catch (Exception e2) {
new ErrorWindow("请输入正确的数字!");
}
if(!name.equals(null)) new Fun(file).addScore(name, score);
jt4.setText(new Fun(file).findScore(name));
jtext.setText("");
}
}});
bt2.addActionListener(new ActionListener() {//开始抽取
public void actionPerformed(ActionEvent e) {
if(list==null) new ErrorWindow("请选取文件");
else {
RandomNumber ran = new RandomNumber();
String name=(String) list.get(ran.getRandomNumber(list.size()));
jt2.setText(name);
jt4.setText(new Fun(file).findScore(name));
}
}
});
// 添加快捷键
openItem.setMnemonic(KeyEvent.VK_O);
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK));
closeItem.setMnemonic(KeyEvent.VK_X);
closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
// 添加监听器
openItem.addActionListener(this);
closeItem.addActionListener(this);
chooser = new JFileChooser();// Chooser 选择器
jf.setJMenuBar(bar);
bar.add(fileMenu);
jf.add(jt1);
jf.add(jt2);
jf.add(jt3);
jf.add(jt4);
jf.add(jt5);
jf.add(jtext);
jf.add(bt1);
jf.add(bt2);
fileMenu.add(openItem);
fileMenu.add(closeItem);
}
// 按钮事件监听
public void actionPerformed(ActionEvent e) {
JMenuItem performed = (JMenuItem) e.getSource();
if (performed == openItem) {
chooser.showOpenDialog(null);// Dialog 会话
file = chooser.getSelectedFile();
list = (ArrayList) new Fun(file).getRowName("姓名");
} else if (performed == closeItem) {
System.exit(1);
}
}
}
Main.java
package index;
import window.Window;
public class Main {
public static void main(String[] args) {
new Window();
}
}
参考文献:
1 开发调研
1.1 需求描述
MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。作为办公文档,势必要涉及到的电子文档的交换,Excel是一种在企业中非常通用的文件格式,打印和管理也比较方便。在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。
1.2 Excel开发常用开源工具
在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。
1.3 比较开源工具的优缺点
1.3.1 Jxl优缺点
Jxl特征有如下描述:
● 支持Excel 95-2000的所有版本
● 生成Excel 2000标准格式
● 支持字体、数字、日期操作
● 能够修饰单元格属性
● 支持图像和图表
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
1.3.2 Poi优缺点
Jakarta 的 POI Project 与 Java Excel API 在开源世界中可以说是并驾齐驱,但是也各有优劣,poi在某些细节有些小Bug并且不支持写入图片(poi其实可以写入图片,不过没有jxl来的方便,比较麻烦),其他方面都挺不错的;而JXL提供了对图片的支持(但是仅仅支持png格式的图片),问题就是对公式支持不是很好,但还是提供了简单的公式读取支持。因此你的项目中要选用什么样的第三方插件为完全由你的应用来决定。如果你的软件是跟财务有相当的关系的话,建议采用 POI Project,就我所在目前的项目来说由于用不到计算公式,而且很可能需要导出图片,因此,我的选择是 JXL 。
1.4 性能比较以及最终选择
1.4.1 内存消耗:(来自网络)
谈下JVM虚拟机内存消耗的情况.
数据量3000条数据,每条60列.JVM虚拟机内存大小64M.
使用POI:运行到2800条左右就报内存溢出.
使用JXL:3000条全部出来,并且内存还有21M的空间.
可想而知,在对内存的消耗方面差距还是挺大的.
也许是由于JXL在对资源回收利用方面做的还挺不错的。
1.4.2 速度效率(读取excel数据)(来自网络)
文件 POI加载耗时 POI总耗时 JXL加载耗时 Jxl总耗时
文件大小57KB 1172 ms 1172 ms 1265 ms 2250 ms
文件大小652KB 2297 ms 2313 ms 4406 ms 9750 ms
文件大小2.24M 3109ms 3140ms 16313ms 37453ms
1.4.3 写excel速度效率
jxl插入数据比poi速度要快
1.4.4 功能对比
相比提供的功能的话,JXL相对弱了点.所以如果要实现的功能比较复杂的情况下可以考虑使用POI,但如果只想生成一些大数据量可以考虑使用JXL,或者CSV也是一个不错的选择,不过CSV并不是真正的excel,然而jxl插入数据比poi速度要快。
2 Jxl开发指南
2.1 介绍
jxl操作excel包括对象Workbook,Sheet ,Cell。
一个excel就对应一个Workbook对象,
一个Workbook可以有多个Sheet对象
一个Sheet对象可以有多个Cell对象
2.2 读取excel操作
通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作。我们先想想一下读取步骤,不管是什么样的Excel操作框架必定都要经历
1、 选取Excel文件得到工作薄
2、 选择工作表
3、 选择Cell
4、 读取信息
2.2.1 读取工作薄
选取Excel文件得到工作薄Workbook
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
2.2.2 读取工作表
通过Workbook的getSheet方法选择第一个工作表(从0开始)
Sheet sheet = workbook.getSheet(0);
也可以通过工作的名称来得到Sheet
2.2.3 读取单元格
通过Sheet的getCell方法选择位置为C2的单元格(两个参数都从0开始)
Cell c2 = sheet.getCell(2,1);
2.2.3.1 读取单元格的值
2.2.3.2 通过Cell的getContents方法
把单元格中的信息以字符的形式读取出来String stringc2 = c2.getContents();
2.2.3.3 Cell提供了一个getType方法
能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数值、日期类型的单元格
if (c2.getType() == CellType. LABEL)
{
LabelCell nc = (LabelCell) c2;
String number b2 = nc. getString();
}
if (c2.getType() == CellType. DATE)
{
DateCell nc = (DateCell) c2;
Date number b2 = nc. getDate();
}
if (c2.getType() == CellType.NUMBER)
{
NumberCell nc = (NumberCell) c2;
double number b2 = nc.getValue();
}
API提供了以下基本类型,与Excel的数据格式相对应,如下图所示
2.2.4 以释放资源:workbook.close()
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要
最后不要忘记关闭workbook以释放资源:workbook.close();
2.3 写excel操作
通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的插入工作。我们先想想一下插入,不管是什么样的Excel操作框架必定都要经历
1、 创建Exce工作薄
2、 创建工作表
3、 创建单元格
2.3.1 创建工作薄
API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。
2.3.1.1 创建可写入的Excel工作薄
WritableWorkbook
wwb = Workbook.createWorkbook(new File(targetfile));
2.3.1.2 将WritableWorkbook直接写入到输出流
OutputStream os = new FileOutputStream(targetfile);
WritableWorkbook wwb = Workbook.createWorkbook(os);
2.3.2 创建工作表
WritableSheet ws = wwb.createSheet("通讯录", 0);//创建sheet
2.3.3 创建单元格
2.3.3.1 添加文本类单元格
Label labelC = new Label(0, 0, "This is a Label cell");
2.3.3.2 添加带有字型Formatting的对象
WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableCellFormat wcfF = new WritableCellFormat(wf);
labelCF = new Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);
2.3.3.3 添加带有字体颜色Formatting的对象
WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
Label labelCFC = new Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);
2.3.3.4 添加Number对象
Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);
2.3.3.5 添加带有formatting的Number对象
NumberFormat nf = new NumberFormat("#.##");
WritableCellFormat wcfN = new WritableCellFormat(nf);
Number labelNF = new Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
2.3.3.6 添加Boolean对象
Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
2.3.3.7 添加DateTime对象
DateTime labelDT = new DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
2.3.3.8 添加带有formatting的DateFormat对象
DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDTF = new DateTime(1, 3, new Date(), wcfDF);
ws.addCell(labelDTF);
2.3.3.9 添加公式单元格
Fornual formual = new Formual(0,11,”Sum(A1:A9)”);
wrb.addCell(formual);
2.3.3.10 添加图像
WritableImage wrimage=new WritableImage(1,5,10,10,new File(imageFilepath));
wrb.addImage(wrimage);
注意,API中注明只支持png文件。
2.3.4 合并单元格
通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的。
表示将从第x+1列,y+1行到m+1列,n+1行合并 (四个点定义了两个坐标,左上角和右下角)结果是合并了m-x+1行,n-y+1列,两者乘积就是合并的单元格数量。
sheet.mergeCells(0, 6, 3, 8);
label = new Label(0, 6, "合并了12个单元格");
sheet.addCell(label);
2.3.5 添加单元格样式
主要是改变单元格背景、字体、颜色等等。
WritableCellFormat wc = new WritableCellFormat();
wc.setAlignment(Alignment.CENTRE); // 设置居中
wc.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
wc.setBackground(jxl.format.Colour.RED); // 设置单元格的背景颜色
label = new Label(1, 5, "字体", wc);
sheet.addCell(label);
2.3.6 设置单元格字体
WritableFont wfont =
new WritableFont(WritableFont.createFont("楷书"), 20);
WritableCellFormat font = new WritableCellFormat(wfont);
label = new Label(2, 6, "楷书", font);
sheet.addCell(label);
2.3.7 写入到文件
wwb.write();// 写入数据
wwb.close();// 关闭文件
2.4 拷贝、更新Excel工作薄
//创建只读的Excel工作薄的对象
jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
//创建可写入的Excel工作薄对象
WritableWorkbook wwb=Workbook.createWorkbook(new File(targetfile), rw);
//读取第一张工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);
//获得第一个单元格对象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
//判断单元格的类型, 做出相应的转化
if(wc.getType() == CellType.LABEL)
{
Label l = (Label)wc;
l.setString("The value has been modified.");
}
//写入Excel对象
wwb.write();
//关闭可写入的Excel对象
wwb.close();
//关闭只读的Excel对象
rw.close();
为了提高性能,在读取工作表时,与数据相关的一些输出信息,所有的格式信息,如:字体、颜色等等,是不被处理的,因为我们的目的是获得行数据的值,既使没有了修饰,也不会对行数据的值产生什么影响。唯一的不利之处就是,在内存中会同时保存两个同样的工作表,这样当工作表体积比较大时,会占用相当大的内存,但现在好像内存的大小并不是什么关键因素了。
一旦获得了可写入的工作表对象,我们就可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()方法,因为单元格已经于工作表当中,所以我们只需要调用相应的setXXX()方法,就可以完成更新的操作了。
尽单元格原有的格式化修饰是不能去掉的,我们还是可以将新的单元格修饰加上去,以使单元格的内容以不同的形式表现。
新生成的工作表对象是可写入的,我们除了更新原有的单元格外,还可以添加新的单元格到工作表中。
最后,不要忘记调用write()方法,将更新的内容写入到文件中,然后关闭工作薄对象,这里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的。
4 jxl常用api
4.1.1 1、Workbook类提供的方法
int getNumberOfSheets() 获取工作表的总个数
Sheet[] getSheets() 获取数组型的工作表
Sheet getSheet(String name);//得到此对应名称的工作表
4.1.2 2、Sheet接口提供的方法
String getName() 获取工作表的名称
int getColumns() 获取Sheet表中所包含的总列数
Cell[] getColumn(int column) 获取某一列的所有单元格,
返回的是单元格对象数组
int getRows() 获取Sheet表中所包含的总行数
Cell[] getRow(int row) 获取某一行的所有单元格,返回的是单元格对象数组
Cell getCell(int column, int row)获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同
WritableSheet.setRowView(int i,int height); 指定第i+1行的高度
WritableSheet.setColumnView(int i,int width); 指定第i+1列的