当前位置: 首页 > 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…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...