安卓实现导入Excel文件

使用简化版的jar包

复制代码
api files('libs/poi-3.12-android-a.jar')
api files('libs/poi-ooxml-schemas-3.12-a.jar')

导入遇到了两个兼容问题

1.build.gradle文件里面

复制代码
android {

要添加

复制代码
packagingOptions {
    exclude 'META-INF/INDEX.LIST'
}

2.加载大文件要在清单文件里面加android:largeHeap="true"和配置文件的解除大小限制

导入成功后,后面实现就简单了

第一步选择设备内的excel格式文件

可以指定文件类型跳转也可以用户选择后判断文件格式

第二步根据选择返回的Uri获取文件真实位置路径

第三步

解析文件

复制代码
/**
 * 读取excel   (xls和xlsx)
 * 从Excel报表中读出数据
 */
public static void readExcel(File file) {
    String filePath = file.getAbsolutePath();
    Sheet sheet = null;
    List<Map<String, String>> list = null;
    Workbook wb = null;
    if (filePath == null) {
        return;
    }
    String extString = filePath.substring(filePath.lastIndexOf("."));
    InputStream is = null;
    try {
        is = new FileInputStream(filePath);
        if (".xls".equals(extString)) {
            wb = new HSSFWorkbook(is);
        } else if (".xlsx".equals(extString)) {
            wb = new XSSFWorkbook(is);
        } else {
            wb = null;
        }
        if (wb != null) {
            // 用来存放表中数据
            // 获取第一个sheet
            sheet = wb.getSheetAt(0);
            if (sheet == null) {
                return;
            }
            //获得当前sheet的开始行
            int firstRowNum = sheet.getFirstRowNum();
            //获得当前sheet的结束行
            int lastRowNum = sheet.getLastRowNum();
            //循环除了第一行的所有行
            for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
                //获得当前行
                Row row = sheet.getRow(rowNum);
                if (row == null) {
                    continue;
                }
                //获得当前行的开始列
                int lastCellNum = row.getLastCellNum();
                //获得当前行的列数
                String[] cells = new String[lastCellNum];

                Log.d(TAG, "readDataFromExcel: " + row.getCell(0).toString());
                Log.d(TAG, "readDataFromExcel: " + (String) getCellFormatValue(row.getCell(0)));
            }
            BaseDialog.hiddenWaitingDialog();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 获取单个单元格数据
 *
 * @param cell
 * @return
 */
private static Object getCellFormatValue(Cell cell) {
    Object cellValue;
    if (cell != null) {
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BOOLEAN:
                cellValue = cell.getBooleanCellValue();
                break;
            case Cell.CELL_TYPE_NUMERIC:
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                if (DateUtil.isCellDateFormatted(cell)) {
                    cellValue = cell.getDateCellValue();
                } else {
                    cellValue = cell.getNumericCellValue();
                }
                break;
            case Cell.CELL_TYPE_STRING:
                cellValue = cell.getStringCellValue();
                break;
            default:
                cellValue = "";
        }
    } else {
        cellValue = "";
    }
    return cellValue;
}

后续操作看需求了

jar包下载地址:https://github.com/binZai-ComeOn/ReadXlsx?tab=readme-ov-file

相关推荐
码农coding3 小时前
android12 systemUI 之锁屏
android
圆山猫3 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
爱笑鱼3 小时前
Binder(七):getCallingUid() 读到的是谁?clearCallingIdentity() 又清掉了什么?
android
冰心孤城5 小时前
Excel: xls与xlsx格式转换排坑指南
java·前端·excel
金豆呀9 小时前
WPS批量提取Word文档内容生成固定格式Excel表格
word·excel·wps
2501_915909069 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
Lvan的前端笔记9 小时前
AndroidX 完全入门指南
android·androidx
帅次10 小时前
Android 应用高级面试:Window 近1年高频追问 18 题
android·面试·职场和发展
Access开发易登软件10 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
总捣什么乱110 小时前
MySQL MySQL是怎么保证主备一致的?
android·mysql·adb