• 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  }
  • 相关阅读:
    将博客搬至CSDN
    神州笔记本电脑【K670D】安装 Ubuntu18.04 系列操作
    ValueError: Unknown label type: 'continuous'
    Spark: JAVA_HOME is not set
    IDEA 搭建 Spark 源码 (Ubuntu)
    XX-Net 解决IPV6 不稳定,时好时坏。
    解决SBT下载慢,dump project structure from sbt?
    pip install kaggle 出现 【网络不可达】?
    Git clone 克隆Github上的仓库,速度慢?
    进程间的通信方式
  • 原文地址:https://www.cnblogs.com/m3Lee/p/3673826.html
Copyright © 2020-2023  润新知