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文件:

    1. //in ExcelOperater   
    2.   
    3. import java.io.File;   
    4.   
    5. import java.io.FileInputStream;   
    6.   
    7. import java.io.InputStream;   
    8.   
    9.     
    10.   
    11. import jxl.Cell;   
    12.   
    13. import jxl.CellType;   
    14.   
    15. import jxl.Sheet;   
    16.   
    17. import jxl.Workbook;   
    18.   
    19. import jxl.write.Label;   
    20.   
    21.     
    22.   
    23. public class ExcelOperater    
    24.   
    25. {   
    26.   
    27.     public static void main(String[] args)    
    28.   
    29.     {   
    30.   
    31.         jxl.Workbook readwb = null;   
    32.   
    33.         try    
    34.   
    35.         {   
    36.   
    37.             //构建Workbook对象, 只读Workbook对象   
    38.   
    39.             //直接从本地文件创建Workbook   
    40.   
    41.             InputStream instream = new FileInputStream("F:/红楼人物.xls");   
    42.   
    43.             readwb = Workbook.getWorkbook(instream);   
    44.   
    45.     
    46.   
    47.             //Sheet的下标是从0开始   
    48.   
    49.             //获取第一张Sheet表   
    50.   
    51.             Sheet readsheet = readwb.getSheet(0);   
    52.   
    53.             //获取Sheet表中所包含的总列数   
    54.   
    55.             int rsColumns = readsheet.getColumns();   
    56.   
    57.             //获取Sheet表中所包含的总行数   
    58.   
    59.             int rsRows = readsheet.getRows();   
    60.   
    61.             //获取指定单元格的对象引用   
    62.   
    63.             for (int i = 0; i < rsRows; i++)   
    64.   
    65.             {   
    66.   
    67.                 for (int j = 0; j < rsColumns; j++)   
    68.   
    69.                 {   
    70.   
    71.                     Cell cell = readsheet.getCell(j, i);   
    72.   
    73.                     System.out.print(cell.getContents() + " ");   
    74.   
    75.                 }   
    76.   
    77.                 System.out.println();   
    78.   
    79.             }   
    80.   
    81.                
    82.   
    83.             //利用已经创建的Excel工作薄,创建新的可写入的Excel工作薄   
    84.   
    85.             jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(   
    86.   
    87.                     "F:/红楼人物1.xls"), readwb);   
    88.   
    89.             //读取第一张工作表   
    90.   
    91.             jxl.write.WritableSheet ws = wwb.getSheet(0);   
    92.   
    93.             //获得第一个单元格对象   
    94.   
    95.             jxl.write.WritableCell wc = ws.getWritableCell(0, 0);   
    96.   
    97.             //判断单元格的类型, 做出相应的转化   
    98.   
    99.             if (wc.getType() == CellType.LABEL)    
    100.   
    101.             {   
    102.   
    103.                 Label l = (Label) wc;   
    104.   
    105.                 l.setString("新姓名");   
    106.   
    107.             }   
    108.   
    109.             //写入Excel对象   
    110.   
    111.             wwb.write();   
    112.   
    113.             wwb.close();   
    114.   
    115.         } catch (Exception e) {   
    116.   
    117.             e.printStackTrace();   
    118.   
    119.         } finally {   
    120.   
    121.             readwb.close();   
    122.   
    123.         }   
    124.   
    125. }   
    126.   
    127. }   
    128.   

    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));   

    一旦创建了

    第二步:访问sheet。

    2种方法:通过sheet的名称;或者通过下标,下标从0开始。

    1. //获取第一张Sheet表   
    2.   
    3. Sheet rs = workbook.getSheet(0);   
    4.   
    5. 一旦得到了Sheet,就可以通过它来访问Excel Cell(术语:单元格)。   
    6.   
    7. 第三步:访问单元格cell   
    8.   
    9. //获取第一行,第一列的值   
    10.   
    11. Cell c00 = rs.getCell(0, 0);   
    12.   
    13. String strc00 = c00.getContents();   
    14.   
    15. //获取第一行,第二列的值   
    16.   
    17. Cell c10 = rs.getCell(1, 0);   
    18.   
    19. String strc10 = c10.getContents();   
    20.   
    21. //获取第二行,第二列的值   
    22.   
    23. Cell c11 = rs.getCell(1, 1);   
    24.   
    25. String strc11 = c11.getContents();   
    26.   
    27.     
    28.   
    29. System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());   
    30.   
    31. System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());   
    32.   
    33. System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());   
    34.   

    第四步:操作数据

    如果仅仅是取得Cell的 值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。如果有需要知道Cell内容的确切类型,API也提供了一系列的方法:

    1. String strc00 = null;   
    2.   
    3. double strc10 = 0.00;   
    4.   
    5. Date strc11 = null;   
    6.   
    7. Cell c00 = rs.getCell(0, 0);   
    8.   
    9. Cell c10 = rs.getCell(1, 0);   
    10.   
    11. Cell c11 = rs.getCell(1, 1);   
    12.   
    13. if(c00.getType() == CellType.LABEL)   
    14.   
    15. {   
    16.   
    17. LabelCell labelc00 = (LabelCell)c00;   
    18.   
    19. strc00 = labelc00.getString();   
    20.   
    21. }   
    22.   
    23. if(c10.getType() == CellType.NUMBER)   
    24.   
    25. {   
    26.   
    27. NmberCell numc10 = (NumberCell)c10;   
    28.   
    29. strc10 = numc10.getValue();   
    30.   
    31. }   
    32.   
    33. if(c11.getType() == CellType.DATE)   
    34.   
    35. {   
    36.   
    37. DateCell datec11 = (DateCell)c11;   
    38.   
    39. strc11 = datec11.getDate();   
    40.   
    41. }   
    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.   

    在得到

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

    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(),就可以得到确定类型的值。

  • 相关阅读:
    VC 常见问题百问
    python windows 环境变量
    Check server headers and verify HTTP Status Codes
    Where are the AES 256bit cipher suites? Please someone help
    outlook 如何预订会议和会议室
    安装Axis2的eclipse插件后,未出现界面
    windows 环境变量
    python 时间日期处理汇集
    openldap学习笔记(使用openldap2.3.32)
    set p4 environment in windows
  • 原文地址:https://www.cnblogs.com/MonkTang/p/9204970.html
Copyright © 2011-2022 走看看