<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    J2EE 學(xué)習(xí)

    java struts1、struts2 spring hibernate freemarker ajax fckeditor Mysql MSSQL ORACLE DB2 Websphere jboss
    隨筆 - 11, 文章 - 13, 評(píng)論 - 2, 引用 - 0
    數(shù)據(jù)加載中……

    java解析并且操作excel 方法

    最近需求變化,需要把excel導(dǎo)入  我以前沒(méi)有做過(guò),所以我查了一些資料 和參考別人的代碼
        以下是多種方式:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

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

    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;


    public class ExcelOpt {
     /**
      * 生成一個(gè)Excel文件 jxl
         * @param fileName  要生成的Excel文件名 
         * @jxl.jar 版本:2.6
         */  
        public static void writeExcel(String fileName){   
            WritableWorkbook wwb = null;   
            try {   
                //首先要使用Workbook類(lèi)的工廠方法創(chuàng)建一個(gè)可寫(xiě)入的工作薄(Workbook)對(duì)象   
                wwb = Workbook.createWorkbook(new File(fileName));
              
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
            if(wwb!=null){   
                //創(chuàng)建一個(gè)可寫(xiě)入的工作表   
                //Workbook的createSheet方法有兩個(gè)參數(shù),第一個(gè)是工作表的名稱(chēng),第二個(gè)是工作表在工作薄中的位置   
                WritableSheet ws = wwb.createSheet("工作表名稱(chēng)", 0);   
                   
                //下面開(kāi)始添加單元格   
                for(int i=0;i<10;i++){   
                    for(int j=0;j<5;j++){   
                        //這里需要注意的是,在Excel中,第一個(gè)參數(shù)表示列,第二個(gè)表示行   
                        Label labelC = new Label(j, i, "這是第"+(i+1)+"行,第"+(j+1)+"列");
                        try {   
                            //將生成的單元格添加到工作表中   
                            ws.addCell(labelC);   
                        } catch (RowsExceededException e) {   
                            e.printStackTrace();   
                        } catch (WriteException e) {   
                            e.printStackTrace();   
                        }   
      
                    }   
                }   
      
                try {   
                    //從內(nèi)存中寫(xiě)入文件中   
                    wwb.write();   
                    //關(guān)閉資源,釋放內(nèi)存   
                    wwb.close();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                } catch (WriteException e) {   
                    e.printStackTrace();   
                }   
            }   
        }
       
        /**   
         *   生成一個(gè)Excel文件POI
         *   @param   inputFile   輸入模板文件路徑  
         *   @param   outputFile   輸入文件存放于服務(wù)器路徑  
         *   @param   dataList   待導(dǎo)出數(shù)據(jù)  
         *   @throws   Exception  
         *   @roseuid:  
         */

        public static void exportExcelFile(String inputFile,String outputFile,List dataList) throws Exception{
      //用模板文件構(gòu)造poi  
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(inputFile));
      //創(chuàng)建模板工作表  
      HSSFWorkbook templatewb = new HSSFWorkbook(fs);
      //直接取模板第一個(gè)sheet對(duì)象  
      HSSFSheet templateSheet = templatewb.getSheetAt(1);
      //得到模板的第一個(gè)sheet的第一行對(duì)象   為了得到模板樣式  
      HSSFRow templateRow = templateSheet.getRow(0);

      //HSSFSheet   timplateSheet   =   templatewb.getSheetAt(1);  
      //取得Excel文件的總列數(shù)  
      int columns = templateSheet.getRow((short) 0)
        .getPhysicalNumberOfCells();
    //  Debug.println("columns   is   :   " + columns);  //=========================
      //創(chuàng)建樣式數(shù)組  
      HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];

      //一次性創(chuàng)建所有列的樣式放在數(shù)組里  
      for (int s = 0; s < columns; s++) {
       //得到數(shù)組實(shí)例  
       styleArray[s] = templatewb.createCellStyle();
      }
      //循環(huán)對(duì)每一個(gè)單元格進(jìn)行賦值    
      //定位行  
      for (int rowId = 1; rowId < dataList.size(); rowId++) {
       //依次取第rowId行數(shù)據(jù)   每一個(gè)數(shù)據(jù)是valueList  
       List valueList = (List) dataList.get(rowId - 1);
       //定位列  
       for (int columnId = 0; columnId < columns; columnId++) {
        //依次取出對(duì)應(yīng)與colunmId列的值  
        //每一個(gè)單元格的值  
        String dataValue = (String) valueList.get(columnId);
        //取出colunmId列的的style  
        //模板每一列的樣式  
        HSSFCellStyle style = styleArray[columnId];
        //取模板第colunmId列的單元格對(duì)象  
        //模板單元格對(duì)象  
        HSSFCell templateCell = templateRow.getCell((short) columnId);
        //創(chuàng)建一個(gè)新的rowId行   行對(duì)象  
        //新建的行對(duì)象    
        HSSFRow hssfRow = templateSheet.createRow(rowId);
        //創(chuàng)建新的rowId行   columnId列   單元格對(duì)象  
        //新建的單元格對(duì)象  
        HSSFCell cell = hssfRow.createCell((short) columnId);
        //如果對(duì)應(yīng)的模板單元格   樣式為非鎖定  
        if (templateCell.getCellStyle().getLocked() == false) {
         //設(shè)置此列style為非鎖定  
         style.setLocked(false);
         //設(shè)置到新的單元格上  
         cell.setCellStyle(style);
        }
        //否則樣式為鎖定  
        else {
         //設(shè)置此列style為鎖定  
         style.setLocked(true);
         //設(shè)置到新單元格上  
         cell.setCellStyle(style);
        }
        //設(shè)置編碼  
        cell.setEncoding(HSSFCell.ENCODING_UTF_16);
        //Debug.println("dataValue   :   "   +   dataValue);  
        //設(shè)置值   統(tǒng)一為String  
        cell.setCellValue(dataValue);
       }
      }
      //設(shè)置輸入流  
      FileOutputStream fOut = new FileOutputStream(outputFile);
      //將模板的內(nèi)容寫(xiě)到輸出文件上  
      templatewb.write(fOut);
      fOut.flush();

      //操作結(jié)束,關(guān)閉文件  
      fOut.close();

     }
       
        /**
         * 導(dǎo)出數(shù)據(jù)為XLS格式
         * @param fos 生成Excel文件Path
         * @param bo 要導(dǎo)入的數(shù)據(jù)
         */
        public static void  writeExcelBo(String fos, java.util.List ve)
        {
         jxl.write.WritableWorkbook wwb;
         try
         {
          wwb= Workbook.createWorkbook(new File(fos));
          jxl.write.WritableSheet ws= wwb.createSheet("上市新書(shū)", 10);
          ws.addCell(new jxl.write.Label(0, 1, "書(shū)名"));
          ws.addCell(new jxl.write.Label(1, 1, "作者"));
          ws.addCell(new jxl.write.Label(2, 1, "定價(jià)"));
          ws.addCell(new jxl.write.Label(3, 1, "出版社"));
          int bookSize=ve.size();
          BookVO book = new BookVO();
          for (int i= 0; i < bookSize; i++)
          {
           book= (BookVO)ve.get(i);
           ws.addCell(new jxl.write.Label(0, i + 2, "" + book.getBookName()));
           ws.addCell(new jxl.write.Label(1, i + 2, book.getBookAuthor()));
           ws.addCell(new jxl.write.Label(2, i + 2, "" + book.getBookPrice()));
           ws.addCell(new jxl.write.Label(3, i + 2, book.getBookConcern()));

          }
         // jxl.write.WritableFont wfc=
          //new jxl.write.WritableFont(WritableFont.ARIAL,255,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLACK);
          //jxl.write.WritableCellFormat wcfFC= new jxl.write.WritableCellFormat(wfc);
          ws.addCell(new jxl.write.Label(0, 0, "2007年07月即將上市新書(shū)!"));
          wwb.write();
          // 關(guān)閉Excel工作薄對(duì)象
          wwb.close();
         } catch (IOException e){
         } catch (RowsExceededException e){
         
         } catch (WriteException e){
         }
        }
       
        public static void main(String[] args) {
         writeExcel("c:\\Test測(cè)試Excel.xls");
         System.out.println("OK");
         ArrayList list = new ArrayList();
         
         for (int i = 0; i < 10; i++) {
          BookVO book = new BookVO();
          book.setBookName("WebWork in action+"+i);
          book.setBookAuthor("唐勇+"+i);
          book.setBookPrice("39元+"+i);
          book.setBookConcern("飛思科技+"+i);
          list.add(book);
      }
         
         writeExcelBo("c:\\上市新書(shū).xls",list);
         System.err.println("Book OK!!!");
         
     }

    }
    =================摘要=====================
    java如何操作Excel(數(shù)據(jù)導(dǎo)入導(dǎo)出)(轉(zhuǎn))

    jxl.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=79926下載。

    一.讀取Excel文件內(nèi)容

    java 代碼
    /**讀取Excel文件的內(nèi)容  
     * @param file  待讀取的文件  
     * @return  
     */  
    public static String readExcel(File file){   
        StringBuffer sb = new StringBuffer();   
           
        Workbook wb = null;   
        try {   
            //構(gòu)造Workbook(工作薄)對(duì)象   
            wb=Workbook.getWorkbook(file);   
        } catch (BiffException e) {   
            e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
           
        if(wb==null)   
            return null;   
           
        //獲得了Workbook對(duì)象之后,就可以通過(guò)它得到Sheet(工作表)對(duì)象了   
        Sheet[] sheet = wb.getSheets();   
           
        if(sheet!=null&&sheet.length>0){   
            //對(duì)每個(gè)工作表進(jìn)行循環(huán)   
            for(int i=0;i
                //得到當(dāng)前工作表的行數(shù)   
                int rowNum = sheet[i].getRows();   
                for(int j=0;j
                    //得到當(dāng)前行的所有單元格   
                    Cell[] cells = sheet[i].getRow(j);   
                    if(cells!=null&&cells.length>0){   
                        //對(duì)每個(gè)單元格進(jìn)行循環(huán)   
                        for(int k=0;k
                            //讀取當(dāng)前單元格的值   
                            String cellValue = cells[k].getContents();   
                            sb.append(cellValue+"\t");   
                        }   
                    }   
                    sb.append("\r\n");   
                }   
                sb.append("\r\n");   
            }   
        }   
        //最后關(guān)閉資源,釋放內(nèi)存   
        wb.close();   
        return sb.toString();   
    }  
    二.寫(xiě)入Excel文件

    這里有很多格式了,比如文本內(nèi)容加粗,加上某些顏色等,可以參考jxl的api.
    同時(shí)還推薦一篇不錯(cuò)的文章:http://www.ibm.com/developerworks/cn/java/l-javaExcel/?ca=j-t10

    java 代碼
    /**生成一個(gè)Excel文件  
         * @param fileName  要生成的Excel文件名  
         */  
        public static void writeExcel(String fileName){   
            WritableWorkbook wwb = null;   
            try {   
                //首先要使用Workbook類(lèi)的工廠方法創(chuàng)建一個(gè)可寫(xiě)入的工作薄(Workbook)對(duì)象   
                wwb = Workbook.createWorkbook(new File(fileName));   
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
            if(wwb!=null){   
                //創(chuàng)建一個(gè)可寫(xiě)入的工作表   
                //Workbook的createSheet方法有兩個(gè)參數(shù),第一個(gè)是工作表的名稱(chēng),第二個(gè)是工作表在工作薄中的位置   
                WritableSheet ws = wwb.createSheet("sheet1", 0);   
                   
                //下面開(kāi)始添加單元格   
                for(int i=0;i<10;i++){   
                    for(int j=0;j<5;j++){   
                        //這里需要注意的是,在Excel中,第一個(gè)參數(shù)表示列,第二個(gè)表示行   
                        Label labelC = new Label(j, i, "這是第"+(i+1)+"行,第"+(j+1)+"列");   
                        try {   
                            //將生成的單元格添加到工作表中   
                            ws.addCell(labelC);   
                        } catch (RowsExceededException e) {   
                            e.printStackTrace();   
                        } catch (WriteException e) {   
                            e.printStackTrace();   
                        }   
      
                    }   
                }   
      
                try {   
                    //從內(nèi)存中寫(xiě)入文件中   
                    wwb.write();   
                    //關(guān)閉資源,釋放內(nèi)存   
                    wwb.close();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                } catch (WriteException e) {   
                    e.printStackTrace();   
                }   
            }   
        }   
    三.在一個(gè)Excel文件中查找是否包含某一個(gè)關(guān)鍵字

    java 代碼
        /**搜索某一個(gè)文件中是否包含某個(gè)關(guān)鍵字  
         * @param file  待搜索的文件  
         * @param keyWord  要搜索的關(guān)鍵字  
         * @return  
         */  
        public static boolean searchKeyWord(File file,String keyWord){   
            boolean res = false;   
               
            Workbook wb = null;   
            try {   
                //構(gòu)造Workbook(工作薄)對(duì)象   
                wb=Workbook.getWorkbook(file);   
            } catch (BiffException e) {   
                return res;   
            } catch (IOException e) {   
                return res;   
            }   
               
            if(wb==null)   
                return res;   
               
            //獲得了Workbook對(duì)象之后,就可以通過(guò)它得到Sheet(工作表)對(duì)象了   
            Sheet[] sheet = wb.getSheets();   
               
            boolean breakSheet = false;   
               
            if(sheet!=null&&sheet.length>0){   
                //對(duì)每個(gè)工作表進(jìn)行循環(huán)   
                for(int i=0;i
                    if(breakSheet)   
                        break;   
                       
                    //得到當(dāng)前工作表的行數(shù)   
                    int rowNum = sheet[i].getRows();   
                       
                    boolean breakRow = false;   
                       
                    for(int j=0;j
                        if(breakRow)   
                            break;   
                        //得到當(dāng)前行的所有單元格   
                        Cell[] cells = sheet[i].getRow(j);   
                        if(cells!=null&&cells.length>0){   
                            boolean breakCell = false;   
                            //對(duì)每個(gè)單元格進(jìn)行循環(huán)   
                            for(int k=0;k
                                if(breakCell)   
                                    break;   
                                //讀取當(dāng)前單元格的值   
                                String cellValue = cells[k].getContents();   
                                if(cellValue==null)   
                                    continue;   
                                if(cellValue.contains(keyWord)){   
                                    res = true;   
                                    breakCell = true;   
                                    breakRow = true;   
                                    breakSheet = true;   
                                }   
                            }   
                        }   
                    }   
                }   
            }   
            //最后關(guān)閉資源,釋放內(nèi)存   
            wb.close();   
               
            return res;   
        }  
    四.往Excel中插入圖片圖標(biāo)

    插入圖片的實(shí)現(xiàn)很容易,參看以下代碼:

    java 代碼
    /**往Excel中插入圖片  
     * @param dataSheet  待插入的工作表  
     * @param col 圖片從該列開(kāi)始  
     * @param row 圖片從該行開(kāi)始  
     * @param width 圖片所占的列數(shù)  
     * @param height 圖片所占的行數(shù)  
     * @param imgFile 要插入的圖片文件  
     */  
    public static void insertImg(WritableSheet dataSheet, int col, int row, int width,   
            int height, File imgFile){   
        WritableImage img = new WritableImage(col, row, width, height, imgFile);   
        dataSheet.addImage(img);   
    }   
    以上代碼的注釋已經(jīng)很清楚了,大概也就不用再解釋了,我們可以用如下程序驗(yàn)證:

    java 代碼
        try {   
            //創(chuàng)建一個(gè)工作薄   
    WritableWorkbook workbook = Workbook.createWorkbook(new File("D:/test1.xls"));   
    //待插入的工作表   
    WritableSheet imgSheet = workbook.createSheet("Images",0);   
    //要插入的圖片文件   
    File imgFile = new File("D:/1.png");   
    //圖片插入到第二行第一個(gè)單元格,長(zhǎng)寬各占六個(gè)單元格   
    insertImg(imgSheet,0,1,6,6,imgFile);   
    workbook.write();   
    workbook.close();   
     catch (IOException e) {   
    e.printStackTrace();   
     catch (WriteException e) {   
    e.printStackTrace();   
     但是jxl只支持png格式的圖片,jpg格式和gif格式都不支持
    ========================================================
    jxl.jar包簡(jiǎn)介/java操作excel jxl.jar下載地址

    jxl.jar 包簡(jiǎn)介
    下載地址:
    http://www.andykhan.com/jexcelapi/ 當(dāng)前的最高版本是2.6。

    真實(shí)下載地址:

    http://www.andykhan.com/jexcelapi/download.html


    作者的網(wǎng)站上對(duì)它的特征有如下描述:
    ● 支持Excel 95-2000的所有版本
    ● 生成Excel 2000標(biāo)準(zhǔn)格式
    ● 支持字體、數(shù)字、日期操作
    ● 能夠修飾單元格屬性
    ● 支持圖像和圖表
    應(yīng)該說(shuō)以上功能已經(jīng)能夠大致滿足我們的需要。最關(guān)鍵的是這套API是純Java的,并不依賴Windows系統(tǒng),即使運(yùn)行在Linux下,它同樣能夠正確的處理Excel文件。另外需要說(shuō)明的是,這套API對(duì)圖形和圖表的支持很有限,而且僅僅識(shí)別PNG格式。
    搭建環(huán)境
    將下載后的文件解包,得到j(luò)xl.jar,放入classpath,安裝就完成了。
    基本操作
    一、創(chuàng)建文件
    擬生成一個(gè)名為“測(cè)試數(shù)據(jù).xls”的Excel文件,其中第一個(gè)工作表被命名為“第一頁(yè)”,大致效果如下:
    代碼(CreateXLS.java):
    //生成Excel的類(lèi)
    import java.io.*;
    import jxl.*;
    import jxl.write.*;
    public class CreateXLS
    {
    public static void main(String args[])
    {
    try
    {
    //打開(kāi)文件
    WritableWorkbook book=
    Workbook.createWorkbook(new File(“測(cè)試.xls”));
    //生成名為“第一頁(yè)”的工作表,參數(shù)0表示這是第一頁(yè)
    WritableSheet sheet=book.createSheet(“第一頁(yè)”,0);
    //在Label對(duì)象的構(gòu)造子中指名單元格位置是第一列第一行(0,0)
    //以及單元格內(nèi)容為test
    Label label=new Label(0,0,”test”);
    //將定義好的單元格添加到工作表中
    sheet.addCell(label);
    /*生成一個(gè)保存數(shù)字的單元格
    必須使用Number的完整包路徑,否則有語(yǔ)法歧義
    單元格位置是第二列,第一行,值為789.123*/
    jxl.write.Number number = new jxl.write.Number(1,0,789.123);
    sheet.addCell(number);
    //寫(xiě)入數(shù)據(jù)并關(guān)閉文件
    book.write();
    book.close();
    }catch(Exception e)
    {
    System.out.println(e);
    }
    }
    }
    編譯執(zhí)行后,會(huì)在當(dāng)前位置產(chǎn)生一個(gè)Excel文件。
    三、讀取文件
    以剛才我們創(chuàng)建的Excel文件為例,做一個(gè)簡(jiǎn)單的讀取操作,程序代碼如下:
    //讀取Excel的類(lèi)
    import java.io.*;
    import jxl.*;
    public class ReadXLS
    {
    public static void main(String args[])
    {
    try
    {
    Workbook book=
    Workbook.getWorkbook(new File(“測(cè)試.xls”));
    //獲得第一個(gè)工作表對(duì)象
    Sheet sheet=book.getSheet(0);
    //得到第一列第一行的單元格
    Cell cell1=sheet.getCell(0,0);
    String result=cell1.getContents();
    System.out.println(result);
    book.close();
    }catch(Exception e)
    {
    System.out.println(e);
    }
    }
    }
    程序執(zhí)行結(jié)果:test
    四、修改文件
    利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的時(shí)候,除了打開(kāi)文件的方式不同之外,其他操作和創(chuàng)建Excel是一樣的。下面的例子是在我們已經(jīng)生成的Excel文件中添加一個(gè)工作表:
    //修改Excel的類(lèi),添加一個(gè)工作表
    import java.io.*;
    import jxl.*;
    import jxl.write.*;
    public class UpdateXLS
    {
    public static void main(String args[])
    {
    try
    {
    //Excel獲得文件
    Workbook wb=Workbook.getWorkbook(new File(“測(cè)試.xls”));
    //打開(kāi)一個(gè)文件的副本,并且指定數(shù)據(jù)寫(xiě)回到原文件
    WritableWorkbook book=
    Workbook.createWorkbook(new File(“測(cè)試.xls”),wb);
    //添加一個(gè)工作表
    WritableSheet sheet=book.createSheet(“第二頁(yè)”,1);
    sheet.addCell(new Label(0,0,”第二頁(yè)的測(cè)試數(shù)據(jù)”));
    book.write();
    book.close();
    }catch(Exception e)
    {
    System.out.println(e);
    }
    }
    }
    執(zhí)行結(jié)果如圖:
    高級(jí)操作
    一、 數(shù)據(jù)格式化
    在Excel中不涉及復(fù)雜的數(shù)據(jù)類(lèi)型,能夠比較好的處理字串、數(shù)字和日期已經(jīng)能夠滿足一般的應(yīng)用。
    1、 字串格式化
    字符串的格式化涉及到的是字體、粗細(xì)、字號(hào)等元素,這些功能主要由WritableFont和WritableCellFormat類(lèi)來(lái)負(fù)責(zé)。假設(shè)我們?cè)谏梢粋€(gè)含有字串的單元格時(shí),使用如下語(yǔ)句,為方便敘述,我們?yōu)槊恳恍忻罴恿司幪?hào):

    WritableFont font1=
    new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); 或//設(shè)置字體格式為excel支持的格式 WritableFont font3=new WritableFont(WritableFont.createFont("楷體_GB2312"),12,WritableFont.NO_BOLD );① WritableCellFormat format1=new WritableCellFormat(font1); ② Label label=new Label(0,0,”data 4 test”,format1) ③ 其中①指定了字串格式:字體為T(mén)IMES,字號(hào)16,加粗顯示。WritableFont有非常豐富的構(gòu)造子,供不同情況下使用,jExcelAPI的java-doc中有詳細(xì)列表,這里不再列出。 ②處代碼使用了WritableCellFormat類(lèi),這個(gè)類(lèi)非常重要,通過(guò)它可以指定單元格的各種屬性,后面的單元格格式化中會(huì)有更多描述。 ③處使用了Label類(lèi)的構(gòu)造子,指定了字串被賦予那種格式。 在WritableCellFormat類(lèi)中,還有一個(gè)很重要的方法是指定數(shù)據(jù)的對(duì)齊方式,比如針對(duì)我們上面的實(shí)例,可以指定:

     //把水平對(duì)齊方式指定為居中

    format1.setAlignment(jxl.format.Alignment.CENTRE);

    //把垂直對(duì)齊方式指定為居中

    format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

    //設(shè)置自動(dòng)換行
     format1.setWrap(true);


     
    二、單元格操作
    Excel中很重要的一部分是對(duì)單元格的操作,比如行高、列寬、單元格合并等,所幸jExcelAPI提供了這些支持。這些操作相對(duì)比較簡(jiǎn)單,下面只介紹一下相關(guān)的API。
    1、 合并單元格
    WritableSheet.mergeCells(int m,int n,int p,int q);
    作用是從(m,n)到(p,q)的單元格全部合并,比如:
    WritableSheet sheet=book.createSheet(“第一頁(yè)”,0);
    //合并第一列第一行到第六列第一行的所有單元格
    sheet.mergeCells(0,0,5,0);
    合并既可以是橫向的,也可以是縱向的。合并后的單元格不能再次進(jìn)行合并,否則會(huì)觸發(fā)異常。
    2、 行高和列寬
    WritableSheet.setRowView(int i,int height);
    作用是指定第i+1行的高度,比如:
    //將第一行的高度設(shè)為200
    sheet.setRowView(0,200);
    WritableSheet.setColumnView(int i,int width);
    作用是指定第i+1列的寬度,比如:
    //將第一列的寬度設(shè)為30
    sheet.setColumnView(0,30);
    五、操作圖片
    public static void write()throws Exception{
            WritableWorkbook wwb=Workbook.createWorkbook(new File("c:/1.xls"));
            WritableSheet ws=wwb.createSheet("Test Sheet 1",0);
            File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281.png");
            WritableImage image=new WritableImage(1, 4, 6, 18,file);
            ws.addImage(image);
            wwb.write();
            wwb.close();
        }
    很簡(jiǎn)單和插入單元格的方式一樣,不過(guò)就是參數(shù)多了些,WritableImage這個(gè)類(lèi)繼承了Draw,上面只是他構(gòu)造方法的一種,最后一個(gè)參數(shù)不用了說(shuō)了,前面四個(gè)參數(shù)的類(lèi)型都是double,依次是 x, y, width, height,注意,這里的寬和高可不是圖片的寬和高,而是圖片所要占的單位格的個(gè)數(shù),因?yàn)槔^承的Draw所以他的類(lèi)型必須是double,具體里面怎么實(shí)現(xiàn)的我還沒(méi)細(xì)看:)因?yàn)橹壁s活,先完成功能,其他的以后有時(shí)間慢慢研究。以后會(huì)繼續(xù)寫(xiě)出在使用中的心得給大家。
       讀:
    讀的時(shí)候是這樣的一個(gè)思路,先用一個(gè)輸入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet從工作薄中得到工作表,用Cell得到工作表中得某個(gè)單元格.
    InputStream->Workbook->Sheet->Cell,就得到了excel文件中的單元格
    代碼:
    String path="c:\\excel.xls";//Excel文件URL
    InputStream is = new FileInputStream(path);//寫(xiě)入到FileInputStream
    jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄
    jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一個(gè)工作表
    Cell cell=st.getCell(0,0);//得到工作表的第一個(gè)單元格,即A1
    String content=cell.getContents();//getContents()將Cell中的字符轉(zhuǎn)為字符串
    wb.close();//關(guān)閉工作薄
    is.close();//關(guān)閉輸入流

    我們可以通過(guò)Sheet的getCell(x,y)方法得到任意一個(gè)單元格,x,y和excel中的坐標(biāo)對(duì)應(yīng).
    例如A1對(duì)應(yīng)(0,0),A2對(duì)應(yīng)(0,1),D3對(duì)應(yīng)(3,2).Excel中坐標(biāo)從A,1開(kāi)始,jxl中全部是從0開(kāi)始.
    還可以通過(guò)Sheet的getRows(),getColumns()方法得到行數(shù)列數(shù),并用于循環(huán)控制,輸出一個(gè)sheet中的所有內(nèi)容.
    寫(xiě):
    往Excel中寫(xiě)入內(nèi)容主要是用jxl.write包中的類(lèi).
    思路是這樣的:
    OutputStream<-WritableWorkbook<-WritableSheet<-Label
    這里面Label代表的是寫(xiě)入Sheet的Cell位置及內(nèi)容.
    代碼:
    OutputStream os=new FileOutputStream("c:\\test.xls");//輸出的Excel文件URL
    WritableWorkbook wwb = Workbook.createWorkbook(os);//創(chuàng)建可寫(xiě)工作薄
    WritableSheet ws = wwb.createSheet("sheet1", 0);//創(chuàng)建可寫(xiě)工作表
    Label labelCF=new Label(0, 0, "hello");//創(chuàng)建寫(xiě)入位置和內(nèi)容
    ws.addCell(labelCF);//將Label寫(xiě)入sheet中
    Label的構(gòu)造函數(shù)Label(int x, int y,String aString)xy意同讀的時(shí)候的xy,aString是寫(xiě)入的內(nèi)容.
    WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//設(shè)置寫(xiě)入字體
    WritableCellFormat wcfF = new WritableCellFormat(wf);//設(shè)置CellFormat
    Label labelCF=new Label(0, 0, "hello");//創(chuàng)建寫(xiě)入位置,內(nèi)容和格式
    Label的另一構(gòu)造函數(shù)Label(int c, int r, String cont, CellFormat st)可以對(duì)寫(xiě)入內(nèi)容進(jìn)行格式化,設(shè)置字體及其它的屬性.
    現(xiàn)在可以寫(xiě)了
    wwb.write();
    寫(xiě)完后關(guān)閉
    wwb.close();
    輸出流也關(guān)閉吧
    os.close;
    OK,只要把讀和寫(xiě)結(jié)合起來(lái),就可以在N個(gè)Excel中讀取數(shù)據(jù)寫(xiě)入你希望的Excel新表中,還是比較方便的.

    下面是程序一例:

    程序代碼:sql = "select * from tablename";
        rs = stmt.executeQuery(sql);

    //新建Excel文件
    String filePath=request.getRealPath("aaa.xls");
    File myFilePath=new File(filePath);
    if(!myFilePath.exists())
    myFilePath.createNewFile();
    FileWriter resultFile=new FileWriter(myFilePath);
    PrintWriter myFile=new PrintWriter(resultFile);
    resultFile.close();

            //用JXL向新建的文件中添加內(nèi)容
        OutputStream outf = new FileOutputStream(filePath);
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(outf);
            jxl.write.WritableSheet ws = wwb.createSheet("sheettest", 0);

    int i=0;
            int j=0;

    for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
        ws.addCell(new Label(k,0,rs.getMetaData().getColumnName(k+1)));
    }

    while(rs.next()){
        out.println(rs.getMetaData().getColumnCount());

    for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
    ws.addCell(new Label(k,j+i+1,rs.getString(k+1)));
        } 

     i++;
    }
    wwb.write();
        wwb.close();
    }catch(Exception e){e.printStackTrace();}
    finally{

    rs.close();
    conn.close();
    }

    response.sendRedirect("aaa.xls");
    ==============================================
      1 /**
      2  * QuickExcel.java
      3  * 作者:楊慶成
      4  * Created on 2004年11月22日, 下午4:05
      5  * 在實(shí)際應(yīng)用中經(jīng)常要將數(shù)據(jù)庫(kù)中的表導(dǎo)入Excel
      6  * 本人在Apache的POI基礎(chǔ)上寫(xiě)了一個(gè)簡(jiǎn)單的類(lèi)
      7  * 有不當(dāng)指出請(qǐng)指正,謝謝!
      8  * 
      9  */
     10
     11package yqc.poi;
     12
     13import java.sql.*;
     14import java.util.*;
     15import java.io.*;
     16import java.io.ByteArrayInputStream;
     17import java.io.FileInputStream;
     18import java.io.FileOutputStream;
     19import java.io.IOException;
     20
     21import org.apache.poi.hssf.usermodel.*;
     22import org.apache.poi.poifs.filesystem.POIFSFileSystem;
     23import org.apache.poi.hssf.record.*;
     24import org.apache.poi.hssf.model.*;
     25import org.apache.poi.hssf.usermodel.*;
     26import org.apache.poi.hssf.util.*;import yqc.sql.*;
     27
     28/**//**
     29 *
     30 * @author  Administrator
     31 */
     32public class QuickExcel {
     33    
     34    /**//** Creates a new instance of QuickExcel */
     35    private QuickExcel(String file){
     36        _file=file;
     37    }
     38    
     39    private void open()throws IOException{
     40        InputStream stream = null;
     41        Record[] records = null;
     42        POIFSFileSystem fs =
     43            new POIFSFileSystem(new FileInputStream(_file));
     44        _wb = new HSSFWorkbook(fs);
     45    }
     46    
     47    private void create(){
     48        _wb=new HSSFWorkbook();
     49    }
     50    
     51    public static QuickExcel newInstance (String file){
     52        QuickExcel qe=new QuickExcel(file);
     53        qe.create();
     54        return qe;
     55    }
     56    
     57    public static QuickExcel openInstance(String file) throws IOException {
     58        QuickExcel qe=new QuickExcel(file);
     59        qe.open();
     60        return qe;
     61    }
     62    
     63    public void close(){
     64        try{
     65            FileOutputStream fileOut = new FileOutputStream(_file);
     66            _wb.write(fileOut);//把Workbook對(duì)象輸出到文件workbook.xls中
     67            fileOut.close();
     68        }
     69        catch (Exception ex){
     70            System.out.println(ex.getMessage());
     71        }
     72    }
     73    
     74    private void removeSheet(String sheetName){
     75        int i=_wb.getSheetIndex("sheetName");
     76        if (i>=0) _wb.removeSheetAt(i);
     77    }
     78    
     79    public int fillSheet (ResultSet rs,String sheetName)throws SQLException {
     80        HSSFSheet st= _wb.createSheet(sheetName);
     81        ResultSetMetaData rsmd= rs.getMetaData();
     82        int index=0;
     83        int result=0;
     84        HSSFRow row=st.createRow(index++);
     85        for(int i=1;i<=rsmd.getColumnCount();++i){
     86            HSSFCell cell=row.createCell((short)(i-1));
     87            cell.setCellValue(rsmd.getColumnName(i));
     88        }
     89        while(rs.next()) {
     90            result++;
     91            row=st.createRow(index++);
     92            for(int i=1;i<=rsmd.getColumnCount();++i){
     93                HSSFCell cell=row.createCell((short)(i-1));
     94                cell.setEncoding(cell.ENCODING_UTF_16);
     95                cell.setCellValue(rs.getString(i));
     96            }
     97        }
     98        return result;
     99}
    100    
    101    public static void main(String[] args){
    102        try{
    103            QuickConnection qc=new MssqlConnection("jdbc:microsoft:sqlserver://192.168.0.100:1433;DatabaseName=ls");
    104            QuickExcel qe=QuickExcel.newInstance("a.xls");
    105            qc.connect();
    106            String sql="select * from ls.dbo.radio1_emcee";
    107            ResultSet rs=qc.getStatement().executeQuery(sql);
    108            qe.fillSheet(rs,"MT");
    109            qe.close();
    110            qe=QuickExcel.openInstance("a.xls");
    111            qe.fillSheet(rs,"MO");
    112            qe.close();
    113            qc.close();
    114        }
    115        catch (SQLException ex){
    116            System.out.println(ex.getMessage());
    117        }
    118        catch (IOException ex){
    119            System.out.println(ex.getMessage());
    120        }
    121    }
    122    
    123    HSSFWorkbook _wb;
    124    String _file="new.xls";
    125}
    ===================================
     /**導(dǎo)出數(shù)據(jù)為XLS格式
      * @param fos 生成Excel文件Path
      * @param bo 要導(dǎo)入的數(shù)據(jù)
      */
     public void writeExcelBo(FileOutputStream fos, java.util.Vector ve)
     {
      jxl.write.WritableWorkbook wwb;
      try
      {
       wwb= Workbook.createWorkbook(fos);
       jxl.write.WritableSheet ws= wwb.createSheet("booksheet", 10);
       ws.addCell(new jxl.write.Label(0, 1, "書(shū)目ID"));
       ws.addCell(new jxl.write.Label(1, 1, "ISBN"));
       ws.addCell(new jxl.write.Label(2, 1, "定價(jià)"));
       ws.addCell(new jxl.write.Label(3, 1, "書(shū)名"));
       ws.addCell(new jxl.write.Label(4, 1, "原書(shū)名"));
       ws.addCell(new jxl.write.Label(5, 1, "副題名"));
       ws.addCell(new jxl.write.Label(6, 1, "著者"));
       ws.addCell(new jxl.write.Label(7, 1, "譯者"));
       ws.addCell(new jxl.write.Label(8, 1, "版次"));
       ws.addCell(new jxl.write.Label(9, 1, "出版地"));
       ws.addCell(new jxl.write.Label(10, 1, "出版社"));
       ws.addCell(new jxl.write.Label(11, 1, "出版日期"));
       ws.addCell(new jxl.write.Label(12, 1, "頁(yè)數(shù)"));
       ws.addCell(new jxl.write.Label(13, 1, "書(shū)高"));
       ws.addCell(new jxl.write.Label(14, 1, "裝幀"));
       ws.addCell(new jxl.write.Label(15, 1, "叢書(shū)名"));
       ws.addCell(new jxl.write.Label(16, 1, "一般性附注項(xiàng)"));
       ws.addCell(new jxl.write.Label(17, 1, "簡(jiǎn)介"));
       ws.addCell(new jxl.write.Label(18, 1, "主題詞"));
       ws.addCell(new jxl.write.Label(19, 1, "中圖法分類(lèi)"));
       ws.addCell(new jxl.write.Label(20, 1, "更新日期"));
       ws.addCell(new jxl.write.Label(21, 1, "本數(shù)"));
       book=new Book[ve.size()];
       for (int i= 0; i < ve.size(); i++)
       {
        book[i]= (Book)ve.get(i);
        ws.addCell(new jxl.write.Label(0, i + 2, "" + book[i].getBookId()));
        ws.addCell(new jxl.write.Label(1, i + 2, book[i].getIsbn()));
        ws.addCell(new jxl.write.Label(2, i + 2, "" + book[i].getPrice()));
        ws.addCell(new jxl.write.Label(3, i + 2, book[i].getBookTitle()));
        ws.addCell(new jxl.write.Label(4, i + 2, book[i].getOldFilename()));
        ws.addCell(new jxl.write.Label(5, i + 2, book[i].getSubTitle()));
        ws.addCell(new jxl.write.Label(6, i + 2, book[i].getWriter()));
        ws.addCell(new jxl.write.Label(7, i + 2, book[i].getTranscribe()));
        ws.addCell(new jxl.write.Label(8, i + 2, "" + book[i].getVersion()));
        ws.addCell(new jxl.write.Label(9, i + 2, book[i].getPublishCity()));
        ws.addCell(new jxl.write.Label(10, i + 2, book[i].getPublisher()));
        ws.addCell(new jxl.write.Label(11, i + 2, book[i].getPublishDate().toString()));
        ws.addCell(new jxl.write.Label(12, i + 2, "" + book[i].getPage()));
        ws.addCell(new jxl.write.Label(13, i + 2, "" + book[i].getHight()));
        ws.addCell(new jxl.write.Label(14, i + 2, book[i].getInstall()));
        ws.addCell(new jxl.write.Label(15, i + 2, book[i].getSeries()));
        ws.addCell(new jxl.write.Label(16, i + 2, book[i].getNotes()));
        ws.addCell(new jxl.write.Label(17, i + 2, book[i].getPrecisnotes()));
        ws.addCell(new jxl.write.Label(18, i + 2, book[i].getSubject()));
        ws.addCell(new jxl.write.Label(19, i + 2, book[i].getCls().replaceAll("_", "")));
        ws.addCell(new jxl.write.Label(20, i + 2, book[i].getUpdatedate().toString()));
        ws.addCell(new jxl.write.Label(21, i + 2, "0"));
       }
       jxl.write.WritableFont wfc=
        new jxl.write.WritableFont(
         WritableFont.ARIAL,
         255,
         WritableFont.BOLD,
         false,
         UnderlineStyle.NO_UNDERLINE,
         jxl.format.Colour.BLACK);
       jxl.write.WritableCellFormat wcfFC= new jxl.write.WritableCellFormat(wfc);
       ws.addCell(new jxl.write.Label(0, 0, "為保證您提交定單的穩(wěn)定和正確,導(dǎo)入定單時(shí)候請(qǐng)勿更改此表格式(請(qǐng)勿更改書(shū)目ID,訂購(gòu)本數(shù)自行添加!)"));
       wwb.write();
       //關(guān)閉Excel工作薄對(duì)象
       wwb.close();
      } catch (IOException e)
      {} catch (RowsExceededException e)
      {} catch (WriteException e)
      {}
     }

     

       //導(dǎo)入EXCEL
       if (f.getName().indexOf(".xls") > 0)
       {
        try
        {
         fis= new FileInputStream(f);
         BookBean bob= new BookBean();
         UserBean usb= new UserBean();
         jxl.Workbook rwb= Workbook.getWorkbook(fis);
         jxl.Sheet sh= rwb.getSheet(0);
         int rowCount= sh.getRows();
         SimpleDateFormat sdf= new SimpleDateFormat("dd/MM/yyyy");
         book= new Book[rowCount - 1];
         for (int i= 1; i < rowCount; i++)
         {
          book[i - 1]= new Book();
          jxl.Cell[] ce= sh.getRow(i);
          book[i - 1].setIsbn(ce[0].getContents().toString());
          book[i - 1].setSeries(ce[1].getContents().toString());
          book[i - 1].setBookTitle(ce[2].getContents().toString());
          book[i - 1].setWriter(ce[3].getContents().toString());
          book[i - 1].setTranscribe(ce[4].getContents().toString());
          book[i - 1].setPublisher(ce[5].getContents().toString());
          book[i - 1].setPublishDate(sdf.parse(ce[6].getContents().toString(), new ParsePosition(0)));
          book[i-1].setVersion(Integer.parseInt(ce[7].getContents().toString()));
          book[i-1].setPage(Integer.parseInt(ce[8].getContents().toString()));
          book[i-1].setCls(ce[9].getContents().toString());
          book[i-1].setPrecisnotes(ce[10].getContents().toString());
          book[i-1].setInstall(ce[11].getContents().toString());
          book[i-1].setPrice(Float.parseFloat(ce[12].getContents().toString()));
          book[i-1].setUserid(usb.getUser().getUserid());
          getVector().addElement(book[i - 1]);
         }
         rwb.close();
         fis.close();
        } catch (FileNotFoundException e)
        {} catch (BiffException e)
        {} catch (IOException e)
        {} catch (NumberFormatException e)
        {
         ShowMessage("數(shù)據(jù)導(dǎo)入失敗,請(qǐng)按照本軟件要求的EXCEL格式導(dǎo)入定單");
        }
       }
    =================================================
    文檔選項(xiàng)


    級(jí)別: 初級(jí)

    Rubber (mailto:userid@us.ibm.com?subject=利用JAVA操作EXCEL文件&cc=userid@us.ibm.com),

    2003 年 1 月 11 日

    使用Windows操作系統(tǒng)的朋友對(duì)Excel(電子表格)一定不會(huì)陌生,但是要使用Java語(yǔ)言來(lái)操縱Excel文件并不是一件容易的事。在Web應(yīng)用日益盛行的今天,通過(guò)Web來(lái)操作Excel文件的需求越來(lái)越強(qiáng)烈,目前較為流行的操作是在JSP或Servlet 中創(chuàng)建一個(gè)CSV (comma separated values)文件,并將這個(gè)文件以MIME,text/csv類(lèi)型返回給瀏覽器,接著瀏覽器調(diào)用Excel并且顯示CSV文件。這樣只是說(shuō)可以訪問(wèn)到Excel文件,但是還不能真正的操縱Excel文件,本文將給大家一個(gè)驚喜,向大家介紹一個(gè)開(kāi)放源碼項(xiàng)目,Java Excel API,使用它大家就可以方便地操縱Excel文件了。

    JAVA EXCEL API簡(jiǎn)介

    Java Excel是一開(kāi)放源碼項(xiàng)目,通過(guò)它Java開(kāi)發(fā)人員可以讀取Excel文件的內(nèi)容、創(chuàng)建新的Excel文件、更新已經(jīng)存在的Excel文件。使用該API非Windows操作系統(tǒng)也可以通過(guò)純Java應(yīng)用來(lái)處理Excel數(shù)據(jù)表。因?yàn)槭鞘褂肑ava編寫(xiě)的,所以我們?cè)赪eb應(yīng)用中可以通過(guò)JSP、Servlet來(lái)調(diào)用API實(shí)現(xiàn)對(duì)Excel數(shù)據(jù)表的訪問(wèn)。

    現(xiàn)在發(fā)布的穩(wěn)定版本是V2.0,提供以下功能:

    • 從Excel 95、97、2000等格式的文件中讀取數(shù)據(jù);
    • 讀取Excel公式(可以讀取Excel 97以后的公式);
    • 生成Excel數(shù)據(jù)表(格式為Excel 97);
    • 支持字體、數(shù)字、日期的格式化;
    • 支持單元格的陰影操作,以及顏色操作;
    • 修改已經(jīng)存在的數(shù)據(jù)表;

    現(xiàn)在還不支持以下功能,但不久就會(huì)提供了:

    1. 不能夠讀取圖表信息;
    2. 可以讀,但是不能生成公式,任何類(lèi)型公式最后的計(jì)算值都可以讀出;




    回頁(yè)首


    應(yīng)用示例

    1 從Excel文件讀取數(shù)據(jù)表

    Java Excel API既可以從本地文件系統(tǒng)的一個(gè)文件(.xls),也可以從輸入流中讀取Excel數(shù)據(jù)表。讀取Excel數(shù)據(jù)表的第一步是創(chuàng)建Workbook(術(shù)語(yǔ):工作薄),下面的代碼片段舉例說(shuō)明了應(yīng)該如何操作:(完整代碼見(jiàn)ExcelReading.java)

    import java.io.*;
                            import jxl.*;
                            … … … …
                            try
                            {
                            //構(gòu)建Workbook對(duì)象, 只讀Workbook對(duì)象
                            //直接從本地文件創(chuàng)建Workbook
                            //從輸入流創(chuàng)建Workbook
                            InputStream is = new FileInputStream(sourcefile);
                            jxl.Workbook rwb = Workbook.getWorkbook(is);
                            }
                            catch (Exception e)
                            {
                            e.printStackTrace();
                            }
                            

    一旦創(chuàng)建了Workbook,我們就可以通過(guò)它來(lái)訪問(wèn)Excel Sheet(術(shù)語(yǔ):工作表)。參考下面的代碼片段:

    //獲取第一張Sheet表
                            Sheet rs = rwb.getSheet(0);
                            

    我們既可能通過(guò)Sheet的名稱(chēng)來(lái)訪問(wèn)它,也可以通過(guò)下標(biāo)來(lái)訪問(wèn)它。如果通過(guò)下標(biāo)來(lái)訪問(wèn)的話,要注意的一點(diǎn)是下標(biāo)從0開(kāi)始,就像數(shù)組一樣。

    一旦得到了Sheet,我們就可以通過(guò)它來(lái)訪問(wèn)Excel Cell(術(shù)語(yǔ):?jiǎn)卧?。參考下面的代碼片段:

    //獲取第一行,第一列的值
                            Cell c00 = rs.getCell(0, 0);
                            String strc00 = c00.getContents();
                            //獲取第一行,第二列的值
                            Cell c10 = rs.getCell(1, 0);
                            String strc10 = c10.getContents();
                            //獲取第二行,第二列的值
                            Cell c11 = rs.getCell(1, 1);
                            String strc11 = c11.getContents();
                            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
                            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
                            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
                            

    如果僅僅是取得Cell的值,我們可以方便地通過(guò)getContents()方法,它可以將任何類(lèi)型的Cell值都作為一個(gè)字符串返回。示例代碼中Cell(0, 0)是文本型,Cell(1, 0)是數(shù)字型,Cell(1,1)是日期型,通過(guò)getContents(),三種類(lèi)型的返回值都是字符型。

    如果有需要知道Cell內(nèi)容的確切類(lèi)型,API也提供了一系列的方法。參考下面的代碼片段:

    String strc00 = null;
                            double strc10 = 0.00;
                            Date strc11 = null;
                            Cell c00 = rs.getCell(0, 0);
                            Cell c10 = rs.getCell(1, 0);
                            Cell c11 = rs.getCell(1, 1);
                            if(c00.getType() == CellType.LABEL)
                            {
                            LabelCell labelc00 = (LabelCell)c00;
                            strc00 = labelc00.getString();
                            }
                            if(c10.getType() == CellType.NUMBER)
                            {
                            NmberCell numc10 = (NumberCell)c10;
                            strc10 = numc10.getValue();
                            }
                            if(c11.getType() == CellType.DATE)
                            {
                            DateCell datec11 = (DateCell)c11;
                            strc11 = datec11.getDate();
                            }
                            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
                            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
                            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
                            

    在得到Cell對(duì)象后,通過(guò)getType()方法可以獲得該單元格的類(lèi)型,然后與API提供的基本類(lèi)型相匹配,強(qiáng)制轉(zhuǎn)換成相應(yīng)的類(lèi)型,最后調(diào)用相應(yīng)的取值方法getXXX(),就可以得到確定類(lèi)型的值。API提供了以下基本類(lèi)型,與Excel的數(shù)據(jù)格式相對(duì)應(yīng),如下圖所示:




    每種類(lèi)型的具體意義,請(qǐng)參見(jiàn)Java Excel API Document。

    當(dāng)你完成對(duì)Excel電子表格數(shù)據(jù)的處理后,一定要使用close()方法來(lái)關(guān)閉先前創(chuàng)建的對(duì)象,以釋放讀取數(shù)據(jù)表的過(guò)程中所占用的內(nèi)存空間,在讀取大量數(shù)據(jù)時(shí)顯得尤為重要。參考如下代碼片段:

    //操作完成時(shí),關(guān)閉對(duì)象,釋放占用的內(nèi)存空間
                            rwb.close();
                            

    Java Excel API提供了許多訪問(wèn)Excel數(shù)據(jù)表的方法,在這里我只簡(jiǎn)要地介紹幾個(gè)常用的方法,其它的方法請(qǐng)參考附錄中的Java Excel API Document。

    Workbook類(lèi)提供的方法

    1. int getNumberOfSheets()
    獲得工作薄(Workbook)中工作表(Sheet)的個(gè)數(shù),示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            int sheets = rwb.getNumberOfSheets();
                            

    2. Sheet[] getSheets()
    返回工作薄(Workbook)中工作表(Sheet)對(duì)象數(shù)組,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            Sheet[] sheets = rwb.getSheets();
                            

    3. String getVersion()
    返回正在使用的API的版本號(hào),好像是沒(méi)什么太大的作用。

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            String apiVersion = rwb.getVersion();
                            

    Sheet接口提供的方法

    1) String getName()
    獲取Sheet的名稱(chēng),示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            jxl.Sheet rs = rwb.getSheet(0);
                            String sheetName = rs.getName();
                            

    2) int getColumns()
    獲取Sheet表中所包含的總列數(shù),示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            jxl.Sheet rs = rwb.getSheet(0);
                            int rsColumns = rs.getColumns();
                            

    3) Cell[] getColumn(int column)
    獲取某一列的所有單元格,返回的是單元格對(duì)象數(shù)組,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            jxl.Sheet rs = rwb.getSheet(0);
                            Cell[] cell = rs.getColumn(0);
                            

    4) int getRows()
    獲取Sheet表中所包含的總行數(shù),示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            jxl.Sheet rs = rwb.getSheet(0);
                            int rsRows = rs.getRows();
                            

    5) Cell[] getRow(int row)
    獲取某一行的所有單元格,返回的是單元格對(duì)象數(shù)組,示例子:

    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)
    獲取指定單元格的對(duì)象引用,需要注意的是它的兩個(gè)參數(shù),第一個(gè)是列數(shù),第二個(gè)是行數(shù),這與通常的行、列組合有些不同。

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
                            jxl.Sheet rs = rwb.getSheet(0);
                            Cell cell = rs.getCell(0, 0);
                            

    2 生成新的Excel工作薄

    下面的代碼主要是向大家介紹如何生成簡(jiǎn)單的Excel工作表,在這里單元格的內(nèi)容是不帶任何修飾的(如:字體,顏色等等),所有的內(nèi)容都作為字符串寫(xiě)入。(完整代碼見(jiàn)ExcelWriting.java)

    與讀取Excel工作表相似,首先要使用Workbook類(lèi)的工廠方法創(chuàng)建一個(gè)可寫(xiě)入的工作薄(Workbook)對(duì)象,這里要注意的是,只能通過(guò)API提供的工廠方法來(lái)創(chuàng)建Workbook,而不能使用WritableWorkbook的構(gòu)造函數(shù),因?yàn)轭?lèi)WritableWorkbook的構(gòu)造函數(shù)為protected類(lèi)型。示例代碼片段如下:

    import java.io.*;
                            import jxl.*;
                            import jxl.write.*;
                            … … … …
                            try
                            {
                            //構(gòu)建Workbook對(duì)象, 只讀Workbook對(duì)象
                            //Method 1:創(chuàng)建可寫(xiě)入的Excel工作薄
                            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
                            //Method 2:將WritableWorkbook直接寫(xiě)入到輸出流
                            /*
                            OutputStream os = new FileOutputStream(targetfile);
                            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
                            */
                            }
                            catch (Exception e)
                            {
                            e.printStackTrace();
                            }
                            

    API提供了兩種方式來(lái)處理可寫(xiě)入的輸出流,一種是直接生成本地文件,如果文件名不帶全路徑的話,缺省的文件會(huì)定位在當(dāng)前目錄,如果文件名帶有全路徑的話,則生成的Excel文件則會(huì)定位在相應(yīng)的目錄;另外一種是將Excel對(duì)象直接寫(xiě)入到輸出流,例如:用戶通過(guò)瀏覽器來(lái)訪問(wèn)Web服務(wù)器,如果HTTP頭設(shè)置正確的話,瀏覽器自動(dòng)調(diào)用客戶端的Excel應(yīng)用程序,來(lái)顯示動(dòng)態(tài)生成的Excel電子表格。

    接下來(lái)就是要?jiǎng)?chuàng)建工作表,創(chuàng)建工作表的方法與創(chuàng)建工作薄的方法幾乎一樣,同樣是通過(guò)工廠模式方法獲得相應(yīng)的對(duì)象,該方法需要兩個(gè)參數(shù),一個(gè)是工作表的名稱(chēng),另一個(gè)是工作表在工作薄中的位置,參考下面的代碼片段:

    //創(chuàng)建Excel工作表
                            jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
                            

    "這鍋也支好了,材料也準(zhǔn)備齊全了,可以開(kāi)始下鍋了!",現(xiàn)在要做的只是實(shí)例化API所提供的Excel基本數(shù)據(jù)類(lèi)型,并將它們添加到工作表中就可以了,參考下面的代碼片段:

    //1.添加Label對(duì)象
                            jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
                            ws.addCell(labelC);
                            //添加帶有字型Formatting的對(duì)象
                            jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
                            jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
                            jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
                            ws.addCell(labelCF);
                            //添加帶有字體顏色Formatting的對(duì)象
                            jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
                            UnderlineStyle.NO_UNDERLINE, 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對(duì)象
                            jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
                            ws.addCell(labelN);
                            //添加帶有formatting的Number對(duì)象
                            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對(duì)象
                            jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
                            ws.addCell(labelB);
                            //4.添加DateTime對(duì)象
                            jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
                            ws.addCell(labelDT);
                            //添加帶有formatting的DateFormat對(duì)象
                            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);
                            

    這里有兩點(diǎn)大家要引起大家的注意。第一點(diǎn),在構(gòu)造單元格時(shí),單元格在工作表中的位置就已經(jīng)確定了。一旦創(chuàng)建后,單元格的位置是不能夠變更的,盡管單元格的內(nèi)容是可以改變的。第二點(diǎn),單元格的定位是按照下面這樣的規(guī)律(column, row),而且下標(biāo)都是從0開(kāi)始,例如,A1被存儲(chǔ)在(0, 0),B1被存儲(chǔ)在(1, 0)。

    最后,不要忘記關(guān)閉打開(kāi)的Excel工作薄對(duì)象,以釋放占用的內(nèi)存,參見(jiàn)下面的代碼片段:

    //寫(xiě)入Exel工作表
                            wwb.write();
                            //關(guān)閉Excel工作薄對(duì)象
                            wwb.close();
                            

    這可能與讀取Excel文件的操作有少少不同,在關(guān)閉Excel對(duì)象之前,你必須要先調(diào)用write()方法,因?yàn)橄惹暗牟僮鞫际谴鎯?chǔ)在緩存中的,所以要通過(guò)該方法將操作的內(nèi)容保存在文件中。如果你先關(guān)閉了Excel對(duì)象,那么只能得到一張空的工作薄了。

    3 拷貝、更新Excel工作薄

    接下來(lái)簡(jiǎn)要介紹一下如何更新一個(gè)已經(jīng)存在的工作薄,主要是下面二步操作,第一步是構(gòu)造只讀的Excel工作薄,第二步是利用已經(jīng)創(chuàng)建的Excel工作薄創(chuàng)建新的可寫(xiě)入的Excel工作薄,參考下面的代碼片段:(完整代碼見(jiàn)ExcelModifying.java)

    //創(chuàng)建只讀的Excel工作薄的對(duì)象
                            jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
                            //創(chuàng)建可寫(xiě)入的Excel工作薄對(duì)象
                            jxl.write.WritableWorkbook  wwb = Workbook.createWorkbook(new File(targetfile), rw);
                            //讀取第一張工作表
                            jxl.write.WritableSheet ws = wwb.getSheet(0);
                            //獲得第一個(gè)單元格對(duì)象
                            jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
                            //判斷單元格的類(lèi)型, 做出相應(yīng)的轉(zhuǎn)化
                            if(wc.getType() == CellType.LABEL)
                            {
                            Label l = (Label)wc;
                            l.setString("The value has been modified.");
                            }
                            //寫(xiě)入Excel對(duì)象
                            wwb.write();
                            //關(guān)閉可寫(xiě)入的Excel對(duì)象
                            wwb.close();
                            //關(guān)閉只讀的Excel對(duì)象
                            rw.close();
                            

    之所以使用這種方式構(gòu)建Excel對(duì)象,完全是因?yàn)樾实脑颍驗(yàn)樯厦娴氖纠攀茿PI的主要應(yīng)用。為了提高性能,在讀取工作表時(shí),與數(shù)據(jù)相關(guān)的一些輸出信息,所有的格式信息,如:字體、顏色等等,是不被處理的,因?yàn)槲覀兊哪康氖谦@得行數(shù)據(jù)的值,既使沒(méi)有了修飾,也不會(huì)對(duì)行數(shù)據(jù)的值產(chǎn)生什么影響。唯一的不利之處就是,在內(nèi)存中會(huì)同時(shí)保存兩個(gè)同樣的工作表,這樣當(dāng)工作表體積比較大時(shí),會(huì)占用相當(dāng)大的內(nèi)存,但現(xiàn)在好像內(nèi)存的大小并不是什么關(guān)鍵因素了。

    一旦獲得了可寫(xiě)入的工作表對(duì)象,我們就可以對(duì)單元格對(duì)象進(jìn)行更新的操作了,在這里我們不必調(diào)用API提供的add()方法,因?yàn)閱卧褚呀?jīng)于工作表當(dāng)中,所以我們只需要調(diào)用相應(yīng)的setXXX()方法,就可以完成更新的操作了。

    盡單元格原有的格式化修飾是不能去掉的,我們還是可以將新的單元格修飾加上去,以使單元格的內(nèi)容以不同的形式表現(xiàn)。

    新生成的工作表對(duì)象是可寫(xiě)入的,我們除了更新原有的單元格外,還可以添加新的單元格到工作表中,這與示例2的操作是完全一樣的。

    最后,不要忘記調(diào)用write()方法,將更新的內(nèi)容寫(xiě)入到文件中,然后關(guān)閉工作薄對(duì)象,這里有兩個(gè)工作薄對(duì)象要關(guān)閉,一個(gè)是只讀的,另外一個(gè)是可寫(xiě)入的。





    回頁(yè)首


    小結(jié)

    本文只是對(duì)Java Excel API中常用的方法作了介紹,要想更詳盡地了解API,請(qǐng)大家參考API文檔,或源代碼。Java Excel API是一個(gè)開(kāi)放源碼項(xiàng)目,請(qǐng)大家關(guān)注它的最新進(jìn)展,有興趣的朋友也可以申請(qǐng)加入這個(gè)項(xiàng)目,或者是提出寶貴的意見(jiàn)。

    posted on 2008-12-03 15:21 李峰 閱讀(4251) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久大香香蕉国产免费网站| 曰批全过程免费视频播放网站| 久久综合给合久久国产免费| 在线观看的免费网站| 亚洲国产精品一区二区三区久久| 亚洲AV日韩精品久久久久久 | 中文字幕亚洲综合久久2| 亚洲日韩精品无码专区加勒比☆ | 人人爽人人爽人人片A免费| 国产一区二区免费视频| 女人18毛片a级毛片免费| 亚洲精品乱码久久久久久久久久久久 | 亚洲老妈激情一区二区三区| 亚洲国产日韩视频观看| a毛片免费全部在线播放**| 成熟女人特级毛片www免费| 亚洲精品无码国产| 亚洲日韩精品无码专区| 久操免费在线观看| 亚洲成AⅤ人影院在线观看| 亚洲免费视频播放| 中文毛片无遮挡高清免费| 女人18一级毛片免费观看| 78成人精品电影在线播放日韩精品电影一区亚洲 | 日本在线看片免费人成视频1000| 国产精品成人无码免费| 91情国产l精品国产亚洲区| 国产区在线免费观看| 午夜网站免费版在线观看| 亚洲视频在线一区| 亚欧乱色国产精品免费视频| 免费做爰猛烈吃奶摸视频在线观看 | 亚洲爆乳无码专区www| 91香蕉在线观看免费高清| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 五月天国产成人AV免费观看| 成全影视免费观看大全二| 亚洲视频在线观看| 两个人看的www免费视频| 亚洲AV无码成H人在线观看| 亚洲熟女乱色一区二区三区|