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/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu上查看各个进程的实时CPUMEM占用的办法

top常见参数top界面分析system monitorhtop1、查看htop的使用说明2、显示树状结构3、htop使用好文推荐top top的用法应该是最为普遍的 常见参数 -d 更新频率,top显示的界面几秒钟更新一次 -n 更新的次数,top显示的界面更新多少次之后就自动结束了 当然也可以将top日志通过…

[点云分割] 欧式距离分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <chrono>#include <pcl/ModelCoefficients.h> // 模型系数的定义 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/sample_c…

Mac | Vmware Fusion | 分辨率自动还原问题解决

1. 问题 Mac的Vmware Fusion在使用Windows10虚拟机时&#xff0c;默认显示器配置如下&#xff1a; 开机进入系统并变更默认分辨率后&#xff0c;只要被 ⌘Tab 切换分辨率就会还原到默认&#xff0c;非常影响体验。 2. 解决方式 调整 设置 -> 显示器 -> 虚拟机分辨率…

帝国cms开发一个泛知识类的小程序的历程记录

#帝国cms小程序# 要开发一个泛知识类的小程序&#xff0c;要解决以下几个问题。 1。知识内容的分类。 2。知识内容的内容展示。 3。知识内容的价格设置。 4。用户体系&#xff0c;为简化用户的操作&#xff0c;在用户进行下载的时候&#xff0c;请用户输入手机号&#xff…

Vellum —— 简介

目录 一&#xff0c;介绍 二&#xff0c;原理 三&#xff0c;PBD算法 手动实现PBD的拉伸 一&#xff0c;介绍 Vellum是一个解算模拟框架&#xff0c;使用更高级的PBD&#xff08;XPBD&#xff0c;extended position based dynamics&#xff09;&#xff0c;是2nd Order Int…

如何隐藏自己的代码(很酷)

1.引入 幻想当我们成为一名优秀的程序员&#xff0c;有着各大公司想要买我们的代码&#xff0c;但我们并不想要让他们知道我们代码的实现&#xff0c;毕竟一复制便可以解决&#xff0c;这里我们希望有一种方法可以把我们的核心代码给隐藏掉&#xff0c;那我们又应该怎么去实现呢…

测试/测开——接口基础面试高频问题

前言 本文是将自己在面试前找工作的部分笔记重新整理了下&#xff0c;不少内容当时是查阅的知乎、博客园、书籍等。我自己在牛客上也学习了很多面经和经验帖&#xff0c;收获了好几家大厂offer。最近整理出来这些&#xff0c;希望能对找测开岗的朋友们有帮助&#xff01; 一、…

vue中列表渲染

列表渲染 实际开发中&#xff0c;使用每条数据的唯一标识作为key,也就是对于数组列表&#xff0c;对象中的属性如&#xff1a;id、手机号、身份证号、学号等唯一值&#xff0c;对象列表同理 只要不对列表的逆序添加&#xff0c;逆序删除等破坏顺序的操作&#xff0c;仅用于渲染…

验收材料-软件质量保证措施

一、 质量保障措施 二、 项目质量管理保障措施 &#xff08;一&#xff09; 资深的质量经理与质保组 &#xff08;二&#xff09; 全程参与的质量经理 &#xff08;三&#xff09; 合理的质量控制流程 1&#xff0e; 质量管理规范&#xff1a; 2&#xff0e; 加强协调管理&…

普冉PY32系列(十二) 基于PY32F002A的6+1通道遥控小车III - 驱动篇

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…

YOLOv8改进实战 | 更换主干网络Backbone(六)之轻量化模型VanillaNet进阶篇

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

【Java开发】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介绍 1.1简介 Mybatis-Flex 是一个优雅的 Mybatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时&#xff…