隨筆 - 154  文章 - 60  trackbacks - 0
          <2007年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          聲明:

          該blog是為了收集資料,認識朋友,學習、提高技術,所以本blog的內容除非聲明,否則一律為轉載!!

          感謝那些公開自己技術成果的高人們!!!

          支持開源,尊重他人的勞動!!

          常用鏈接

          留言簿(3)

          隨筆分類(148)

          隨筆檔案(143)

          收藏夾(2)

          其他

          學習(技術)

          觀察思考(非技術)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          同行整理,簡單明了,快速上手!

          =============================正文1============================

          最近和Excel頻繁親密接觸,主要將N個Excel表中的數據拷貝到另外的Excel表中規整為二維結構以便入庫。但是有些表存在合并單元格的情況,甚是惱火,怎么辦哪?好在這N個Excel表結構還比較一致,可以寫程序在指定位置讀取,然后再寫入到新的Excel表中,這樣就OK了。這里面主要用到一個組件JXL.

          jxl的安裝:
          主要就是將jxl的包放在WEB-INF的classes下面(如果下載到的是.jar文件,就放在lib下面).別忘了將jxl包中的common文件夾也放在WEB-INF下面.

          jxl的使用:
          主要的功能就是讀Excel文件和寫Excel文件

          <b>讀:</b>
          讀的時候是這樣的一個思路,先用一個輸入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet從工作薄中得到工作表,用Cell得到工作表中得某個單元格.
          InputStream->Workbook->Sheet->Cell,就得到了excel文件中的單元格

          代碼:
          <%@ page contentType="text/html; charset=gb2312" %>
          <%@  page  import="java.io.*,jxl.*,jxl.write.*,jxl.write.*,jxl.format.*"  %> 
          String path="c:\\excel.xls";//Excel文件URL
          InputStream is = new FileInputStream(path);//寫入到FileInputStream
          jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄     
          jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一個工作表
          Cell cell=st.getCell(0,0);//得到工作表的第一個單元格,即A1
          String content=cell.getContents();//getContents()將Cell中的字符轉為字符串
          wb.close();//關閉工作薄
          is.close();//關閉輸入流


          我們可以通過Sheet的getCell(x,y)方法得到任意一個單元格,x,y和excel中的坐標對應.
          例如A1對應(0,0),A2對應(0,1),D3對應(3,2).Excel中坐標從A,1開始,jxl中全部是從0開始.
          還可以通過Sheet的getRows(),getColumns()方法得到行數列數,并用于循環控制,輸出一個sheet中的所有內容.

          <b>寫:</b>
          往Excel中寫入內容主要是用jxl.write包中的類.
          思路是這樣的:
          OutputStream<-WritableWorkbook<-WritableSheet<-Label
          這里面Label代表的是寫入Sheet的Cell位置及內容.
          代碼:

          <%@ page contentType="text/html; charset=gb2312" %>
          <%@  page  import="java.io.*,jxl.*,jxl.write.*,jxl.write.*,jxl.format.*"  %>
          OutputStream os=new  FileOutputStream("c:\\test.xls");//輸出的Excel文件URL
          WritableWorkbook wwb = Workbook.createWorkbook(os);//創建可寫工作薄
          WritableSheet ws = wwb.createSheet("sheet1", 0);//創建可寫工作表
          Label labelCF=new Label(0, 0, "hello");//創建寫入位置和內容
          ws.addCell(labelCF);//將Label寫入sheet中

          Label的構造函數Label(int x, int y,String aString)xy意同讀的時候的xy,aString是寫入的內容.

          WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//設置寫入字體
          WritableCellFormat wcfF = new WritableCellFormat(wf);//設置CellFormat
          Label labelCF=new Label(0, 0, "hello");//創建寫入位置,內容和格式

          Label的另一構造函數Label(int c, int r, String cont, CellFormat st)可以對寫入內容進行格式化,設置字體及其它的屬性.

          現在可以寫了
          wwb.write();
          寫完后關閉
          wwb.close();
          輸出流也關閉吧
          os.close;

          OK,只要把讀和寫結合起來,就可以在N個Excel中讀取數據寫入你希望的Excel新表中,還是比較方便的.

          =============================正文2============================

          在這里,我使用的是一個叫Java Excel API的東西,類似的還有jakarta的POI,不過感覺那個
          太復雜了點兒。而且jxl對中文的支持相當的好,至少我在用的過程中一點問題沒出。

          一、下載地址
          http://www.andykhan.com/jexcelapi/

          二、特性
          可以讀取Excel 95, 97, 2000文件
          可以讀或寫Excel 97及其以后版本的的公式(不過我發現好像有bug)
          生成Excel 97格式的電子表格
          支持字體、數字和日期格式化
          支持單元格的顏色和陰影
          可以編輯現有的文件

          三、讀文件
          //聲明一下,記得后面要關閉哦。。
          Workbook workbook = null;

          try {
             workbook = Workbook.getWorkbook(new File("d:\\temp\\TestRead.xls"));
          } catch (Exception e) {
             throw new Exception("file to import not found!");
          }

          Sheet sheet = workbook.getSheet(0);
          Cell cell = null;

          int columnCount=3;
          int rowCount=sheet.getRows();
          for (int i = 0; i <rowCount; i++) {
             for (int j = 0; j <columnCount; j++) {
                 //注意,這里的兩個參數,第一個是表示列的,第二才表示行
                 cell=sheet.getCell(j, i);
                 //要根據單元格的類型分別做處理,否則格式化過的內容可能會不正確
                 if(cell.getType()==CellType.NUMBER){
                     System.out.print(((NumberCell)cell).getvalue());
                 }
                 else if(cell.getType()==CellType.DATE){
                     System.out.print(((DateCell)cell).getDate());
                 }
                 else{
                     System.out.print(cell.getContents());
                 }
                 
                 //System.out.print(cell.getContents());
                 System.out.print("\t");
             }
             System.out.print("\n");
          }
          //關閉它,否則會有內存泄露
          workbook.close();


          寫:wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
          在Java中向Excel文件寫入內容


          四、導出數據到Excel文件中
          下面的例子,設置了數字、日期的格式,還有字體,顏色等。

          File tempFile=new File("d:/temp/output.xls");
          WritableWorkbook workbook = Workbook.createWorkbook(tempFile);
          WritableSheet sheet = workbook.createSheet("TestCreateExcel", 0);

          //一些臨時變量,用于寫到excel中
          Label l=null;
          jxl.write.Number n=null;
          jxl.write.DateTime d=null;

          //預定義的一些字體和格式,同一個Excel中最好不要有太多格式
          WritableFont headerFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.BLUE);
          WritableCellformat headerformat = new WritableCellformat (headerFont);

          WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.RED);
          WritableCellformat titleformat = new WritableCellformat (titleFont);

          WritableFont detFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, Underlinestyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
          WritableCellformat detformat = new WritableCellformat (detFont);

          Numberformat nf=new Numberformat("0.00000");  //用于Number的格式
          WritableCellformat priceformat = new WritableCellformat (detFont, nf);

          Dateformat df=new Dateformat("yyyy-MM-dd");//用于日期的
          WritableCellformat dateformat = new WritableCellformat (detFont, df);

          //剩下的事情,就是用上面的內容和格式創建一些單元格,再加到sheet中
          l=new Label(0, 0, "用于測試的Excel文件", headerformat);
          sheet.addCell(l);

          //add Title
          int column=0;
          l=new Label(column++, 2, "標題", titleformat);
          sheet.addCell(l);
          l=new Label(column++, 2, "日期", titleformat);
          sheet.addCell(l);
          l=new Label(column++, 2, "貨幣", titleformat);
          sheet.addCell(l);
          l=new Label(column++, 2, "價格", titleformat);
          sheet.addCell(l);

          //add detail
          int i=0;
          column=0;
          l=new Label(column++, i+3, "標題 "+i, detformat);
          sheet.addCell(l);
          d=new DateTime(column++, i+3, new java.util.Date(), dateformat);
          sheet.addCell(d);
          l=new Label(column++, i+3, "CNY", detformat);
          sheet.addCell(l);
          n=new jxl.write.Number(column++, i+3, 5.678, priceformat);
          sheet.addCell(n);

          i++;
          column=0;
          l=new Label(column++, i+3, "標題 "+i, detformat);
          sheet.addCell(l);
          d=new DateTime(column++, i+3, new java.util.Date(), dateformat);
          sheet.addCell(d);
          l=new Label(column++, i+3, "SGD", detformat);
          sheet.addCell(l);
          n=new jxl.write.Number(column++, i+3, 98832, priceformat);
          sheet.addCell(n);

          //設置列的寬度
          column=0;
          sheet.setColumnView(column++, 20);
          sheet.setColumnView(column++, 20);
          sheet.setColumnView(column++, 10);
          sheet.setColumnView(column++, 20);

          workbook.write();
          workbook.close();

          posted on 2007-10-26 09:08 lk 閱讀(2822) 評論(1)  編輯  收藏 所屬分類: j2se

          FeedBack:
          # re: 使用jxl讀和寫Excel文件(速成) 2008-10-21 15:31 dfg
          不能用  回復  更多評論
            
          主站蜘蛛池模板: 东阿县| 四子王旗| 洛浦县| 四平市| 察隅县| 新营市| 瑞安市| 沿河| 徐州市| 尉氏县| 蛟河市| 漳浦县| 河津市| 毕节市| 旌德县| 阿合奇县| 从江县| 资阳市| 化德县| 会理县| 文成县| 桐柏县| 靖州| 淮滨县| 托里县| 天台县| 隆安县| 陆川县| 黄龙县| 尼勒克县| 双城市| 天台县| 七台河市| 东台市| 东阿县| 阿鲁科尔沁旗| 江安县| 蒙阴县| 徐汇区| 西乌| 郁南县|