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  }

 

你可能感兴趣的:(table)