Android 生成Excel并导出全流程

前言

最近接到需求,要在安卓上离线完成根据数据生成Excel文件,但搜到了都不是能立马使用

例如 

//    implementation 'org.apache.poi:poi:3.17'
//    implementation 'com.alibaba:easyexcel:4.0.1'

这两最大的问题是专用于java的,如果Android直接集成的话,会有一些“java.awt.Color”等类缺失的问题,应该是属于javase的一些内容。虽然看例子能直接使用 javabean

那我们只能退而求其次选择Android兼容性更高的

 implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'

1,权限申请

    public static boolean verifyAllPermissions(Activity activity) {boolean write = verifyWrite(activity);if (write) {Log.i(TAG, "权限完整可以正常运行");return true;}Log.i(TAG, "开始请求权限");ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_EXTERNAL_STORAGE);return false;}
 if (verifyAllPermissions) {testExcel()}

2,生成文件

  private fun testExcel() {val path = Environment.getExternalStorageDirectory().absolutePathLog.d("ExcelActivity", "path:$path")val directory ="$path/excel"val fileName = "/0726配餐simple.xlsx"val abFilePath = "$directory$fileName"Log.d("ExcelActivity", "directory:$directory")Log.d("ExcelActivity", "abFilePath:$abFilePath")val fileDirectory = File(directory)val file = File(abFilePath)try {if (!fileDirectory.exists()) {fileDirectory.mkdirs()Log.e("ExcelActivity", "路径不存在创建路径")}file.createNewFile();} catch (e: IOException) {Log.e("ExcelActivity", "createNewFile e:$e")e.printStackTrace()"创建文件失败$e".toast()return}Log.d("ExcelActivity", "文件创建成功:${file.absolutePath} ${file.exists()}")if (!file.exists()) {"文件不存在".toast()return}exportExcel(abFilePath)}

3,准备数据


class ExcelBean(var id: String, var name: String, var time: String, var date: String)......val dataList = arrayListOf<ExcelBean>()val titleList =arrayListOf("ID", "名称", "日期", "时间戳", "标题5", "标题6", "标题7", "标题8")
for (i in 0..60) {dataList.add(ExcelBean("$i","名字$i",System.currentTimeMillis().toString(),"${Date()}"))
}

4,写入文件

API支持的并不多,下面列举的常见的效果,其他API 网上有很多例子,本文旨在整个调通

fun exportExcel(filePath: String) {try {val dataList = arrayListOf<ExcelBean>()val titleList =arrayListOf("ID", "名称", "日期", "时间戳", "标题5", "标题6", "标题7", "标题8")for (i in 0..60) {dataList.add(ExcelBean("$i","名字$i",System.currentTimeMillis().toString(),"${Date()}"))}val workbook = Workbook.createWorkbook(File(filePath))// 设置sheet名称val sheet = workbook.createSheet("0726配餐", 0)// 合并单元格sheet.mergeCells(0, 0, titleList.size - 1, 0)sheet.mergeCells(0, 1, titleList.size - 1, 1)// 调整列宽sheet.setRowView(0, 800)sheet.setRowView(1, 600)sheet.setRowView(2, 500)//创建字体,参数1:字体样式,参数2:字号,参数3:粗体val font = WritableFont(WritableFont.createFont("宋体"), 18, WritableFont.BOLD);val wcTop = WritableCellFormat(font)wcTop.run {// 垂直居中alignment = Alignment.CENTREverticalAlignment = VerticalAlignment.CENTREwrap = true}// 顶部标题sheet.addCell(Label(0, 0, "陪餐记录导出表", wcTop))// 次级标题val wcTop2 = WritableCellFormat(WritableFont(WritableFont.createFont("宋体"),12))wcTop2.run {alignment = Alignment.CENTREverticalAlignment = VerticalAlignment.CENTREwrap = true}//X月X日-Y月Y日sheet.addCell(Label(0, 1, "(0801 - 0815)", wcTop2))// 内容标题栏val startRow = 3titleList.forEachIndexed { index, title ->run {val wc = WritableCellFormat(WritableFont(WritableFont.createFont("宋体"),12,WritableFont.BOLD))wc.run {verticalAlignment = VerticalAlignment.CENTREwrap = true}sheet.addCell(Label(index, startRow - 1, title, wc))}}// 内容dataList.forEachIndexed { index, excelBean ->run {val wc = WritableCellFormat()wc.wrap = trueval valueList = arrayListOf(excelBean.id,excelBean.name,excelBean.time,excelBean.date,"A","B","C","D")valueList.forEachIndexed { indexC, value ->sheet.addCell(Label(indexC, index + startRow, value, wc))}}}workbook.write()workbook.close()"导出成功:$filePath".toast()} catch (e: IOException) {e.printStackTrace()} catch (e: WriteException) {e.printStackTrace()}}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

git sendemail使用

教程参考&#xff1a; git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…

恒创科技:如何排查和解决服务器高负载问题?

服务器负载过高是业务正常运行的主要威胁之一。高平均负载意味着系统或服务器超载&#xff0c;许多进程正在等待 CPU 时间。因此将有许多进程等待完成&#xff0c;这些进程将进入队列&#xff0c;导致服务器负载增加。 高负载的主要原因 1.服务器超载 2.垃圾邮件 3.硬盘性能 4.…

Navicat Premium Lite数据库管理软件

首先我们大家可以通过下面的地址下载我们的Navicat Premium Lite: https://www.navicat.com.cn/products/navicat-premium-lite 1、Navicat精简版 2、下载 3、运行界面 。。。

前端面试项目细节重难点分享(十三)

面试题提问&#xff1a;分享你最近做的这个项目&#xff0c;并讲讲该项目的重难点&#xff1f; 答&#xff1a;最近这个项目是一个二次迭代开发项目&#xff0c;迭代周期一年&#xff0c;在做这些任务需求时&#xff0c;确实有很多值得分享的印象深刻的点&#xff0c;我讲讲下面…

【Linux】基本指令1

文章目录 1. find2. which3. alias4.whereis5.grep6. sort 、uniq7. linux怎么编辑文件中的内容 1. find 1.1 find: 查找文件所在的位置。&#xff08;当我们进行find搜索的时候&#xff0c;可能需要访问磁盘进而导致效率低下。&#xff09; 1.2 find / file.txt 在Linux系统是…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

MinIO存储桶通知 - Kafka小测

概述 公司的某个项目需要用上这玩意&#xff0c;所以在本地搭建测试环境&#xff0c;经过一番折腾&#xff0c;测试通过&#xff0c;博文记录&#xff0c;用以备忘 MinIO安装 该节不做说明&#xff0c;网络有很多现成的帖子&#xff0c;自行搜索去 配置步骤 控制台添加事件…

ROS2入门到精通—— 2-11 ROS2实战:实现基于voronoi_planner的全局规划(一)!!!保姆级教程

实现基于voronoi_planner的全局规划将分为两篇博文进行讲解 本文参考该大佬代码: https://github.com/nkuwenjian/voronoi_planner.githttps://github.com/nkuwenjian/voronoi_layer.git将上面的ROS1代码移植到ROS2,移植不易,中间遇到很多坑 0 前言 针对一些狭窄区域,可能…

海山数据库(He3DB)性能优化方案解析

前端优化是一个永恒的话题&#xff0c;每个前端开发者都希望自己的页面能够快速加载&#xff0c;给用户良好的体验。但往往事与愿违。因此&#xff0c;本文从编码优化、构建优化、部署优化三方面入手进行web页面性能优化。 1. 编码优化 1.1. Css优化 1.1.1. 合理使用css选择…

谷粒商城实战笔记-60-商品服务-API-品牌管理-效果优化与快速显示开关

文章目录 一&#xff0c;显示状态列改为switch开关二&#xff0c;监听状态改变 首先&#xff0c;把ESLint语法检查关掉&#xff0c;因为这个语法检查过于严格&#xff0c;在控制台输出很多错误信息&#xff0c;干扰开发。 在build目录下下webpack.base.conf.js中&#xff0c;把…

python基础巩固

基本数据类型 可以用isinstance来判断 a111 isinstance(a,int) True数值运算&#xff1a; >>> 2 / 4 # 除法&#xff0c;得到一个浮点数 0.5 >>> 2 // 4 # 除法&#xff0c;得到一个整数 0 >>> 17 % 3 # 取余 2Python 字符串不能被改变。向一个…

【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录 1、语言模型 1.1、训练过程&#xff1a; 1..2、大型语言模型分类&#xff1a; 1.3、指令微调模型训练过程&#xff1a; 2、Tokens 3、Helper function辅助函数 (提问范式) 4、计算token数量 1、语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词…

由bext安装“异常”引出的话题:windows上转义字符的工作原理

由bext安装“异常”引出的话题&#xff1a;Windows上转义字符的工作原理&#xff0c;与ai“闲扯”不经意学习知识点。 (笔记模板由python脚本于2024年07月25日 19:21:13创建&#xff0c;本篇笔记适合喜欢用ai学习的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff…

【Ubuntu】安装 Snipaste 截图软件

Snipaste 下载安装并使用 Snipastefor more information报错解决方案每次启动软件需要输入的命令如下添加开机自启动 下载 下载地址 安装并使用 Snipaste 进入终端输入命令 # 1、进入到 Snipaste-2.8.9-Beta-x86_64.AppImage 所在目录&#xff08;根据自己的下载目录而定&…

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

数据结构(5):树和二叉树

1 树的定义 1.1 树的基本概念 分支可以称为边&#xff0c;结点可以用于存放数据结构。 除了根节点&#xff0c;其他节点只有一个前驱&#xff01;&#xff01;&#xff01;&#xff01; 互不相交也就是 只有一个前驱结点&#xff01; 树应用的很广的 1.2 结点之间的关系 直接…

DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

前言 继续书接上文 Docker Compose V2 安装常用数据库MySQLMongo&#xff0c;部署安装好之后我本来是找了一个web端的在线连接数据库的工具&#xff0c;但是使用过程中并不丝滑&#xff0c;最终还是选择了使用 DBeaver &#xff0c;然后发现 mongo 还需要许可&#xff0c;又折…

为什么idea建议使用“+”拼接字符串

今天在敲代码的时候&#xff0c;无意间看到这样一个提示&#xff1a; 英文不太好&#xff0c;先问问ChatGPT&#xff0c;这个啥意思&#xff1f; IDEA 提示你&#xff0c;可以将代码中的 StringBuilder 替换为简单的字符串连接方式。 提示信息中说明了使用 StringBuilder 进行…

专业视频拍摄与编辑SDK,定制专属视频解决方案

无论是社交媒体营销、产品展示、教育培训还是直播电商&#xff0c;高质量的视频内容都是吸引眼球、传递信息的关键。美摄科技&#xff0c;作为视频编辑处理领域的佼佼者&#xff0c;以其强大的视频拍摄与编辑SDK&#xff0c;为企业开启了视觉创意的新篇章。 【专业级功能&…

leetcode-148. 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#x…