Excel开发

来源:互联网 发布:淘宝店铺标志设计尺寸 编辑:程序博客网 时间:2024/06/05 17:07

在Excel开发常用开源工具:

在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。
比较开源工具的优缺点:
1.Jxl优缺点
Jxl特征有如下描述:
● 支持Excel 95-2000的所有版本
● 生成Excel 2000标准格式
● 支持字体、数字、日期操作
● 能够修饰单元格属性
● 支持图像和图表
这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
2.Poi优缺点
Jakarta 的 POI Project 与 Java Excel API 在开源世界中可以说是并驾齐驱,但是也各有优劣,poi在某些细节有些小Bug并且不支持写入图片(poi其实可以写入图片,不过没有jxl来的方便,比较麻烦),其他方面都挺不错的;而JXL提供了对图片的支持(但是仅仅支持png格式的图片),问题就是对公式支持不是很好,但还是提供了简单的公式读取支持。因此你的项目中要选用什么样的第三方插件为完全由你的应用来决定。如果你的软件是跟财务有相当的关系的话,建议采用 POI Project,就我所在目前的项目来说由于用不到计算公式,而且很可能需要导出图片,因此,我觉得 JXL比较好点 。

Jxl开发指南:
介绍
jxl操作excel包括对象Workbook,Sheet ,Cell。
一个excel就对应一个Workbook对象,
一个Workbook可以有多个Sheet对象
一个Sheet对象可以有多个Cell对象

创建excel表:

写excel操作
通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的插入工作。我们先想想一下插入,不管是什么样的Excel操作框架必定都要经历
1、 创建Exce工作薄
2、 创建工作表
3、 创建单元格
案例:
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class WriteExcel {
public static void main(String[] args) throws IOException,
RowsExceededException, WriteException {

    // 1、创建WritableWorkbook对象      Random random=new Random();    int nextInt = random.nextInt();    String filePath="file"+nextInt+new SimpleDateFormat("yyyy-MM-dd").format(new Date());    File file = new File("D:/"+filePath+".xls");      WritableWorkbook writeBook = Workbook.createWorkbook(file);      // 2、新建工作表(sheet)对象,并声明其属于第几页      WritableSheet firstSheet = writeBook.createSheet("工作簿01", 1);// 第一个参数为工作簿的名称,第二个参数为页数      WritableSheet secondSheet = writeBook.createSheet("工作簿02", 0);      // 3、创建单元格(Label)对象,      Label label1 = new Label(1, 2, "test1");// 第一个参数指定单元格的列数、第二个参数指定单元格的行数,第三个指定写的字符串内容      firstSheet.addCell(label1);      Label label2 = new Label(1, 2, "test2");      secondSheet.addCell(label2);      // 4、打开流,开始写文件      writeBook.write();      // 5、关闭流      writeBook.close();  }  

}

读取excel操作

通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作。我们先想想一下读取步骤,不管是什么样的Excel操作框架必定都要经历
1、 选取Excel文件得到工作薄
2、 选择工作表
3、 选择Cell
4、 读取信息
读取工作薄
选取Excel文件得到工作薄Workbook
Workbook workbook = Workbook.getWorkbook(new File(“myfile.xls”));
读取工作表
通过Workbook的getSheet方法选择第一个工作表(从0开始)
Sheet sheet = workbook.getSheet(0);
也可以通过工作的名称来得到Sheet
读取单元格
通过Sheet的getCell方法选择位置为C2的单元格(两个参数都从0开始)
Cell c2 = sheet.getCell(2,1);

读取单元格的值
通过Cell的getContents方法
把单元格中的信息以字符的形式读取出来String stringc2 = c2.getContents();
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的数据格式相对应,如下图所示

以释放资源:workbook.close()
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要
最后不要忘记关闭workbook以释放资源:workbook.close();
案例:
package com.cn;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class ReadText {

public static void main(String[] args) throws BiffException, IOException {      // 1、构造excel文件输入流对象      //注意改路径下的文件必须存在    String sFilePath = "D://write.xls";      InputStream is = new FileInputStream(sFilePath);    // 2、声明工作簿对象      Workbook rwb = Workbook.getWorkbook(is);      // 3、获得工作簿的个数,对应于一个excel中的工作表个数      rwb.getNumberOfSheets();      // 使用索引形式获取第一个工作表,也可以使用rwb.getSheet(sheetName);其中sheetName表示的是工作表的名称      Sheet oFirstSheet = rwb.getSheet(0);    int rows = oFirstSheet.getRows();//获取工作表中的总行数      int columns = oFirstSheet.getColumns();//获取工作表中的总列数      for (int i = 0; i < rows; i++) {          for (int j = 0; j < columns; j++) {              //需要注意的是这里的getCell方法的参数,第一个是指定第几列,第二个参数才是指定第几行             Cell oCell= oFirstSheet.getCell(j,i);             System.out.println(oCell.getContents()+"\r\n");          }      }  }  

}

合并单元格

通过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);
案例:
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
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 MergeCell {
public static void main(String[] args) throws IOException,
RowsExceededException, WriteException, BiffException {

    // 1、创建WritableWorkbook对象          Random random=new Random();    int nextInt = random.nextInt();    String filePath="file"+nextInt+new SimpleDateFormat("yyyy-MM-dd").format(new Date());    //该路径下的每次创建的文件不能是同一个。如果是同一个就报错    File file = new File("D:/"+filePath+".xls");     WritableWorkbook oWritableBK = Workbook.createWorkbook(file);      // 2、创建WritableSheet对象      WritableSheet oWritableSheet = oWritableBK.createSheet("testsheet1", 0);      // 3、添加单元格      Label label1 = new Label(0, 0, "test1");      oWritableSheet.addCell(label1);      //第一個參數與第二個參數都是指行和列的位置    Label label30 = new Label(3, 1, "我是合并后的单元格!");      oWritableSheet.addCell(label30);      //4、 合并单元格      oWritableSheet.mergeCells(3,1, 9, 1);// 参数说明,前两个参数为待合并的起始单元格位置,后两个参数用来指定结束单元格位置(列和行)      oWritableBK.write();      oWritableBK.close();  }  

}

原创粉丝点击