jxl操作excel(报表)
import jxl.Workbook;
import jxl.write.WritableWorkbook;
import jxl.Cell;
import jxl.Sheet;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;
import jxl.write.WritableSheet;
import jxl.write.Label;
import jxl.write.WritableFont;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont.FontName;
import jxl.format.UnderlineStyle; // final class
import jxl.format.Colour;
import jxl.write.WritableCell;
import java.io.FileInputStream;
import java.io.InputStream;
import jxl.CellType;
import jxl.LabelCell;
import jxl.NumberCell;
import jxl.BooleanCell;
import jxl.DateCell;
public class JXLTest
{
private final static String fileName = "sourceFile.xls";
public static void main(String[] args)
{
writerXLSFile();
readXLSFile();
updateXLSFile();
}
//生成新的Excel工作薄
private static void writerXLSFile()
{
try
{
// File fl = new File(fileName);
// fl.createNewFile();
//Workbook abstract class 创建readOnly对象
// Workbook wb = Workbook.getWorkbook(fl);
//创建可写的工作薄 WritableWorkbook 对象 abstract class
/*
*使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象,
*这里要注意的是,只能通过API提供的工厂方法来创建Workbook,
*而不能使用WritableWorkbook的构造函数,因为类WritableWorkbook的构造函数为protected类型
*/
OutputStream ops = new FileOutputStream(fileName);
WritableWorkbook wwb = Workbook.createWorkbook(ops);
/*创建工作表的方法与创建工作薄的方法几乎一样,同样是通过工厂模式方法获得相应的对象,
*该方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
//创建可写的工作表 interface
WritableSheet ws = wwb.createSheet("firstJXL",0);
//1.添加Label对象
Label labelC = new Label(0, 0, "This is a Label cell");
ws.addCell(labelC);
//添加带有字型Formatting的对象
WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableCellFormat wcfF = new WritableCellFormat(wf);
Label labelCF = new Label(1, 0, "This is a Label Cell", wcfF);
//ws.addCell(labelCF);
//添加带有字体颜色Formatting的对象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,UnderlineStyle.SINGLE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);
//2.添加Number对象
jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);
//添加带有formatting的Number对象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
//3.添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
//4.添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
//添加带有formatting的DateFormat对象
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);
/* 第一点,在构造单元格时,单元格在工作表中的位置就已经确定了。
*一旦创建后,单元格的位置是不能够变更的,尽管单元格的内容是可以改变的。
*第二点,单元格的定位是按照下面这样的规律(column, row),而且下标都是从0开始,
*例如,A1被存储在(0, 0),B1被存储在(1, 0)。
*最后,不要忘记关闭打开的Excel工作薄对象,以释放占用的内存
*/
//写入excel 工作表
wwb.write();
//关闭工作薄
wwb.close();
/*
*这可能与读取Excel文件的操作有少少不同,在关闭Excel对象之前,
*你必须要先调用write()方法,因为先前的操作都是存储在缓存中的
*所以要通过该方法将操作的内容保存在文件中
*如果你先关闭了Excel对象,那么只能得到一张空的工作薄了。
*/
}
catch(Exception ie)
{
//throw new BusinessException(ie.printStackTrace());
ie.printStackTrace();
}
//catch()
}
//从Excel文件读取数据表
public static void readXLSFile()
{
try
{
//从输入流创建Workbook
InputStream is = new FileInputStream(fileName);
Workbook wb = Workbook.getWorkbook(is);
//获得第1张工作表
Sheet se = wb.getSheet(0);
//Sheet se = wb.getSheet("firstJXL");
/*
*通过Sheet的名称来访问它,也可以通过下标来访问它。
*如果通过下标来访问的话,要注意的一点是下标从0开始,
*就像数组一样
*/
//获得行数
int rows = se.getRows();
// System.out.println (rows);
//获得列数
int cols = se.getColumns();
// System.out.println (cols);
//遍历工作(按行循环)表获得单元格
for(int i=0;i<rows;i++)
{
for(int j =0;j<cols;j++)
{
Cell cell = se.getCell(j,i);
System.out.println(cell.getContents()+"\t");
}
}
/*
*如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回
*如果有需要知道Cell内容的确切类型,API也提供了一系列的方法
*按列循环
*/for(int i=0;i<cols;i++)
{
for(int j =0;j<rows;j++)
{
Cell cell = se.getCell(i,j);
if(cell.getType() == CellType.LABEL)
{
LabelCell lc = (LabelCell)cell;
System.out.println (lc.getString());
}
else if(cell.getType() == CellType.NUMBER)
{
NumberCell nc = (NumberCell)cell;
System.out.println (nc.getValue());
}
else if(cell.getType() == CellType.BOOLEAN)
{
BooleanCell bc = (BooleanCell)cell;
System.out.println (bc.getValue());
}
else if(cell.getType() == CellType.DATE)
{
DateCell dc = (DateCell)cell;
System.out.println (dc.getDate());
}
}
}
/*
*当你完成对Excel电子表格数据的处理后,
*一定要使用close()方法来关闭先前创建的对象
*以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要
*/
wb.close();
/*
*Java Excel API提供了许多访问Excel数据表的方法,在这里我只简要地介绍几个常用的方法,
*其它的方法请参考附录中的Java Excel API Document。
Workbook类提供的方法
1. int getNumberOfSheets()
获得工作薄(Workbook)中工作表(Sheet)的个数,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
int sheets = rwb.getNumberOfSheets();
2. Sheet[] getSheets()
返回工作薄(Workbook)中工作表(Sheet)对象数组,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
Sheet[] sheets = rwb.getSheets();
3. String getVersion()
返回正在使用的API的版本号,好像是没什么太大的作用。
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
String apiVersion = rwb.getVersion();
Sheet接口提供的方法
1) String getName()
获取Sheet的名称,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
String sheetName = rs.getName();
2) int getColumns()
获取Sheet表中所包含的总列数,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsColumns = rs.getColumns();
3) Cell[] getColumn(int column)
获取某一列的所有单元格,返回的是单元格对象数组,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getColumn(0);
4) int getRows()
获取Sheet表中所包含的总行数,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsRows = rs.getRows();
5) Cell[] getRow(int row)
获取某一行的所有单元格,返回的是单元格对象数组,示例子:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getRow(0);
6) Cell getCell(int column, int row)
获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同。
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell cell = rs.getCell(0, 0);
*/
}
catch(Exception e)
{
e.printStackTrace();
}
}
//拷贝、更新Excel工作薄
/*
*主要是下面二步操作,第一步是构造只读的Excel工作薄,
*第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄
*/
public static void updateXLSFile()
{
try
{
//创建只读的Excel工作薄的对象
Workbook rw = Workbook.getWorkbook(new File(fileName));
//创建可写入的Excel工作薄对象
WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream("targetFile.xls"),rw);
//WritableWorkbook wwb = Workbook.createWorkbook(new File("targetFile.xls"), rw);
//读取第一张工作表
WritableSheet ws = wwb.getSheet(0);
//获得第一个单元格对象
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();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
here down jxlAPI http://www.andykhan.com/jexcelapi/download.html