当前位置: 首页 > article >正文

安卓从Excel文件导入数据到SQLite数据库的实现

在现代的移动应用开发中,数据的处理和管理是至关重要的一环。有时候,我们需要从外部文件(如Excel文件)中导入数据,以便在应用程序中使用。本文将介绍如何在Android应用中使用Java代码从一个Excel文件中导入数据到SQLite数据库。

首先,我们需要定义一个方法importFromExcelFile(),这个方法将负责从指定的Excel文件中读取数据,并将其插入到SQLite数据库中。以下是这个方法的详细实现
implementation ‘org.apache.poi:poi:5.2.3’
implementation ‘org.apache.poi:poi-ooxml:5.2.3’

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;




private void importFromExcelFile() {
    // 获取下载目录
    File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    // 指定Excel文件的名称(此处为inventory.xls)
    File file = new File(downloadsDir, "inventory.xls"); // Replace with your XLS file name

    // 检查文件是否存在
    if (file.exists()) {
        try (FileInputStream fis = new FileInputStream(file)) {
            // 使用HSSFWorkbook读取Excel文件(适用于.xls格式)
            Workbook workbook = new HSSFWorkbook(fis);
            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);

            // 遍历工作表中的每一行
            for (Row row : sheet) {
                // 跳过标题行
                if (row.getRowNum() == 0) {
                    continue;
                }

                // 从单元格中读取数据
                String id = getCellStringValue(row.getCell(0));
                String itemName = getCellStringValue(row.getCell(1));
                String category = getCellStringValue(row.getCell(2));
                String description = getCellStringValue(row.getCell(3));
                int quantity = (int) getCellNumericValue(row.getCell(4));
                double costPrice = getCellNumericValue(row.getCell(5));
                double sellingPrice = getCellNumericValue(row.getCell(6));

                // 准备数据插入到SQLite数据库
                ContentValues cv = new ContentValues();
                cv.put("id", id);
                cv.put("itemname", itemName);
                cv.put("category", category);
                cv.put("description", description);
                cv.put("quantity", quantity);
                cv.put("costprice", costPrice);
                cv.put("sellingprice", sellingPrice);

                // 插入数据到数据库
                db.insert("inventory", null, cv);
            }

            // 提示用户数据已成功导入
            Toast.makeText(this, "数据已成功导入数据库", Toast.LENGTH_SHORT).show();
            // 刷新库存数据
            ids.clear();
            loadInventoryData();
        } catch (IOException e) {
            // 记录错误日志
            Log.e("ImportError", "Error reading Excel file", e);
            // 提示用户读取Excel文件时出错
            Toast.makeText(this, "读取Excel文件时出错", Toast.LENGTH_SHORT).show();
        }
    } else {
        // 提示用户找不到Excel文件
        Toast.makeText(this, "找不到Excel文件", Toast.LENGTH_SHORT).show();
    }
}


 private void loadInventoryData() {
        ids.clear(); // Ensure the ids list is cleared before loading data
        try {
            Cursor c = db.rawQuery("SELECT id FROM inventory;", null);
            if (c != null) {
                while (c.moveToNext()) {
                    ids.add(c.getString(0));
                }
                c.close();
            } else {
                Log.e("loadInventoryData", "Cursor is null");
            }
            inventoryAdapter = new inventoryAdapter(ids, db, this);
            recyclerView.setAdapter(inventoryAdapter);
        } catch (Exception e) {
            Log.e("loadInventoryData", "Error loading inventory data", e);
            Toast.makeText(inventory.this, "Error loading inventory data: " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

代码解析
获取下载目录和文件路径:
使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)获取设备的下载目录。
创建一个指向inventory.xls文件的File对象。
检查文件是否存在:
使用file.exists()方法检查文件是否存在。
读取Excel文件:
使用FileInputStream读取Excel文件。
使用HSSFWorkbook(适用于.xls格式)读取Excel文件内容。
获取第一个工作表(Sheet)。
遍历工作表中的数据:
使用for (Row row : sheet)遍历工作表中的每一行。
跳过第一行(标题行)。
使用自定义方法getCellStringValue和getCellNumericValue从单元格中读取字符串和数字值。
将数据插入SQLite数据库:
使用ContentValues对象准备要插入的数据。
使用db.insert(“inventory”, null, cv)将数据插入到数据库的inventory表中。
提示用户操作结果:
使用Toast提示用户数据已成功导入或读取文件时出错。
刷新库存数据:
清除ids列表(假设这是一个用于缓存数据的列表)。
调用loadInventoryData()方法刷新库存数据。
注意事项
本示例使用HSSFWorkbook读取.xls格式的Excel文件。如果需要读取.xlsx格式的文件,应使用XSSFWorkbook。
需要在AndroidManifest.xml中申请读取外部存储的权限(READ_EXTERNAL_STORAGE)。
在实际开发中,可能需要更复杂的错误处理和用户交互逻辑。


http://www.kler.cn/a/449145.html

相关文章:

  • 各种电机原理介绍
  • 解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹
  • 图书管理系统:提升图书馆服务质量的技术解决方案
  • Spring常见问题
  • 前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化
  • iClent3D for Cesium 实现无人机巡检飞行效果
  • 小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
  • 汽车高分子材料光老化试验方法汇总
  • uniapp 微信小程序 页面部分截图实现
  • UE5 猎户座漂浮小岛 12 技能 瞬移 重力控制
  • 合合信息分享视觉内容安全新技术,助力行业智能化发展
  • C++ 日志输出
  • python中使用时间间隔操作及技巧
  • 【PPTist】组件结构设计、主题切换
  • Flink基本原理 + WebUI说明 + 常见问题分析
  • 某科技局国产服务器PVE虚拟化技术文档
  • 宠物用品电子商务系统|Java|SSM|VUE| 前后端分离
  • 【day13】深入面向对象编程
  • Windows电脑异地SSH远程连接苹果MacOS小主机Mac mini详细教程
  • scala中正则表达式的使用
  • 语音助手关键模块整理
  • 深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
  • Linux环境安装部署Prometheus
  • Craft CMS 模板注入导致 Rce漏洞复现(CVE-2024-56145)(附脚本)
  • 矩阵-向量乘法的行与列的解释(Row and Column Interpretations):中英双语
  • yolov目标检测的图片onnx输入尺寸及预处理