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

Android修行手册-POI操作Excel文档

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总
游戏脚本-辅助自动化Android控件全解手册再战Android系列
Scratch编程案例软考全系列Unity3D学习专栏
蓝桥系列ChatGPT和AIGC

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

Apache POI 是 Java 领域最完善的 Office 文件读写库

依赖包前置条件
poi-scratchpadpoi
poi-ooxmlpoi, poi-ooxml-schemas
poi-ooxml-schemasxmlbeans
poi-examplespoi, poi-scratchpad, poi-ooxml
ooxml-schemasxmlbeans
类型文件类型
POIFSOLE2 Filesystem
HPSFOLE2 Property Sets
HSSFExcel XLS
HSLFPowerPoint PPT
HWPFWord DOC
HDGFVisio VSD
HPBFPublisher PUB
HSMFOutlook MSG
OpenXML4JOOXML
XSSFExcel XLSX
XSLFPowerPoint PPTX
XWPFWord DOCX
Common SSExcel XLS and XLSX

当只要使用xls格式时、只要导入 POI 即可;
当还要使用xlsx格式、还要导入 poi-ooxml;
当需要操作 word、ppt、viso、outlook 等时需要用到 poi-scratchpad。

同样适用于 Android 领域,但是由于 JDK 和 AndroidSDK 在源码上存在差异,所以原版的 Apache POI 库,并不能直接在安卓上使用

两个Jar包,poi-android.jar 和 poi-ooxml-schemas.jar
这里我们用的是修改和精简过后,适合安卓的版本。POI 是3.12版本的,它不是 Apache 官方 POI 包,截止2023年11月我仍然在使用该 Jar 包开发应用,并且没有遇到什么问题。
需要 Jar 包的欢迎文章最底部卡片 Call 我。
在这里插入图片描述

dependencies {implementation files('libs\\poi-3.12-android-a.jar')implementation files('libs\\poi-ooxml-schemas-3.12-20150511-a.jar')
}

文档 API 可以参考这里,特别注意我们使用的 POI 包不是 Apache 软件基金会的,部分方法及其功能会有所不同!!!

API:

  • HSSF - 提供读写Microsoft Excel格式档案的功能。
  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
  • HWPF - 提供读写Microsoft Word格式档案的功能。
  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
  • HDGF - 提供读写Microsoft Visio格式档案的功能。

HSSF
用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件。HSSF在org.apache.poi.hssf.usermodel包中,实现Workbook 接口,常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表

XSSF
在org.apache.xssf.usemodel包,实现Workbook接口,常用组件:
XSSFWorkbook excel的文档对象
XSSFSheet excel的表单
XSSFRow excel的行
XSSFCell excel的格子单元
XSSFFont excel字体
XSSFDataFormat 日期格式
和HSSF类似;

workbook = new XSSFWorkbook(inputStream);   //创建.xlsx格式文件对象
workbook = new HSSFWorkbook(inputStream);   //创建.xls格式文件对象
Sheet sheetAt = workbook.getSheetAt(0);   //获取工作表的对象
Row row = sheetAt.getRow(0);   //获取工作表的行
int physicalNumberOfCells = row.getPhysicalNumberOfCells();   //获取实际单元格数
Row.getCell(i)//获取工作表的单元格
Cell.getCellType()//获得单元格格式
Cell.getBooleanCellValue();//获取布尔类型的单元格
Cell.getNumericCellValue();//获取数字类型的单元格
Cell.getDateCellValue();//获取日期类型的单元格
Cell.getNumericCellValue();//获取数值类型的单元格
Cell.getStringCellValue();//获取字符串类型的单元格
SheetAt.getPhysicalNumberOfRows(); //获取实际行数
//创建工作表的名字
XSSFSheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName("Sheet1"));

在这里插入图片描述

Row row = sheet.createRow(int i);  // 创建行
Cell cell = row.createCell(int i);  // 创建列
Cell.setCellValue((String) map.get(j));  // 将需要添加到Excel的文本添加到对应的Cell
//将数据写入文件并保存在指定文件夹
OutputStream outputStream = context.getContentResolver().openOutputStream(Uri uri);
XSSFWorkbook.write(outputStream);
//读取Excel并将其写入数据库
public List<Map<Integer, Object>> readExcel(Context context, Uri fileUri, String strFileUri) {mySQLHelp = new MySQLHelp(context, "mydb.db", null, 1);SQLiteDatabase writableDatabase = mySQLHelp.getWritableDatabase();excelStr = strFileUri.substring(strFileUri.lastIndexOf("."));try {inputStream = context.getContentResolver().openInputStream(fileUri);if (excelStr.equals(".xlsx")) workbook = new XSSFWorkbook(inputStream);else if (excelStr.equals(".xls")) workbook = new HSSFWorkbook(inputStream);else workbook = null;if (workbook != null) {Sheet sheetAt = workbook.getSheetAt(0);Row row = sheetAt.getRow(0);int physicalNumberOfCells = row.getPhysicalNumberOfCells();//获取实际单元格数Map<Integer, Object> map = new HashMap<>();for (int i = 0; i < physicalNumberOfCells; i++) {//将标题存储到mapObject cellFormatValue = getCellFormatValue(row.getCell(i));map.put(i, cellFormatValue);}dataList.add(map);int physicalNumberOfRows = sheetAt.getPhysicalNumberOfRows();//获取最大行数int size = map.size();//获取最大列数contentValues = new ContentValues();for (int i = 1; i < physicalNumberOfRows; i++) {Map<Integer, Object> map1 = new HashMap<>();Row row1 = sheetAt.getRow(i);if (!row1.equals(null)) {for (int j = 0; j < size; j++) {Object cellFormatValue = getCellFormatValue(row1.getCell(j));map1.put(j, cellFormatValue);System.out.println(j);}contentValues.put("materialID", (String) map1.get(0));contentValues.put("materialEncoding", (String) map1.get(1));contentValues.put("materialName", (String) map1.get(2));contentValues.put("materialModel", (String) map1.get(3));contentValues.put("materialSize", (String) map1.get(4));contentValues.put("unit", (String) map1.get(5));contentValues.put("price", (String) map1.get(6));contentValues.put("count", (String) map1.get(7));contentValues.put("manufacturers", (String) map1.get(8));contentValues.put("type", (String) map1.get(9));contentValues.put("receiptor", (String) map1.get(10));contentValues.put("storagelocation", (String) map1.get(11));contentValues.put("materialState", (String) map1.get(12));writableDatabase.insert("module", null, contentValues);} else break;dataList.add(map1);}contentValues.clear();writableDatabase.close();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return dataList;}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;}
//读取数据库数据将其写入Excel并保存到指定路径文件夹
public void getDataAndSave(Context context,Uri uri) {ArrayList<Map<Integer,Object>> arrayList = new ArrayList<>();Map<Integer,Object> m = new HashMap<>();m.put(0,"物料ID");m.put(1,"物料编码");m.put(2,"名称");m.put(3,"编号");m.put(4,"规格");m.put(5,"单位");m.put(6,"单价");m.put(7,"数量");m.put(8,"厂家");m.put(9,"类别");m.put(10,"经手人");m.put(11,"存放地点");m.put(12,"状态");arrayList.add(m);mySQLHelp = new MySQLHelp(context, "mydb.db", null, 1);SQLiteDatabase readableDatabase = mySQLHelp.getReadableDatabase();cursor = readableDatabase.rawQuery("select * from module", null);while (cursor.moveToNext()) {Map<Integer,Object> map = new HashMap<>();String materialID = cursor.getString(cursor.getColumnIndex("materialID"));String materialEncoding = cursor.getString(cursor.getColumnIndex("materialEncoding"));String materialName = cursor.getString(cursor.getColumnIndex("materialName"));String materialModel = cursor.getString(cursor.getColumnIndex("materialModel"));String materialSize = cursor.getString(cursor.getColumnIndex("materialSize"));String unit = cursor.getString(cursor.getColumnIndex("unit"));String price = cursor.getString(cursor.getColumnIndex("price"));String count = cursor.getString(cursor.getColumnIndex("count"));String manufacturers = cursor.getString(cursor.getColumnIndex("manufacturers"));String type = cursor.getString(cursor.getColumnIndex("type"));String receiptor = cursor.getString(cursor.getColumnIndex("receiptor"));String storagelocation = cursor.getString(cursor.getColumnIndex("storagelocation"));String materialState = cursor.getString(cursor.getColumnIndex("materialState"));map.put(0,materialID);map.put(1,materialEncoding);map.put(2,materialName);map.put(3,materialModel);map.put(4,materialSize);map.put(5,unit);map.put(6,price);map.put(7,count);map.put(8,manufacturers);map.put(9,type);map.put(10,receiptor);map.put(11,storagelocation);map.put(12,materialState);arrayList.add(map);}try {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName("Sheet1"));Cell cell;int size = arrayList.get(0).size();for (int i = 0;i < arrayList.size();i++){Row row = sheet.createRow(i);Map<Integer, Object> map = arrayList.get(i);for (int j = 0;j < size;j++){cell = row.createCell(j);cell.setCellValue((String) map.get(j));}}OutputStream outputStream = context.getContentResolver().openOutputStream(uri);workbook.write(outputStream);outputStream.flush();outputStream.close();Toast.makeText(context, "另存成功", Toast.LENGTH_SHORT).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

相关文章:

Android修行手册-POI操作Excel文档

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

浅析教学型数控车床使用案例

教学型数控车床是一种专为教学和培训设计的机床&#xff0c;它具有小型化、高精度和灵活性的特点&#xff0c;可以作为学校和技术学院的培训机器。下面是一个使用案例&#xff0c;以展示教学型数控车床在教学实训中的应用。 案例背景&#xff1a; 某职业技术学院的机械工程专业…...

图论 2023.11.20

次短路 P2829 大逃离 题意&#xff1a;给定一个无向图&#xff0c;入口1&#xff0c;出口n,求第二短路的值 一个节点所直接连接的地方小于k个&#xff08;起点和终点除外&#xff09;&#xff0c;那么他就不敢进去。 n<5000&#xff0c;m<100000 思路&#xff1a;次短路…...

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞

思福迪 运维安全管理系统 test_qrcode_b 远程命令执行漏洞 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现1.手动复现2.自动化复现3.python源代码 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任…...

electron项目开机自启动

一、效果展示&#xff1a;界面控制是否需要开机自启动 二、代码实现&#xff1a; 1、在渲染进程login.html中&#xff0c;画好界面&#xff0c;默认勾选&#xff1b; <div class"intro">开机自启动 <input type"checkbox" id"checkbox&quo…...

2023年约特干故城夜间演艺《万方乐奏有于阗》完美谢幕

11月19日&#xff0c;记者走进约特干故城看到演员在欢乐地跳着刀郎舞和古典舞&#xff0c;庆祝今年以来夜间演艺《万方乐奏有于阗》演出200场完美谢幕。 11月19日在约特干故城&#xff0c;演员正在表演迎宾乐舞。阿卜力克木依卜拉依木摄 当天晚上&#xff0c;城楼上旌旗猎猎&am…...

学习网络编程No.10【深入学习HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/11/14/18:45&#xff0c;因为种种原因&#xff0c;上个月的文章昨天才更新&#xff0c;目前处于刷题前夕&#xff0c;算法课在看了。这次和以前不一样&#xff0c;因为以前对知识框架没有很好的理念&#xff0c;并不清楚相关知识要…...

ubuntu下docker环境使用GPU配置

本文主要讲述整个命令流程&#xff0c;具体讲解请看官网nvidia-容器工具包和一篇总结得很详细的博文docker使用GPU总结 docker的版本必须安装19.0版本以上的&#xff0c;这里也只讲19.0版本以上的使用方法 首先设置一下网络信息 curl -fsSL https://nvidia.github.io/libnvi…...

渗透工具---BurpSuite 插件开发之HelloWorld

本文主要记录如何利用burp官方的新版API即MontoyaApi 写helloworld&#xff08;上一篇的demo使用旧版api写的&#xff0c;这篇及后续开发将采用新版api&#xff09; 先看效果图 更多详细内容见下方 这里有更详细更全面的代码内容 以及配置相关的内容 https://mp.weixin.qq.co…...

2216. 美化数组的最少删除数

我的做法&#xff1a; 使用一个index作为检查坐标&#xff0c;当index为偶数时检查当前数和后一个数是否相等&#xff0c;相等的话&#xff0c;后一个数设置为-1&#xff0c;注意如果相等&#xff0c;要把相等的数保留下来last&#xff0c;以便接下来检查&#xff0c;防止出现2…...

竞赛 题目:基于深度学习的人脸表情识别 - 卷积神经网络 竞赛项目 代码

文章目录 0 简介1 项目说明2 数据集介绍&#xff1a;3 思路分析及代码实现3.1 数据可视化3.2 数据分离3.3 数据可视化3.4 在pytorch下创建数据集3.4.1 创建data-label对照表3.4.2 重写Dataset类3.4.3 数据集的使用 4 网络模型搭建4.1 训练模型4.2 模型的保存与加载 5 相关源码6…...

基于安卓android微信小程序的好物分享系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…...

【Spring Boot】使用WebSocket协议完成来单提醒及客户催单功能

1 WebSocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 1.1 HTTP协议和WebSocket协议对比 1、HTTP是短…...

如何有效的禁止Google Chrome自动更新?

禁止Chrome自动更新 1、背景2、操作步骤 1、背景 众所周知&#xff0c;当我们在使用Selenium进行Web自动化操作&#xff08;如爬虫&#xff09;时&#xff0c;一般会用到ChromeDriver。然而Driver的更新速度明显跟不上Chrome的自动更新。导致我们在使用Selenium进行一些操作时就…...

OpenShift 4 - 部署 RHODS 环境,运行 AI/ML 应用(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 1.33 的环境中验证 文章目录 RHODS 简介安装 RHODS 环境运行环境说明用 RHODS Operator 安装环境创建 Jupyter Notebook 运行环境 开发调式 AI/ML 应用部署运行 AI/ML 应用视频参…...

MySQL 的执行原理(二)

5.3. MySQL 的查询成本 5.3. MySQL 的查询成本 MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者 说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模 糊的&#xff0c;其实在 MySQL 中一条查询语句的执行成本…...

postgres in (?,?) 和 =any(?) 用法/性能对比

刚刚回顾了一下 JDBC 操作 SQL Server 时如何传入列表参数&#xff0c;即如何给 in (?) 条件直接传入一个列表参数&#xff0c;然而本质上是不支持&#xff0c;最终不得不展开为 in (?, ?,...?) 针对每个元素单独设置参数&#xff0c;不定长的参数对于重用已编译 PreparedS…...

46. Qt Android调用Java代码进行辅助开发 -- 框架搭建

1. 说明 使用Qt进行android开发时,某种情况下使用C++的知识或者Qt提供的方法是无法满足功能需求的,即使通过各种手段能够勉强实现功能,也非常的麻烦。此时,就需要Java来辅助实现了。在Qt中提供了调用Java代码的接口,比较方便。本片博客先介绍如何搭建一个能够调用java代码…...

NX二次开发UF_CAM_PREF_set_logical_value 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREF_set_logical_value Defined in: uf_cam_prefs.h int UF_CAM_PREF_set_logical_value(UF_CAM_PREF_t pref, logical value ) overview 概述 This function sets the lo…...

docker下移除不使用的镜像、容器、卷、网络

Prune images docker image prune移除没有标签并且没有被容器引用的镜像&#xff0c;这种镜像称为 dangling(摇晃的) 镜像。 示例1&#xff1a;docker image prune 删除了redis&#xff0c;无标签且无引用 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STA…...

2026奇点大会未公开议程泄露:AISMM v1.2将强制嵌入6类实时监控API,开发者需在Q2前完成SDK升级

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;2026奇点智能技术大会&#xff1a;AISMM与标准制定 2026奇点智能技术大会&#xff08;Singularity Intelligence Summit 2026&#xff09;正式确立《人工智能系统成熟度模型》&#xff08;AISMM, Artif…...

为内部知识问答系统集成 Taotoken 提供多模型后备支持

为内部知识问答系统集成 Taotoken 提供多模型后备支持 在企业内部构建智能问答系统时&#xff0c;一个核心挑战是如何平衡回答质量与系统可靠性。单一模型供应商的 API 可能因服务波动、配额耗尽或网络问题而暂时不可用&#xff0c;导致整个问答服务中断。直接对接多家供应商&…...

WarcraftHelper:魔兽争霸3引擎现代化改造与帧率优化技术方案

WarcraftHelper&#xff1a;魔兽争霸3引擎现代化改造与帧率优化技术方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为一款经典的即时…...

ESP32-S3新手避坑指南:Windows下ESP-IDF环境配置、编译烧录与SPI引脚复用详解

ESP32-S3开发实战&#xff1a;从环境配置到SPI外设深度解析 第一次接触ESP32-S3时&#xff0c;那种既兴奋又忐忑的心情至今记忆犹新。作为乐鑫推出的高性能Wi-Fi/蓝牙双模芯片&#xff0c;ESP32-S3凭借其强大的处理能力和丰富的外设接口&#xff0c;在物联网和嵌入式领域迅速崭…...

HarmonyOS 6 ArkUI Path(路径)组件使用文档

文章目录组件简介核心特点标准核心属性SVG 路径常用命令示例场景说明1. 基础直线2. 闭合三角形3. 矩形路径4. 二次贝塞尔曲线5. 三次贝塞尔曲线&#xff08;波浪线&#xff09;6. 椭圆弧7. 虚线路径8. 渐变填充心形完整代码总结组件简介 Path 是 HarmonyOS ArkUI 提供的高级自…...

AISMM质量保障不是流程,而是能力:SITS2026定义的6维成熟度诊断模型(附自测工具)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;SITS2026专家&#xff1a;AISMM评估质量保障 AISMM&#xff08;AI System Maturity Model&#xff09;是SITS2026国际会议提出的面向生成式AI系统的成熟度评估框架&#xff0c;其核心目标是确保AI系统在…...

别再让中文用户名卡住你的Keil了!手把手教你修改Windows用户文件夹名(附详细步骤)

彻底解决Windows中文用户名导致的开发环境路径问题 刚拿到新电脑的开发者们&#xff0c;往往会在系统初始化时随手设置一个中文用户名——这看似无害的操作&#xff0c;却为后续的开发环境配置埋下了隐患。当你在Keil中编译项目时突然弹出"路径包含非法字符"的报错&…...

ChanlunX缠论分析插件:通达信用户的终极自动化技术分析指南

ChanlunX缠论分析插件&#xff1a;通达信用户的终极自动化技术分析指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX ChanlunX是一款专为通达信软件设计的开源缠论分析插件&#xff0c;通过智能算法自动…...

ubuntu中添加用户并赋予root权限

1. 添加用户 useradd [-d homepath] [-s shell] -m username useradd -d /home/test -s /bin/bash -m test -d&#xff1a;指定用户的家目录 -s&#xff1a;用户的登录shell -m&#xff1a;创建用户家目录2. 给用户添加root权限 usermod -aG sudo username #测试用户是否有ro…...

Windows任务栏透明化终极指南:TranslucentTB深度解析与专业配置

Windows任务栏透明化终极指南&#xff1a;TranslucentTB深度解析与专业配置 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想要彻底改造…...