牛骨文教育服务平台(让学习变的简单)

最近有这么个需求,发现有现成的开源库jxl可以完美实现我的小需求。

参考两篇文章:

利用Java操作Excel

官方blog教程

源码:jexcelapi.sourceforge.net/‎

直接练习一下,用javac编译:

 import java.io.*;  
 import jxl.*;  
   
 public class Test  
 {  
         public static void main(String[] args)  
         {  
                 try {  
                 InputStream is = new FileInputStream("test.xls");  
                 Workbook book = Workbook.getWorkbook(is);  
                 Sheet sheet = book.getSheet(0);  
                 Cell cell = sheet.getCell(2,2);  
                 String result = cell.getContents();  
                 System.out.println(result);  
                 book.close();  
                 }  
                 catch(Exception e) {  
                 System.out.println(e);  
                 }  
            
         }  
 }   

居然报错:

linc:~/workspace/java/test-excel$ javac -cp jxl.jar Test.java   
linc:~/workspace/java/test-excel$ ls  
jxl.jar  Test.class  Test.java  test.xls  
linc:~/workspace/java/test-excel$ java Test  
Exception in thread "main" java.lang.NoClassDefFoundError: jxl/Workbook  
    at Test.main(Test.java:9)  
Caused by: java.lang.ClassNotFoundException: jxl.Workbook  
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)  
    at java.security.AccessController.doPrivileged(Native Method)  
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)  
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)  
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)  
    ... 1 more  

网上搜寻方法,并没有解决此问题,没办法,直接用Eclipse来做练习,正常的加入JARS就可以了。

练习的代码如下,读取Excel内容并显示在textview中,textview可以上下滚动。

大概代码如下:

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:paddingBottom="@dimen/activity_vertical_margin"  
    android:paddingLeft="@dimen/activity_horizontal_margin"  
    android:paddingRight="@dimen/activity_horizontal_margin"  
    android:paddingTop="@dimen/activity_vertical_margin"  
    tools:context=".MainActivity" >  
  
    <TextView  
        android:id="@+id/txt_show"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:singleLine="false"  
        android:scrollbars="vertical"  
        android:text="@string/hello_world" />  
  
</RelativeLayout>  

MainActivity.java

package com.linc.readdata;  
  
import java.io.FileInputStream;  
import java.io.InputStream;  
  
import android.os.Bundle;  
import android.app.Activity;  
import android.text.method.ScrollingMovementMethod;  
import android.view.Menu;  
import android.widget.TextView;  
  
import jxl.*;  
  
public class MainActivity extends Activity {  
    TextView txt = null;  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        txt = (TextView)findViewById(R.id.txt_show);  
        txt.setMovementMethod(ScrollingMovementMethod.getInstance());  
        readExcel();  
    }  
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }  
      
    public void readExcel() {  
          try {  
           InputStream is = new FileInputStream("mnt/sdcard/test.xls");  
           //Workbook book = Workbook.getWorkbook(new File("mnt/sdcard/test.xls"));  
           Workbook book = Workbook.getWorkbook(is);  
           int num = book.getNumberOfSheets();  
           txt.setText("the num of sheets is " + num+ "
");  
           // 获得第一个工作表对象  
           Sheet sheet = book.getSheet(0);  
           int Rows = sheet.getRows();  
           int Cols = sheet.getColumns();  
           txt.append("the name of sheet is " + sheet.getName() + "
");  
           txt.append("total rows is " + Rows + "
");  
           txt.append("total cols is " + Cols + "
");  
           for (int i = 0; i 
            for (int j = 0; j 
             // getCell(Col,Row)获得单元格的值  
                txt.append("contents:" + sheet.getCell(i,j).getContents() + "
");  
            }  
           }  
           book.close();  
          } catch (Exception e) {  
           System.out.println(e);  
          }  
        }  
  
}  

完整项目(带jxl.jar)请猛击这里

而其他操作本人并没有验证,请自行去读官方教程或参考以下网络中的实现:

  public void createExcel() {  
    try {  
     // 创建或打开Excel文件  
     WritableWorkbook book = Workbook.createWorkbook(new File(  
       "mnt/sdcard/test.xls"));  
     // 生成名为“第一页”的工作表,参数0表示这是第一页  
     WritableSheet sheet1 = book.createSheet("第一页", 0);  
     WritableSheet sheet2 = book.createSheet("第三页", 2);  
     // 在Label对象的构造函数中,元格位置是第一列第一行(0,0)以及单元格内容为test  
     Label label = new Label(0, 0, "test");  
     // 将定义好的单元格添加到工作表中  
     sheet1.addCell(label);  
     /* 
      * 生成一个保存数字的单元格.必须使用Number的完整包路径,否则有语法歧义 
      */  
     jxl.write.Number number = new jxl.write.Number(1, 0, 555.12541);  
     sheet2.addCell(number);  
     // 写入数据并关闭文件  
     book.write();  
     book.close();  
    } catch (Exception e) {  
     System.out.println(e);  
    }  
  }  
  /** 
    * jxl暂时不提供修改已经存在的数据表,这里通过一个小办法来达到这个目的,不适合大型数据更新! 这里是通过覆盖原文件来更新的. 
    * 
    * @param filePath 
    */  
  public void updateExcel(String filePath) {  
    try {  
     Workbook rwb = Workbook.getWorkbook(new File(filePath));  
     WritableWorkbook wwb = Workbook.createWorkbook(new File(  
       "d:/new.xls"), rwb);// copy  
     WritableSheet ws = wwb.getSheet(0);  
     WritableCell wc = ws.getWritableCell(0, 0);  
     // 判断单元格的类型,做出相应的转换  
     Label label = (Label) wc;  
     label.setString("The value has been modified");  
     wwb.write();  
     wwb.close();  
     rwb.close();  
    } catch (Exception e) {  
     e.printStackTrace();  
    }  
  }  
  public static void writeExcel(String filePath) {  
    try {  
     // 创建工作薄  
     WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath));  
     // 创建工作表  
     WritableSheet ws = wwb.createSheet("Sheet1", 0);  
     // 添加标签文本  
     // Random rnd = new Random((new Date()).getTime());  
     // int forNumber = rnd.nextInt(100);  
     // Label label = new Label(0, 0, "test");  
     // for (int i = 0; i   
     // ws.addCell(label);  
     // ws.addCell(new jxl.write.Number(rnd.nextInt(50), rnd  
     // .nextInt(50), rnd.nextInt(1000)));  
     // }  
     // 添加图片(注意此处jxl暂时只支持png格式的图片)  
     // 0,1分别代表x,y 2,5代表宽和高占的单元格数  
     ws.addImage(new WritableImage(5, 5, 2, 5, new File(  
       "mnt/sdcard/nb.png")));  
     wwb.write();  
     wwb.close();  
    } catch (Exception e) {  
     System.out.println(e.toString());  
    }  
  }  
  }