jxl操作excel(报表)

报表打印   2008-05-31 10:02   阅读2   评论1  
字号:    

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

评论(?)
阅读(?)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009