Office文檔是以二進制格式存儲的,對於它的讀寫不能像普通文本一樣通過File來操作,如果以二進制格式讀取到內存中,我們也是不能夠正確解析其中的內容的,在Windows開發中、或者使用QT開發中,我們可以使用庫提供的控件或者API來操作Office文檔,但是在Android系統開發中,Android本身並沒有提供這樣的一套API。所以我們需要借用開源的一些庫,本文根據項目中的使用需求,項目中使用了Apache POI來讀寫Office文檔,把使用的一些套路、方法和趟過的坑記錄整理出來,方便有同樣需求的朋友參考。
Apache POI
Apache POI是Apache 的一個開源項目,是一個JAVA項目,下載地址:http://poi.apache.org/download.html,API文檔:http://poi.apache.org/apidocs/index.html。Apache POI設計的目的是方便Java程序創建、讀取、寫入Office文檔。
Android 項目中使用Apache POI
1. 從官網下載Binary Distribution包,像導入其它java包一樣,將下載的包放到Android Studio 工程的libs目錄下,並在項目中根據需要導入jar包,可以在工程裏通過圖形化的界面導入,也可以直接在build.gradle中添加依賴,依賴根據自己需要使用的庫添加,官網上有依賴關係,可以對應查找,,比如在我的測試項目中:
2.編譯中如果出現如下問題:java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/..., 請配置java版本到VERSION_1_8,如下:
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
示例代碼:
創建
public class Excel {
private static final String TAG = "Execl";
private static final String[] CONTENT = new String[] {"one", "two", "three", "four", "five", "six",
"seven", "eight", "nine", "ten"};
private static final String FILENAME = "textExcel.xls";
public void exportExcelFile(FileOutputStream fos) {
int size = 10;
Workbook wb = new HSSFWorkbook();
Sheet sh = wb.createSheet();
for (int rownum = 0; rownum < size; rownum++) {
Row row = sh.createRow(rownum);
for (int cellnum = 0; cellnum < size; cellnum++) {
Cell cell = row.createCell(cellnum);
cell.setCellValue(CONTENT[cellnum]);
}
}
try {
wb.write(fos);
fos.close();
Log.d(TAG, "導出成功");
} catch (IOException e) {
e.printStackTrace();
}
}
public StringBuffer importExcelFile(FileInputStream fis) {
StringBuffer buf = new StringBuffer();
try {
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wk = new HSSFWorkbook(fs);
HSSFSheet sheet = wk.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
CellType cellType = cell.getCellType();
if (cellType == CellType.BLANK) {
buf.append("\t");
} else if (cellType == CellType.NUMERIC) {
buf.append(cell.getNumericCellValue())
.append("\t");
} else if (cellType == CellType.STRING) {
buf.append(cell.getStringCellValue())
.append("\t");
}
}
buf.append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return buf;
}
}