WritableWorkbook 詳細用例 (轉)


原文出處:http://lz881228.blog.163.com/blog/static/114197324201341755951817/

    java 操作 Excel 最常用的就是JXL(java excel api)和POI,今先看下JXL吧。首先可以到http://www.andykhan.com/jexcelapi/download.html 下載最新的jxl.jar,里面有它的jar包和API,內有一個小例子,可以參考一下。 

    JXL 用起來挺簡單的,不過相應的其功能也並不是十分強大,對於一般的簡單的excel操作還可以,對於太復雜的還是有些吃力,基本的操作也就是以下幾項內容。

 

    首先,要創建一個可讀寫的工作簿(WritableWorkbook):

1 WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test.xls"));

如果是想要修改一個已存在的excel工作簿,則需要先獲得它的原始工作簿,再創建一個可讀寫的副本:

1 Workbook wb = Workbook.getWorkbook(new File("src\\test\\test.xls")); // 獲得原始文檔
2 WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test_modified.xls"),wb); // 創建一個可讀寫的副本

 然后,取得我們要操作的sheet,並對其進行相應的操作,如改名、合並單元格、設置列寬、行高等:

1 WritableSheet sheet = workbook.getSheet(0);
2 sheet.setName("修改后"); // 給sheet頁改名
3 workbook.removeSheet(2); // 移除多余的標簽頁
4 workbook.removeSheet(3);
5         
6 sheet.mergeCells(0, 0, 4, 0); // 合並單元格
7 sheet.setRowView(0, 600); // 設置行的高度
8 sheet.setColumnView(0, 30); // 設置列的寬度
9 sheet.setColumnView(1, 20); // 設置列的寬度

之后,就是對單元格的操作了,可以通過如下方法獲取一個單元格,其中兩個參數分別為列、行的位置,從0開始計數,如(2,3)就代表單元格C4:

1 WritableCell cell = sheet.getWritableCell(2,3);

通過WritableFont、WritableCellFormat等對象可以設置單元格的字體、樣式等外觀:

 1 WritableFont titleWf = new WritableFont(WritableFont.createFont("仿宋_GB2312"),// 字體
 2                              20,//WritableFont.DEFAULT_POINT_SIZE,   // 字號
 3                              WritableFont.NO_BOLD,                   // 粗體
 4                              false,                                   // 斜體
 5                              UnderlineStyle.NO_UNDERLINE,            // 下划線
 6                              Colour.BLUE2,                        // 字體顏色
 7                              ScriptStyle.NORMAL_SCRIPT);
 8 WritableCellFormat wcf = new WritableCellFormat(titleWf);
 9 wcf.setBackground(Colour.GRAY_25);// 設置單元格的背景顏色
10 wcf.setAlignment(Alignment.CENTRE); // 設置對齊方式
11 wcf.setBorder(Border.ALL, BorderLineStyle.THICK); // 添加邊框
12 cell.setCellFormat(wcf);


    在jxl中,有幾種常用的數據類型,根據單元格內數據類型的不同,每個WritableCell可以根據其類型被轉換為它的一個子類型,以便對不同類型的數據進行專門的處理,通常可以做這樣的轉換:

 1 WritableCell fromCell = sheet0.getWritableCell(j, i);
 2 
 3 if (fromCell instanceof jxl.write.Number) {
 4     jxl.write.Number num = (jxl.write.Number) fromCell;
 5 } else if (fromCell instanceof jxl.write.Boolean) {
 6     jxl.write.Boolean bool = (jxl.write.Boolean) fromCell;
 7 } else if (fromCell instanceof jxl.write.DateTime) {
 8     jxl.write.DateTime dt = (jxl.write.DateTime) fromCell;
 9 } else if(fromCell instanceof Label){
10     Label _label = (Label) fromCell;
11 }

    當然,操作完成之后一定不要忘了刷新(或者叫寫入?)和關掉工作簿:

1  workbook.write();
2  workbook.close();

下面是參考jxl api里那個例子寫的,把我自己覺得常用的excel操作基本都包含了:

  1 package test;
  2 
  3 import java.io.File;
  4 import java.io.IOException;
  5 import java.net.MalformedURLException;
  6 import java.net.URL;
  7 import java.util.ArrayList;
  8 import java.util.Calendar;
  9 import java.util.Date;
 10 
 11 import jxl.CellType;
 12 import jxl.Workbook;
 13 import jxl.format.Alignment;
 14 import jxl.format.Border;
 15 import jxl.format.BorderLineStyle;
 16 import jxl.format.Colour;
 17 import jxl.format.ScriptStyle;
 18 import jxl.format.UnderlineStyle;
 19 import jxl.format.VerticalAlignment;
 20 import jxl.read.biff.BiffException;
 21 import jxl.write.Blank;
 22 import jxl.write.DateFormat;
 23 import jxl.write.DateFormats;
 24 import jxl.write.DateTime;
 25 import jxl.write.Formula;
 26 import jxl.write.Label;
 27 import jxl.write.Number;
 28 import jxl.write.NumberFormat;
 29 import jxl.write.WritableCell;
 30 import jxl.write.WritableCellFeatures;
 31 import jxl.write.WritableCellFormat;
 32 import jxl.write.WritableFont;
 33 import jxl.write.WritableHyperlink;
 34 import jxl.write.WritableImage;
 35 import jxl.write.WritableSheet;
 36 import jxl.write.WritableWorkbook;
 37 import jxl.write.WriteException;
 38 
 39 /**
 40  * 
 41  * @author why
 42  *
 43  */
 44 public class ExcelTest {
 45 
 46     /**
 47      * @param args
 48      * @throws IOException 
 49      * @throws BiffException 
 50      * @throws WriteException 
 51      */
 52     public static void main(String[] args) throws IOException, BiffException, WriteException {
 53         Workbook wb = Workbook.getWorkbook(new File("src\\test\\test.xls")); // 獲得原始文檔
 54         WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test_modified.xls"),wb); // 創建一個可讀寫的副本
 55         
 56         
 57         /**
 58          * 定義與設置Sheet
 59          */
 60         WritableSheet sheet = workbook.getSheet(0);
 61         sheet.setName("修改后"); // 給sheet頁改名
 62         workbook.removeSheet(2); // 移除多余的標簽頁
 63         workbook.removeSheet(3);
 64         
 65         sheet.mergeCells(0, 0, 4, 0); // 合並單元格
 66         sheet.setRowView(0, 600); // 設置行的高度
 67         sheet.setColumnView(0, 30); // 設置列的寬度
 68         sheet.setColumnView(1, 20); // 設置列的寬度
 69         
 70          WritableCell cell = null;
 71          WritableCellFormat wcf = null;
 72          Label label = null;
 73          WritableCellFeatures wcfeatures = null;
 74         
 75          // 更改標題字體
 76          cell = sheet.getWritableCell(0,0);
 77          WritableFont titleWf = new WritableFont(WritableFont.createFont("仿宋_GB2312"),// 字體
 78                                                   20,//WritableFont.DEFAULT_POINT_SIZE,  // 字號
 79                                                   WritableFont.NO_BOLD,                    // 粗體
 80                                                   false,                                     // 斜體
 81                                                   UnderlineStyle.NO_UNDERLINE,            // 下划線
 82                                                   Colour.BLUE2,                            // 字體顏色
 83                                                   ScriptStyle.NORMAL_SCRIPT);
 84          wcf = new WritableCellFormat(titleWf);
 85          wcf.setBackground(Colour.GRAY_25);// 設置單元格的背景顏色
 86          wcf.setAlignment(Alignment.CENTRE); // 設置對齊方式
 87          wcf.setBorder(Border.ALL, BorderLineStyle.THICK); // 添加邊框
 88          cell.setCellFormat(wcf);
 89         
 90          // 將B3的字體改為仿宋_GB2312
 91          cell = sheet.getWritableCell(1,2);
 92          WritableFont fs = new WritableFont(WritableFont.createFont("仿宋_GB2312"),
 93                                            11);
 94          wcf = new WritableCellFormat(fs);
 95          cell.setCellFormat(wcf);
 96         
 97          // 將B4的字號改為20
 98          cell = sheet.getWritableCell(1,3);
 99          WritableFont size20 = new WritableFont(WritableFont.createFont("宋體"), 
100                                                20);
101          wcf = new WritableCellFormat(size20);
102          cell.setCellFormat(wcf);
103         
104          // 將B5的字體改為加粗
105          cell = sheet.getWritableCell(1,4);
106          WritableFont bold = new WritableFont(WritableFont.createFont("宋體"), 
107                                                11,
108                                                WritableFont.BOLD);
109          wcf = new WritableCellFormat(bold);
110          cell.setCellFormat(wcf);
111         
112          // 將B6的字體改為傾斜
113          cell = sheet.getWritableCell(1,5);
114          WritableFont italic = new WritableFont(WritableFont.createFont("宋體"), 
115                                                  11,
116                                                  WritableFont.NO_BOLD,
117                                                  true);
118          wcf = new WritableCellFormat(italic);
119          cell.setCellFormat(wcf);
120         
121          // 將B7字體加下划線
122          cell = sheet.getWritableCell(1,6);
123          WritableFont underline = new WritableFont(WritableFont.createFont("宋體"), 
124                                                     11,
125                                                     WritableFont.NO_BOLD,
126                                                     false,
127                                                     UnderlineStyle.SINGLE);
128          wcf = new WritableCellFormat(underline);
129          cell.setCellFormat(wcf);
130         
131          // 將B8的文字改為“待修改文字-已修改”
132          cell = sheet.getWritableCell(1,7);
133          if (cell.getType() == CellType.LABEL)
134          {
135              Label lc = (Label) cell;
136              lc.setString(lc.getString() + " - 已修改");
137          }
138         
139          // 將B9文字對齊方式改為垂直居中、右對齊
140          cell = sheet.getWritableCell(1,8);
141          WritableFont align = new WritableFont(WritableFont.createFont("宋體"), 
142                                                   11);
143          wcf = new WritableCellFormat(align);
144          wcf.setAlignment(Alignment.RIGHT); // 設置為右對齊
145          wcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 設置為垂直居中
146          cell.setCellFormat(wcf);
147         
148          // 將E3文字改為自動換行
149          cell = sheet.getWritableCell(4,2);
150          WritableFont justify = new WritableFont(WritableFont.createFont("宋體"), 
151                                                   11);
152          wcf = new WritableCellFormat(justify);
153          wcf.setAlignment(Alignment.JUSTIFY);
154          cell.setCellFormat(wcf);
155         
156         
157          // 將B12的數字有效位數從5位改為7位
158          cell = sheet.getWritableCell(1,11);
159          NumberFormat sevendps = new NumberFormat("#.0000000");
160          wcf = new WritableCellFormat(sevendps);
161          cell.setCellFormat(wcf);
162         
163          // 將B13改為4位科學計數法表示
164          cell = sheet.getWritableCell(1,12);
165          NumberFormat exp4 = new NumberFormat("0.####E0");
166          wcf = new WritableCellFormat(exp4);
167          cell.setCellFormat(wcf);
168         
169          // 將B14改為默認數字表示
170          cell = sheet.getWritableCell(1,13);
171          cell.setCellFormat(WritableWorkbook.NORMAL_STYLE);
172         
173          // 將B15數字類型的值17改為22
174          cell = sheet.getWritableCell(1,14);
175          if (cell.getType() == CellType.NUMBER)
176          {
177              Number n = (Number) cell;
178              n.setValue(42);
179          }
180         
181          // 將B16的值2.71進行加法運算2.71 + 0.1
182          cell = sheet.getWritableCell(1,15);
183          if (cell.getType() == CellType.NUMBER)
184          {
185              Number n = (Number) cell;
186              n.setValue(n.getValue() + 0.1);
187          }
188         
189          // 將B19日期格式改為默認
190          cell = sheet.getWritableCell(1,18);
191          wcf = new WritableCellFormat(DateFormats.FORMAT9);
192          cell.setCellFormat(wcf);
193         
194          // 將B20日期格式改為dd MMM yyyy HH:mm:ss
195          cell = sheet.getWritableCell(1,19);
196          DateFormat df = new DateFormat("dd MMM yyyy HH:mm:ss");
197          wcf = new WritableCellFormat(df);
198          cell.setCellFormat(wcf);
199         
200          // 將B21的日期設置為 2011-6-1 11:18:50
201          cell = sheet.getWritableCell(1,20);
202          if (cell.getType() == CellType.DATE)
203          {
204              DateTime dt = (DateTime) cell;
205              Calendar cal = Calendar.getInstance();
206              cal.set(2011, 5, 1, 11, 18, 50);
207              Date d = cal.getTime();
208              dt.setDate(d);
209          }
210         
211         
212          // 將B24文字添加鏈接http://www.baidu.com
213          WritableHyperlink link = new WritableHyperlink(1, 23, new URL("http://www.baidu.com"));
214          sheet.addHyperlink(link);
215         
216          // 更改URL鏈接
217          WritableHyperlink hyperlinks[] = sheet.getWritableHyperlinks();
218          for (int i = 0; i < hyperlinks.length; i++) {
219              WritableHyperlink wh = hyperlinks[i];
220              if (wh.getColumn() == 1 && wh.getRow() == 24) {
221                  // 將B25文字鏈接取消
222                  sheet.removeHyperlink(wh,true);//true:保留文字;false:刪除文字
223              }else if(wh.getColumn() == 1 && wh.getRow() == 25){
224                  try {
225                      // 將B26鏈接更改為http://wuhongyu.javaeye.com
226                      wh.setURL(new URL("http://wuhongyu.javaeye.com"));
227                  } catch (MalformedURLException e) {
228                      e.printStackTrace();
229                  }
230              }
231          }
232         
233         
234          // 利用公式取得B29、B30的值
235          Formula f1 = new Formula(1, 28, "SUM(C29:D29)");
236          sheet.addCell(f1);
237          Formula f2 = new Formula(1, 29, "AVERAGE(C30:G30)");
238          sheet.addCell(f2);
239         
240          // 在B32處添加圖片,圖片大小占10行3列,只支持png格式
241          File file = new File("d:\\shu05.png");
242          WritableImage image = new WritableImage(1, 31, 3, 10, file);
243          sheet.addImage(image);
244         
245          // 在A44出添加內容"Added drop down validation",並為其添加注釋
246          label = new Label(0, 43, "Added drop down validation");
247          wcfeatures = new WritableCellFeatures();
248          wcfeatures.setComment("右邊列是個下拉列表");
249          label.setCellFeatures(wcfeatures);
250          sheet.addCell(label);
251          
252          // 在B44處添加一個下拉列表並添加注釋
253          Blank b = new Blank(1, 43);
254          wcfeatures = new WritableCellFeatures();
255          ArrayList al = new ArrayList();
256          al.add("why");
257          al.add("landor");
258          al.add("tjm");
259          wcfeatures.setDataValidationList(al);
260          wcfeatures.setComment("這是一個注釋");
261          b.setCellFeatures(wcfeatures);
262          sheet.addCell(b);
263          
264          // 為A46添加注釋。
265          // 此處比較麻煩,試了多次發現必須將cell強制類型轉換、添加CellFeatures再修改注釋才可用,不知有沒有更好的辦法。
266          cell = sheet.getWritableCell(0,45);
267          wcfeatures = new WritableCellFeatures();
268          wcfeatures.setComment("這個注釋不會被顯示,刪了這行還不行,MD");
269          cell.setCellFeatures(wcfeatures);
270          
271          label = (Label) cell;
272 //         label.setCellFeatures(wcfeatures);// 直接這樣寫會報一個警告(“注釋已存在”),但那個注釋仍會被顯示。
273          label.addCellFeatures();
274          label.getWritableCellFeatures().setComment("終於加上注釋了,哈哈哈哈");
275          
276          
277 //        if (cell instanceof Number) {
278 //            Number num = (Number) cell;
279 //            num.setCellFeatures(wcfeatures);
280 //        } else if (cell instanceof jxl.write.Boolean) {
281 //            jxl.write.Boolean bool = (jxl.write.Boolean) cell;
282 //            bool.setCellFeatures(wcfeatures);
283 //        } else if (cell instanceof jxl.write.DateTime) {
284 //            jxl.write.DateTime dt = (jxl.write.DateTime) cell;
285 //            dt.setCellFeatures(wcfeatures);
286 //        } else {
287 //            Label _label = (Label) cell;
288 //            _label.setCellFeatures(wcfeatures);
289 //        }
290          
291          workbook.write();
292          workbook.close();
293          wb.close();
294     }
295 
296 }

=============================================================================================

 

xl讀取excel和寫excel基本類似,只是WritableWorkbook換成了Workbook; WritableSheet換成了 Sheet ;Label 換成了Cell。

 1 import java.io.File;
 2 import java.io.IOException;
 3 import jxl.Cell;
 4 import jxl.Sheet;
 5 import jxl.Workbook;
 6 import jxl.read.biff.BiffException;
 7 public class ReadExcel {
 8  public static void main(String[] args) {
 9   try {  
10             //選取指定的excel  
11             Workbook workbook = Workbook.getWorkbook(new File("F:\\test.xls"));  
12             //選取制定的sheet  
13             Sheet sheet = workbook.getSheet(0);  
14             //選取指定的cell  
15             //遍歷循環得到所要的cell值  
16             for(int j = 0 ;j<sheet.getRows() ; j++)  
17                     for(int i = 0 ;i<sheet.getColumns();i++){  
18             Cell cell = sheet.getCell(i,j);  
19             //獲取該cell的值  
20             String var1 = cell.getContents();  
21             //打印輸出該值  
22             System.out.println(var1);  
23             }  
24     } catch (BiffException e) {  
25             e.printStackTrace();  
26     } catch (IOException e) {  
27             e.printStackTrace();  
28     }  
29   }
30  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM