集成POI
由于Apache的POI框架里面一些引用類(lèi),在JRE中有云挟,但是在Android上面沒(méi)有梆砸,在集成后的使用中會(huì)出現(xiàn)一些錯(cuò)誤,例如
- 提示noClassFound javax.xml.xxx
- java.lang.VerifyError: org/apache/poi/xssf/usermodel/XSSFWorkbook
- 64k錯(cuò)誤
所以不建議使用Apache的POI庫(kù)园欣,這里建議使用github上大神重新打包的POI閹割版帖世。
Android 5.0以上:Github地址
Android 5.0以下:Github地址
直接下載poi-3.12-android-a.jar和poi-ooxml-schemas-3.12-20150511-a.jar兩個(gè)jar包,然后放到項(xiàng)目lib目錄下沸枯,右鍵Add As Library就可以了日矫。
POI讀取Excel
首先獲取Excel的文件流,然后直接獲取Excel的HSSFWorkbook對(duì)象绑榴,這里因?yàn)槭且x取的 ==.xls== 的文件哪轿。如果是 ==.xlsx== 的文件可以使用XSSFWorkbook,用法都是一樣的彭沼。
這里Sheet是對(duì)應(yīng)的Excel中底部標(biāo)簽對(duì)象缔逛,Row是對(duì)應(yīng)表格中每行,Cell是對(duì)應(yīng)表格中的每個(gè)單元格姓惑。
// 獲取excel文件流
InputStream is = getAssets().open("計(jì)價(jià)器檢定證書(shū).xls");
// 獲取workbook對(duì)象
HSSFWorkbook workbook = new HSSFWorkbook(is);
// 獲取sheet對(duì)象
Sheet sheet = workbook.getSheetAt(0);
// 獲取row對(duì)象
Row row = sheet.getRow(0);
// 獲取cell對(duì)象
Cell cell = row.getCell(0);
修改單元格,設(shè)置單元格格式
單元格格式通過(guò)CellStyle對(duì)象進(jìn)行修改按脚,字體通過(guò)HSSFFont對(duì)象進(jìn)行修改于毙。
// 獲取CellStyle對(duì)象
CellStyle cellStyle = workbook.createCellStyle();
// 獲取HSSFFont對(duì)象
HSSFFont font = (HSSFFont) workbook.createFont();
// 設(shè)置字體12號(hào)
font.setFontHeightInPoints((short) 12);
// 設(shè)置字體宋體
font.setFontName("宋體");
// 設(shè)置字體
cellStyle.setFont(font);
// 設(shè)置單元格居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 設(shè)置單元格下邊框
cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
// 單元格設(shè)置樣式
cell.setCellStyle(cellStyle);
// 單元格賦值
cell.setCellValue(str);
這里我寫(xiě)了一個(gè)脫離業(yè)務(wù)的,設(shè)置單元格的工具方法辅搬,傳入要填寫(xiě)單元格的Excel坐標(biāo)唯沮,要填入的值脖旱,和單元格格式對(duì)象,即可完成填寫(xiě)
/**
* 為Cell填值的公共方法
*
* @param locStr excel單元格坐標(biāo)點(diǎn)的值(例如:G21)
* @param msg 要填入的值
* @param cellStyle 單元格格式可以為null
*/
public void setValue(String locStr, String msg, CellStyle cellStyle) {
int locX = locX2Num(locStr);
int locY = locY2Num(locStr);
Cell cell = sheet.getRow(locY).getCell(locX);
if (cellStyle != null) cell.setCellStyle(cellStyle);
cell.setCellValue(msg);
}
這里是將Excel坐標(biāo)轉(zhuǎn)化為可直接在代碼里使用的Y坐標(biāo)介蛉,直接傳入Excel坐標(biāo)值即可
/**
* 將Excel的坐標(biāo)Y值轉(zhuǎn)換為代碼可用數(shù)字坐標(biāo)
*
* @param locStr excel坐標(biāo)點(diǎn)的值(完整坐標(biāo))
*/
private int locY2Num(String locStr) {
char[] locs = locStr.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : locs) {
if (c >= '0' && c <= '9') {
sb.append(c);
}
}
return Integer.parseInt(sb.toString()) - 1;
}
這里是將Excel坐標(biāo)轉(zhuǎn)化為可直接在代碼里使用的X坐標(biāo)萌庆,直接傳入Excel坐標(biāo)值即可
/**
* 將Excel的坐標(biāo)X值轉(zhuǎn)換為代碼可用數(shù)字坐標(biāo)
*
* @param locStr excel坐標(biāo)點(diǎn)的值(完整坐標(biāo))
*/
private int locX2Num(String locStr) {
char[] locs = locStr.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : locs) {
if (c >= 'A' && c <= 'Z') {
sb.append(c);
}
}
char[] locsX = sb.toString().toCharArray();
int resultX = 0;
for (int i = locsX.length; i > 0; i--) {
int temp = 1;
for (int j = 1; j < i; j++) {
temp = temp * (locsX[locsX.length - i] - 'A' + 1) * 26;
}
resultX += temp;
}
return resultX + (locsX[locsX.length - 1] - 'A') - 1;
}
POI寫(xiě)入Excel
完成編輯后,調(diào)用workbook.write直接將流寫(xiě)入要保存的文件位置即可
File file = new File(Environment.getExternalStorageDirectory() + "/計(jì)價(jià)器檢定證書(shū).xls");
OutputStream out = new FileOutputStream(file);
workbook.write(out);