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

  • 相关阅读:
    CF938E Max History
    经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷
    在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.2)
    在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.1)
    Java概述
    算法 --- 二分法 冒泡排序 递归 快速排序
    二维数组
    数组
    SNMP "Simple Network Management Protocol" "简单网络管理协议"。
    常用api --- BigDecimal 包装类 Integer Arrays
  • 原文地址:https://www.cnblogs.com/MonkTang/p/9204970.html
Copyright © 2011-2022 走看看