zoukankan      html  css  js  c++  java
  • JAVA对Excel文件进行操作

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为它是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。

    下载:

    Java Excel API的jar包可以通过以下URL获得:

    http://sourceforge.net/projects/jexcelapi/files/jexcelapi/2.6.6/jexcelapi_2_6_6.zip/download

    (包括所有版本):http://sourceforge.net/projects/jexcelapi/files/

    直接下载地址(迅雷上新建任务即可):

    http://nchc.dl.sourceforge.net/project/jexcelapi/jexcelapi/2.6.6/jexcelapi_2_6_6.zip 

    示例1:读取本地Excel文件F:红楼人物.xls

    1.       新建Excel文件F:红楼人物.xls

    内容如下:

    2.       Java通过jexcelapi包操作excel文件:

        //in ExcelOperater   
          
        import java.io.File;   
          
        import java.io.FileInputStream;   
          
        import java.io.InputStream;   
          
            
          
        import jxl.Cell;   
          
        import jxl.CellType;   
          
        import jxl.Sheet;   
          
        import jxl.Workbook;   
          
        import jxl.write.Label;   
          
            
          
        public class ExcelOperater    
          
        {   
          
            public static void main(String[] args)    
          
            {   
          
                jxl.Workbook readwb = null;   
          
                try    
          
                {   
          
                    //构建Workbook对象, 只读Workbook对象   
          
                    //直接从本地文件创建Workbook   
          
                    InputStream instream = new FileInputStream("F:/红楼人物.xls");   
          
                    readwb = Workbook.getWorkbook(instream);   
          
            
          
                    //Sheet的下标是从0开始   
          
                    //获取第一张Sheet表   
          
                    Sheet readsheet = readwb.getSheet(0);   
          
                    //获取Sheet表中所包含的总列数   
          
                    int rsColumns = readsheet.getColumns();   
          
                    //获取Sheet表中所包含的总行数   
          
                    int rsRows = readsheet.getRows();   
          
                    //获取指定单元格的对象引用   
          
                    for (int i = 0; i < rsRows; i++)   
          
                    {   
          
                        for (int j = 0; j < rsColumns; j++)   
          
                        {   
          
                            Cell cell = readsheet.getCell(j, i);   
          
                            System.out.print(cell.getContents() + " ");   
          
                        }   
          
                        System.out.println();   
          
                    }   
          
                       
          
                    //利用已经创建的Excel工作薄,创建新的可写入的Excel工作薄   
          
                    jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(   
          
                            "F:/红楼人物1.xls"), readwb);   
          
                    //读取第一张工作表   
          
                    jxl.write.WritableSheet ws = wwb.getSheet(0);   
          
                    //获得第一个单元格对象   
          
                    jxl.write.WritableCell wc = ws.getWritableCell(0, 0);   
          
                    //判断单元格的类型, 做出相应的转化   
          
                    if (wc.getType() == CellType.LABEL)    
          
                    {   
          
                        Label l = (Label) wc;   
          
                        l.setString("新姓名");   
          
                    }   
          
                    //写入Excel对象   
          
                    wwb.write();   
          
                    wwb.close();   
          
                } catch (Exception e) {   
          
                    e.printStackTrace();   
          
                } finally {   
          
                    readwb.close();   
          
                }   
          
        }   
          
        }   
          

    3.       结果:

    ①     控制台输出:

    人物 等级 大观园位置 金陵十二钗

    林黛玉 小姐 潇湘馆 正册

    妙玉 世外 栊翠庵 正册

    晴雯 丫鬟 怡红院 副册

    香菱 妾 蘅芜苑 又副册

    ②     创建文件F:红楼人物1.xls

    4.       程序解析:

    所引用的包:

    ①     Workbook对象,需要jxl.Workbook包;

    ②     InputStream、FileInputStream对象:需要java.io.FileInputStream和java.io.InputStream包。

    ③     Sheet对象:jxl.Sheet包;注意excel中sheet表单的行列从0开始计数。

    ④     Cell对象:jxl.Cell包;对单元进行处理

    ⑤     Label:选择jxl.write.label包

    ⑥     WritableWorkbook、WritableSheet、WritableCelll对象

    实例二:3个功能-----从excel文件F:红楼人物.xls读取数据;生成新的excel文件F:红楼人物2.xls;修改原excel一个单元并输出为F:红楼人物3.xls。

    原始文件:F:红楼人物.xls

    运行结果:

    ①     控制台输出:

    人物 等级 大观园位置 金陵十二钗

    林黛玉 小姐 潇湘馆 正册

    妙玉 世外 栊翠庵 正册

    晴雯 丫鬟 怡红院 副册

    香菱 妾 蘅芜苑 又副册

    ②     写入输出Excel文件:F:红楼人物2.xls

    ③     修改输出文件 F:红楼人物3.xls (加修饰后输出)

    示例程序:

      1     //in ExcelHandle   
      2       
      3     import jxl.*;   
      4       
      5     import jxl.format.UnderlineStyle;   
      6       
      7     import jxl.write.*;   
      8       
      9     import jxl.write.Number;   
     10       
     11     import jxl.write.Boolean;   
     12       
     13     import jxl.Cell;   
     14       
     15         
     16       
     17     import java.io.*;   
     18       
     19         
     20       
     21     public class ExcelHandle   
     22       
     23     {   
     24       
     25         public ExcelHandle()   
     26       
     27         {   
     28       
     29         }   
     30       
     31         /***读取Excel*/  
     32       
     33         public static void readExcel(String filePath)   
     34       
     35         {   
     36       
     37             try  
     38       
     39             {   
     40       
     41                 InputStream is = new FileInputStream(filePath);   
     42       
     43                 Workbook rwb = Workbook.getWorkbook(is);   
     44       
     45                 //这里有两种方法获取sheet表:名字和下标(从0开始)   
     46       
     47                 //Sheet st = rwb.getSheet("original");   
     48       
     49                 Sheet st = rwb.getSheet(0);   
     50       
     51                 /**  
     52      
     53                 //获得第一行第一列单元的值  
     54      
     55                 Cell c00 = st.getCell(0,0);  
     56      
     57                 //通用的获取cell值的方式,返回字符串  
     58      
     59                 String strc00 = c00.getContents();  
     60      
     61                 //获得cell具体类型值的方式  
     62      
     63                 if(c00.getType() == CellType.LABEL)  
     64      
     65                 {  
     66      
     67                     LabelCell labelc00 = (LabelCell)c00;  
     68      
     69                     strc00 = labelc00.getString();  
     70      
     71                 }  
     72      
     73                 //输出  
     74      
     75                 System.out.println(strc00);*/  
     76       
     77                 //Sheet的下标是从0开始   
     78       
     79                 //获取第一张Sheet表   
     80       
     81                 Sheet rst = rwb.getSheet(0);   
     82       
     83                 //获取Sheet表中所包含的总列数   
     84       
     85                 int rsColumns = rst.getColumns();   
     86       
     87                 //获取Sheet表中所包含的总行数   
     88       
     89                 int rsRows = rst.getRows();   
     90       
     91                 //获取指定单元格的对象引用   
     92       
     93                 for (int i = 0; i < rsRows; i++)   
     94       
     95                 {   
     96       
     97                     for (int j = 0; j < rsColumns; j++)   
     98       
     99                     {   
    100       
    101                         Cell cell = rst.getCell(j, i);   
    102       
    103                         System.out.print(cell.getContents() + " ");   
    104       
    105                     }   
    106       
    107                     System.out.println();   
    108       
    109                 }             
    110       
    111                 //关闭   
    112       
    113                 rwb.close();   
    114       
    115             }   
    116       
    117             catch(Exception e)   
    118       
    119             {   
    120       
    121                 e.printStackTrace();   
    122       
    123             }   
    124       
    125         }   
    126       
    127         /**输出Excel*/  
    128       
    129         public static void writeExcel(OutputStream os)   
    130       
    131         {   
    132       
    133             try  
    134       
    135             {   
    136       
    137        /** 只能通过API提供的 工厂方法来创建Workbook,而不能使用WritableWorkbook的构造函数,因为类WritableWorkbook的构造函数为 protected类型:方法一:直接从目标文件中读取 WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));方法 二:如下实例所示 将WritableWorkbook直接写入到输出流*/  
    138       
    139                 WritableWorkbook wwb = Workbook.createWorkbook(os);   
    140       
    141                 //创建Excel工作表 指定名称和位置   
    142       
    143                 WritableSheet ws = wwb.createSheet("Test Sheet 1",0);   
    144       
    145                 /**************往工作表中添加数据*****************/  
    146       
    147                 //1.添加Label对象   
    148       
    149                 Label label = new Label(0,0,"测试");   
    150       
    151                 ws.addCell(label);   
    152       
    153                 //添加带有字型Formatting对象   
    154       
    155                 WritableFont wf = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);   
    156       
    157                 WritableCellFormat wcf = new WritableCellFormat(wf);   
    158       
    159                 Label labelcf = new Label(1,0,"this is a label test",wcf);   
    160       
    161                 ws.addCell(labelcf);   
    162       
    163                 //添加带有字体颜色的Formatting对象   
    164       
    165                 WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,   
    166       
    167                         UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.DARK_YELLOW);   
    168       
    169                 WritableCellFormat wcfFC = new WritableCellFormat(wfc);   
    170       
    171                 Label labelCF = new Label(1,0,"Ok",wcfFC);   
    172       
    173                 ws.addCell(labelCF);   
    174       
    175                   
    176       
    177                 //2.添加Number对象   
    178       
    179                 Number labelN = new Number(0,1,3.1415926);   
    180       
    181                 ws.addCell(labelN);   
    182       
    183                 //添加带有formatting的Number对象   
    184       
    185                 NumberFormat nf = new NumberFormat("#.##");   
    186       
    187                 WritableCellFormat wcfN = new WritableCellFormat(nf);   
    188       
    189                 Number labelNF = new jxl.write.Number(1,1,3.1415926,wcfN);   
    190       
    191                 ws.addCell(labelNF);   
    192       
    193                    
    194       
    195                 //3.添加Boolean对象   
    196       
    197                 Boolean labelB = new jxl.write.Boolean(0,2,true);   
    198       
    199                 ws.addCell(labelB);   
    200       
    201                 Boolean labelB1 = new jxl.write.Boolean(1,2,false);   
    202       
    203                 ws.addCell(labelB1);             
    204       
    205                 //4.添加DateTime对象   
    206       
    207                 jxl.write.DateTime labelDT = new jxl.write.DateTime(0,3,new java.util.Date());   
    208       
    209                 ws.addCell(labelDT);   
    210       
    211                   
    212       
    213                 //5.添加带有formatting的DateFormat对象   
    214       
    215                 DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");   
    216       
    217                 WritableCellFormat wcfDF = new WritableCellFormat(df);   
    218       
    219                 DateTime labelDTF = new DateTime(1,3,new java.util.Date(),wcfDF);   
    220       
    221                 ws.addCell(labelDTF);   
    222       
    223                 //6.添加图片对象,jxl只支持png格式图片   
    224       
    225                 File image = new File("f:\1.png");   
    226       
    227                 WritableImage wimage = new WritableImage(0,4,6,17,image);   
    228       
    229                 ws.addImage(wimage);   
    230       
    231                 //7.写入工作表   
    232       
    233                 wwb.write();   
    234       
    235                 wwb.close();   
    236       
    237             }   
    238       
    239             catch(Exception e)   
    240       
    241             {   
    242       
    243                 e.printStackTrace();   
    244       
    245             }   
    246       
    247         }   
    248       
    249         /** 将file1拷贝后,进行修改并创建输出对象file2  
    250      
    251          * 单元格原有的格式化修饰不能去掉,但仍可将新的单元格修饰加上去,  
    252      
    253          * 以使单元格的内容以不同的形式表现  
    254      
    255          */  
    256       
    257         public static void modifyExcel(File file1,File file2)   
    258       
    259         {   
    260       
    261             try  
    262       
    263             {   
    264       
    265                 Workbook rwb = Workbook.getWorkbook(file1);   
    266       
    267                 WritableWorkbook wwb = Workbook.createWorkbook(file2,rwb);//copy   
    268       
    269                 WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,   
    270       
    271                         UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLUE);   
    272       
    273                 WritableCellFormat wcfFC = new WritableCellFormat(wfc);    
    274       
    275                 WritableSheet ws = wwb.getSheet(0);   
    276       
    277                 WritableCell wc = ws.getWritableCell(0,0);   
    278       
    279                 //判断单元格的类型,做出相应的转换   
    280       
    281                 if(wc.getType() == CellType.LABEL)   
    282       
    283                 {   
    284       
    285                     Label labelCF =new Label(0,0,"人物(新)",wcfFC);   
    286       
    287                     ws.addCell(labelCF);     
    288       
    289                   //Label label = (Label)wc;   
    290       
    291                   //label.setString("被修改");   
    292       
    293                 }   
    294       
    295               wwb.write();   
    296       
    297                 wwb.close();   
    298       
    299                 rwb.close();   
    300       
    301             }   
    302       
    303             catch(Exception e)   
    304       
    305             {   
    306       
    307                 e.printStackTrace();   
    308       
    309             }   
    310       
    311         }   
    312       
    313         //测试   
    314       
    315         public static void main(String args[])   
    316       
    317         {   
    318       
    319             try  
    320       
    321             {   
    322       
    323                 //读EXCEL   
    324       
    325             ExcelHandle.readExcel("F:/红楼人物.xls");   
    326       
    327                 //输出EXCEL   
    328       
    329             File filewrite=new File("F:/红楼人物2.xls");   
    330       
    331             filewrite.createNewFile();   
    332       
    333             OutputStream os=new FileOutputStream(filewrite);   
    334       
    335             ExcelHandle.writeExcel(os);   
    336       
    337                 //修改EXCEL   
    338       
    339             ExcelHandle.modifyExcel(new File("F:/红楼人物.xls"), new File("F:/红楼人物3.xls"));   
    340       
    341             }   
    342       
    343             catch(Exception e)   
    344       
    345             {   
    346       
    347             e.printStackTrace();   
    348       
    349             }   
    350       
    351         }   
    352       
    353     }   
    354       

    附:

    调用流程如下:

    1.打开工作文件Workbook,在此之前先用java的io流创建或者读取文件
    2.打开工作表Sheet
    3.读行,然后读列。注意,行和列是从零开始的
    4.取得数据进行操作
     

    来自网络à读取Excel数据表

    第一步:创建Workbook(术语:工作薄)

    2种方法:Workbook,就可以通过它来访问Excel Sheet(术语:工作表):

      1     //从输入流创建Workbook读取excel数据表   
      2       
      3         InputStream is = new FileInputStream(sourcefile);   
      4       
      5         jxl.Workbook workbook = Workbook.getWorkbook(is);   
      6       
      7     //直接从本地文件(.xls)创建Workbook   
      8       
      9     Workbook workbook = Workbook.getWorkbook(new File(excelfile));   
     10 
     11 一旦创建了
     12 
     13 第二步:访问sheet。
     14 
     15 2种方法:通过sheet的名称;或者通过下标,下标从0开始。
     16 
     17     //获取第一张Sheet表   
     18       
     19     Sheet rs = workbook.getSheet(0);   
     20       
     21     一旦得到了Sheet,就可以通过它来访问Excel Cell(术语:单元格)。   
     22       
     23     第三步:访问单元格cell   
     24       
     25     //获取第一行,第一列的值   
     26       
     27     Cell c00 = rs.getCell(0, 0);   
     28       
     29     String strc00 = c00.getContents();   
     30       
     31     //获取第一行,第二列的值   
     32       
     33     Cell c10 = rs.getCell(1, 0);   
     34       
     35     String strc10 = c10.getContents();   
     36       
     37     //获取第二行,第二列的值   
     38       
     39     Cell c11 = rs.getCell(1, 1);   
     40       
     41     String strc11 = c11.getContents();   
     42       
     43         
     44       
     45     System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());   
     46       
     47     System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());   
     48       
     49     System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());   
     50       
     51 
     52 第四步:操作数据
     53 
     54 如果仅仅是取得Cell的 值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。如果有需要知道Cell内容的确切类型,API也提供了一系列的方法:
     55 
     56     String strc00 = null;   
     57       
     58     double strc10 = 0.00;   
     59       
     60     Date strc11 = null;   
     61       
     62     Cell c00 = rs.getCell(0, 0);   
     63       
     64     Cell c10 = rs.getCell(1, 0);   
     65       
     66     Cell c11 = rs.getCell(1, 1);   
     67       
     68     if(c00.getType() == CellType.LABEL)   
     69       
     70     {   
     71       
     72     LabelCell labelc00 = (LabelCell)c00;   
     73       
     74     strc00 = labelc00.getString();   
     75       
     76     }   
     77       
     78     if(c10.getType() == CellType.NUMBER)   
     79       
     80     {   
     81       
     82     NmberCell numc10 = (NumberCell)c10;   
     83       
     84     strc10 = numc10.getValue();   
     85       
     86     }   
     87       
     88     if(c11.getType() == CellType.DATE)   
     89       
     90     {   
     91       
     92     DateCell datec11 = (DateCell)c11;   
     93       
     94     strc11 = datec11.getDate();   
     95       
     96     }   
     97       
     98         
     99       
    100     System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());   
    101       
    102     System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());   
    103       
    104     System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());   
    105       

    在得到

    循环取出全部数据,并转化为相应格式:

     1     int rows = sheet.getRows();   
     2       
     3     for (int i = 1; i < rows; i++) {   
     4       
     5         Cell cb1 = sheet.getCell(0, i);   
     6       
     7         Cell cb2 = sheet.getCell(1, i);   
     8       
     9         Cell num3 = sheet.getCell(2, i);   
    10       
    11         Cell num4 = sheet.getCell(3, i);   
    12       
    13         
    14       
    15         String user = "";   
    16       
    17         String rule = "";   
    18       
    19         int numNew = 0;   
    20       
    21         int numEdit = 0;   
    22       
    23         if (cb1.getType() == CellType.LABEL) {   
    24       
    25              LabelCell lc = (LabelCell) cb1;   
    26       
    27              user = lc.getString();   
    28       
    29         }   
    30       
    31         if (cb2.getType() == CellType.LABEL) {   
    32       
    33              LabelCell lc = (LabelCell) cb2;   
    34       
    35         rule = lc.getString();   
    36       
    37         }   
    38       
    39         if (num3.getType() == CellType.NUMBER_FORMULA) {   
    40       
    41              NumberFormulaCell nc = (NumberFormulaCell) num3;   
    42       
    43              try {   
    44       
    45                  numNew = Double.valueOf(nc.getFormula()).intValue();   
    46       
    47              } catch (FormulaException e) {   
    48       
    49                  e.printStackTrace();   
    50       
    51              }   
    52       
    53         }   
    54       
    55         if (num4.getType() == CellType.NUMBER_FORMULA) {   
    56       
    57              NumberFormulaCell nc = (NumberFormulaCell) num4;   
    58       
    59              try {   
    60       
    61                  numEdit = Double.valueOf(nc.getFormula()).intValue();   
    62       
    63              } catch (FormulaException e) {   
    64       
    65                  e.printStackTrace();   
    66       
    67              }   
    68       
    69         }   
    70       
    71     }   
    72       

    第五步:关闭对象,释放内存。

    完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。

    Cell对象后,通过 getType()方法可以获得该单元格的类型,然后与API提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值方法getXXX(),就可以得到确定类型的值。

    ps:不支持读取 excel 2007 文件(*.xlsx),只支持 excel 2003 (*.xls)

    PS:GetRows()方法来获取总的行数的时候会出现不可预知的问题:可能获得的值会大于实际值。可能是因为Excel中单元格存在空值的情况,也被获取到。这时候暂时考虑遍历判空,但如果表格很大的情况,效率会很低。

  • 相关阅读:
    LeetCode153 Find Minimum in Rotated Sorted Array. LeetCode162 Find Peak Element
    LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word
    LeetCode172 Factorial Trailing Zeroes. LeetCode258 Add Digits. LeetCode268 Missing Number
    LeetCode191 Number of 1 Bits. LeetCode231 Power of Two. LeetCode342 Power of Four
    LeetCode225 Implement Stack using Queues
    LeetCode150 Evaluate Reverse Polish Notation
    LeetCode125 Valid Palindrome
    LeetCode128 Longest Consecutive Sequence
    LeetCode124 Binary Tree Maximum Path Sum
    LeetCode123 Best Time to Buy and Sell Stock III
  • 原文地址:https://www.cnblogs.com/liuyk-code/p/6672347.html
Copyright © 2011-2022 走看看