android excel导入导出案例和jar包

549 阅读2分钟

jar包下载

链接: pan.baidu.com/s/1UEfWLcf5… 提取码: 3kt3 

操作工具类

public class ExcelUtil {    private static final String TAG =ExcelUtil.class.getSimpleName();    //-------------------------动态读写Excel start-------------------------------//    public static List<Map<Integer, Object>> readExcelNew(Context context, Uri uri, String filePath) {        List<Map<Integer, Object>> list = null;        Workbook wb;        if (filePath == null) {            return null;        }        String extString;        if (!filePath.endsWith(".xls") && !filePath.endsWith(".xlsx")) {            ToastUtils.showShort("格式有误");            return null;        }        extString = filePath.substring(filePath.lastIndexOf("."));        InputStream is;        try {            is = context.getContentResolver().openInputStream(uri);            Log.i(TAG, "readExcel: " + extString);            if (".xls".equals(extString)) {                wb = new HSSFWorkbook(is);            } else if (".xlsx".equals(extString)) {                wb = new XSSFWorkbook(is);            } else {                wb = null;            }            if (wb != null) {                // 用来存放表中数据                list = new ArrayList<>();                // 获取第一个sheet                Sheet sheet = wb.getSheetAt(0);                // 获取第一行标题                Row rowHeader = sheet.getRow(0);                int cellsCount = rowHeader.getPhysicalNumberOfCells();                //存放标题map                Map<Integer, Object> headerMap = new HashMap<>();                for (int c = 0; c < cellsCount; c++) {                    Object value = getCellFormatValue(rowHeader.getCell(c));                    String cellInfo = "header " + "; c:" + c + "; v:" + value;                    Log.i(TAG, "readExcelNew: " + cellInfo);                    //判空,标题有空忽略                    if (!TextUtils.isEmpty((String)value)) {                        headerMap.put(c, value);                    }                }                //添加标题到list                list.add(headerMap);                // 获取最大行数                int rownum = sheet.getPhysicalNumberOfRows();                // 获取最大列数                int colnum = headerMap.size();                for (int i = 1; i < rownum; i++) {                    Row row = sheet.getRow(i);                    //存放子内容                    Map<Integer, Object> itemMap = new HashMap<>();                    if (row != null) {                        for (int j = 0; j < colnum; j++) {                            Object value = getCellFormatValue(row.getCell(j));                            String cellInfo = "r: " + i + "; c:" + j + "; v:" + value;                            Log.i(TAG, "readExcelNew: " + cellInfo);                            itemMap.put(j, value);                        }                    } else {                        break;                    }                    list.add(itemMap);                }            }        } catch (Exception e) {            e.printStackTrace();            ToastUtils.showShort(" 导入失败");            Log.e(TAG, "readExcelNew: 导入失败 " + e);            LogUtils.file("导入失败," + e);        }        return list;    }    public static void writeExcelNew(Context context, List<Map<Integer, String>> exportExcel, Uri uri) {        try {            XSSFWorkbook workbook = new XSSFWorkbook();            XSSFSheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName("Sheet1"));            int colums = exportExcel.get(0).size();            for (int i = 0; i < colums; i++) {                //设置默认宽度15字符。自适应无用,缺少java的类文件                sheet.setColumnWidth(i, 15 * 256);            }            for (int i = 0; i < exportExcel.size(); i++) {                Row row = sheet.createRow(i);                Map<Integer, String> integerObjectMap = exportExcel.get(i);                for (int j = 0; j < colums; j++) {                    Cell cell = row.createCell(j);                    cell.setCellValue(String.valueOf(integerObjectMap.get(j)));                    //sheet.setColumnWidth(j, String.valueOf(integerObjectMap.get(j)).length() * 256);                }            }            OutputStream outputStream = context.getContentResolver().openOutputStream(uri);            workbook.write(outputStream);            outputStream.flush();            outputStream.close();            ToastUtils.showShort("导出成功");            Log.i(TAG, "writeExcel: 导出成功");            LogUtils.file("writeExcel: 导出成功");        } catch (Exception e) {            e.printStackTrace();            ToastUtils.showShort("导出失败");            Log.e(TAG, "writeExcel: 导出失败" + e);            LogUtils.file("导出失败," + e);        }    }    //-------------------------读取动态Excel end-------------------------------//    /**     * 获取单个单元格数据     *     * @param cell </>     * @return cell     */    private static Object getCellFormatValue(Cell cell) {        Object cellValue;        if (cell != null) {            // 判断cell类型            switch (cell.getCellType()) {                case Cell.CELL_TYPE_BOOLEAN:                    cellValue = cell.getBooleanCellValue();                    break;                case Cell.CELL_TYPE_NUMERIC: {                    // TODO: 2019/11/7//                    cellValue = String.valueOf(cell.getNumericCellValue());                    cellValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();                    break;                }                case Cell.CELL_TYPE_FORMULA: {                    // 判断cell是否为日期格式                    if (DateUtil.isCellDateFormatted(cell)) {                        // 转换为日期格式YYYY-mm-dd                        cellValue = cell.getDateCellValue();                    } else {                        // 数字                        // TODO: 2019/11/7//                        cellValue = String.valueOf(cell.getNumericCellValue());                        cellValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();                    }                    break;                }                case Cell.CELL_TYPE_STRING: {                    cellValue = cell.getRichStringCellValue().getString();                    break;                }                default:                    cellValue = "";            }        } else {            cellValue = "";        }        return cellValue;    }}

**注意文件读取存储权限**动态申请+androidManifest里注册

示例使用导入:

选择文件夹导入

/** * 打开本地文件器选择文件 */private void openFileSelector() {    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);    intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。    intent.addCategory(Intent.CATEGORY_OPENABLE);    startActivityForResult(intent, FILE_SELECTOR_CODE);}

获取到文件Uri进行处理

@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (requestCode == FILE_SELECTOR_CODE && resultCode == Activity.RESULT_OK) {        Uri uri = data.getData();        if (uri == null) return;        Log.i(TAG, "onActivityResult: " + "文件路径:" + uri.getPath());        //选择文件,然后导入        importExcelDeal(uri);    }}

具体处理如下:可参照

private void importExcelDeal(final Uri uri) {    ThreadUtils.executeBySingle(new ThreadUtils.Task<Object>() {        @Override        public Object doInBackground() {            List<Map<Integer, Object>> readExcelNew = ExcelUtil.readExcelNew(AddGoodsActivity.this, uri, uri.getPath());            Log.i(TAG, "onActivityResult:readExcelNew " + ((readExcelNew != null) ? readExcelNew.size() : ""));            if (readExcelNew != null && readExcelNew.size() > 0) {                readExcelList.clear();                minelist.clear();                RoomDatabase.instance(AddGoodsActivity.this).allGoodsdao().deleteAllAllGoods();                readExcelList.addAll(readExcelNew);                for (int i = 1; i < readExcelNew.size(); i++) {                    Map<Integer, Object> map = readExcelNew.get(i);                    AllGoods allGoods=new AllGoods();                    allGoods.setMaterial_code(map.get(0).toString());                    allGoods.setMaterial_name(map.get(1).toString());                    if (!TextUtils.isEmpty(allGoods.getMaterial_code())){                        minelist.add(allGoods);                    }                }                Message message=new Message();                message.what=1;                handler.sendMessage(message);                //存入room数据库                for (int i = 1; i < minelist.size(); i++) {                    AllGoods allGoods = minelist.get(i);                    RoomDatabase.instance(AddGoodsActivity.this).allGoodsdao().insertAllGoods(allGoods);                }            }            return null;        }        @Override        public void onSuccess(Object result) {        }        @Override        public void onCancel() {        }        @Override        public void onFail(Throwable t) {        }    });}

示例使用导出:

导出文件

/** * 打开本地文件器选择文件夹 */private void openFolderSelector() {    String path = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/箱码导出/";    Log.e("path",path);    File file = new File(path);    if (!file.exists()) {        // 创建文件夹        file.mkdirs();    }    Intent intent = new Intent();    intent.setAction(Intent.ACTION_CREATE_DOCUMENT);    intent.setType("application/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。    intent.putExtra(Intent.EXTRA_TITLE, "export.xlsx");    intent.putExtra(Intent.EXTRA_TITLE,"BoxCode"+            TimeUtils.getNowString(                    new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss", Locale.getDefault())            ) + ".xlsx");    startActivityForResult(intent, DIR_SELECTOR_CODE);}

传输数据

    @Override    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == DIR_SELECTOR_CODE && resultCode == Activity.RESULT_OK) {            Uri uri = data.getData();            if (uri == null) return;            List<Map<Integer, Object>> exportExcellist=new ArrayList<>();            Map<Integer, Object> firstMap=new HashMap<>();            firstMap.put(0,"序号");            firstMap.put(1,"订单号");            firstMap.put(2,"箱号");            firstMap.put(3,"物料名称");            firstMap.put(4,"重量(kg)");            firstMap.put(5,"扫描时间");            exportExcellist.add(firstMap);            if (boxCodeArrayList.size()>0){                List<BoxCodeBean> outdatalist = getOutputData();                for (int i = 0; i < outdatalist.size(); i++) {                    Map<Integer, Object> map=new HashMap<>();                    map.put(0,outdatalist.get(i).getBid());                    map.put(1,outdatalist.get(i).getOrder_id());                    map.put(2,outdatalist.get(i).getBox_id());                    map.put(3,outdatalist.get(i).getMaterial_name());                    map.put(4,String.valueOf(outdatalist.get(i).getBox_weight()));                    map.put(5,outdatalist.get(i).getMaterial_scan_time());                    exportExcellist.add(map);                }                ExcelUtil.writeExcelNew(getActivity(), exportExcellist, uri);            }else {                MyToast.Toast(getActivity(),"扫描列表为空");            }//            FileUtils.delete(App.cacheFile);        }    }