鍍金池/ 教程/ Android/ 讀取 Excel
多分辨率適配常用目錄
Android 開(kāi)發(fā)環(huán)境(Eclipse+ADT+Android 5.0)
Android 原型設(shè)計(jì)工具探索
Makefile 快速入門
Android Studio的NDK開(kāi)發(fā)
人臉檢測(cè)-靜態(tài)
getprop 與 dumpsys 命令
Maven 編譯開(kāi)源二維碼掃描項(xiàng)目 zxing
畫(huà)布 Canvas
組合控件
Linux 下的模擬器硬件加速
讀取 Excel
android.hardware.camera2 使用指南
橫豎屏切換
Ubuntu 下切換 JDK 版本
拍照和錄像 with Camera
文本與布局
按鈕控制 ViewPager 的左右翻頁(yè)
用 TableLayout 偽裝表格顯示數(shù)據(jù)
Preference Activity 使用詳解
模擬器如何重啟?試試 Genymotion!
獲得屏幕物理尺寸、密度及分辨率
語(yǔ)音識(shí)別
了解 native activity
Android Studio 導(dǎo)入第三方類庫(kù)、jar 包和 so 庫(kù)
啟動(dòng)另一個(gè) App/apk 中的 Activity
APK 簽名
兩個(gè)開(kāi)源的圖表/報(bào)表控件
android studio 導(dǎo)出 jar 包(Module)并獲得手機(jī)信息
圖片的 Base64 編解碼
混淆與反編譯
Android Studio 和 Gradle
Android 5.1 SDK 下載與配置
persistableMode 與 Activity 的持久化
adb 取出安裝在手機(jī)中的 apk
Android Studio 中的源代碼管理
Handler 使用中可能引發(fā)的內(nèi)存泄漏

讀取 Excel

最近有這么個(gè)需求,發(fā)現(xiàn)有現(xiàn)成的開(kāi)源庫(kù) jxl 可以完美實(shí)現(xiàn)我的小需求。 參考兩篇文章:

利用 Java 操作 Excel

官方 blog 教程

源碼:jexcelapi.sourceforge.net/

直接練習(xí)一下,用 Javac 編譯:

    1 import java.io.*;  
    2 import jxl.*;  
    3   
    4 public class Test  
    5 {  
    6         public static void main(String[] args)  
    7         {  
    8                 try {  
    9                 InputStream is = new FileInputStream("test.xls");  
    10                 Workbook book = Workbook.getWorkbook(is);  
    11                 Sheet sheet = book.getSheet(0);  
    12                 Cell cell = sheet.getCell(2,2);  
    13                 String result = cell.getContents();  
    14                 System.out.println(result);  
    15                 book.close();  
    16                 }  
    17                 catch(Exception e) {  
    18                 System.out.println(e);  
    19                 }  
    20            
    21         }  
    22 }   

居然報(bào)錯(cuò):

    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  

網(wǎng)上搜尋方法,并沒(méi)有解決此問(wèn)題,沒(méi)辦法,直接用 Eclipse 來(lái)做練習(xí),正常的加入 JARS 就可以了。

練習(xí)的代碼如下,讀取 Excel 內(nèi)容并顯示在 textview 中,textview 可以上下滾動(dòng)。

大概代碼如下:

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+  "\n");  
               // 獲得第一個(gè)工作表對(duì)象  
               Sheet sheet = book.getSheet(0);  
               int Rows = sheet.getRows();  
               int Cols = sheet.getColumns();  
               txt.append("the name of sheet is " + sheet.getName() + "\n");  
               txt.append("total rows is " + Rows + "\n");  
               txt.append("total cols is " + Cols + "\n");  
               for (int i = 0; i < Cols; ++i) {  
                for (int j = 0; j < Rows; ++j) {  
                 // getCell(Col,Row)獲得單元格的值  
                    txt.append("contents:" + sheet.getCell(i,j).getContents() + "\n");  
                }  
               }  
               book.close();  
              } catch (Exception e) {  
               System.out.println(e);  
              }  
            }  

   }  

完整項(xiàng)目(帶jxl.jar)請(qǐng)猛擊這里。

而其他操作本人并沒(méi)有驗(yàn)證,請(qǐng)自行去讀官方教程或參考以下網(wǎng)絡(luò)中的實(shí)現(xiàn):


    public void createExcel() {  
      try {  
       // 創(chuàng)建或打開(kāi)Excel文件  
       WritableWorkbook book = Workbook.createWorkbook(new File(  
         "mnt/sdcard/test.xls"));  
       // 生成名為“第一頁(yè)”的工作表,參數(shù)0表示這是第一頁(yè)  
       WritableSheet sheet1 = book.createSheet("第一頁(yè)",  0);  
       WritableSheet sheet2 = book.createSheet("第三頁(yè)",  2);  
       // 在Label對(duì)象的構(gòu)造函數(shù)中,元格位置是第一列第一行(0,0)以及單元格內(nèi)容為test  
       Label label = new Label(0, 0, "test");  
       // 將定義好的單元格添加到工作表中  
       sheet1.addCell(label);  
       /* 
        * 生成一個(gè)保存數(shù)字的單元格.必須使用Number的完整包路徑,否則有語(yǔ)法歧義 
        */  
       jxl.write.Number number = new jxl.write.Number(1, 0, 555.12541);  
       sheet2.addCell(number);  
       // 寫(xiě)入數(shù)據(jù)并關(guān)閉文件  
       book.write();  
       book.close();  
      } catch (Exception e) {  
       System.out.println(e);  
      }  
    }  
    /** 
      * jxl暫時(shí)不提供修改已經(jīng)存在的數(shù)據(jù)表,這里通過(guò)一個(gè)小辦法來(lái)達(dá)到這個(gè)目的,不適合大型數(shù)據(jù)更新! 這里是通過(guò)覆蓋原文件來(lái)更新的. 
      * 
      * @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);  
       // 判斷單元格的類型,做出相應(yīng)的轉(zhuǎn)換  
       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 {  
       // 創(chuàng)建工作薄  
       WritableWorkbook wwb = Workbook.createWorkbook(new  File(filePath));  
       // 創(chuàng)建工作表  
       WritableSheet ws = wwb.createSheet("Sheet1", 0);  
       // 添加標(biāo)簽文本  
       // Random rnd = new Random((new Date()).getTime());  
       // int forNumber = rnd.nextInt(100);  
       // Label label = new Label(0, 0, "test");  
       // for (int i = 0; i < 3; i++) {  
       // ws.addCell(label);  
       // ws.addCell(new jxl.write.Number(rnd.nextInt(50), rnd  
       // .nextInt(50), rnd.nextInt(1000)));  
       // }  
       // 添加圖片(注意此處jxl暫時(shí)只支持png格式的圖片)  
       // 0,1分別代表x,y 2,5代表寬和高占的單元格數(shù)  
       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());  
      }  
    }  
    }  
```?