最近有這么個(gè)需求,發(fā)現(xiàn)有現(xiàn)成的開(kāi)源庫(kù) jxl 可以完美實(shí)現(xiàn)我的小需求。 參考兩篇文章:
源碼: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());
}
}
}
```?