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

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()}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JAVA】Hutool CollUtil.sort 方法:多场景下的排序解决方案
  • MYSQL 第四次作业
  • 函数调用时参数是如何从右至左入栈的
  • MySQL-视图、存储过程和触发器
  • HTML常用的转义字符——怎么在网页中写“<div></div>”?
  • ArcGIS Pro SDK (九)几何 15 转换
  • 6.3 面向对象技术-设计模式
  • C++ - 基于多设计模式下的同步异步⽇志系统
  • 如何系统的学习C++和自动驾驶算法
  • SAP PP学习笔记31 - 计划运行的步骤2 - Scheduling(日程计算),BOM Explosion(BOM展开)
  • 把redis用在Java项目
  • python_基础编程_字典、集合
  • C语言图书信息管理系统
  • 导航网站WP主题/WP黑格导航主题BlackCandy-简约酷黑色高逼格+焕然一新的UI设计
  • 多区域DNS以及主从DNS的搭建
  • [译]CSS 居中(Center)方法大合集
  • C++类中的特殊成员函数
  • express.js的介绍及使用
  • Idea+maven+scala构建包并在spark on yarn 运行
  • java第三方包学习之lombok
  • Java反射-动态类加载和重新加载
  • java正则表式的使用
  • LintCode 31. partitionArray 数组划分
  • storm drpc实例
  • Terraform入门 - 1. 安装Terraform
  • 对象引论
  • 聚簇索引和非聚簇索引
  • 离散点最小(凸)包围边界查找
  • 聊聊sentinel的DegradeSlot
  • 盘点那些不知名却常用的 Git 操作
  • 一起参Ember.js讨论、问答社区。
  • ​力扣解法汇总946-验证栈序列
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #QT项目实战(天气预报)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (14)Hive调优——合并小文件
  • (7)STL算法之交换赋值
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (六)软件测试分工
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (五)关系数据库标准语言SQL
  • (转)Mysql的优化设置
  • (转)程序员技术练级攻略
  • (转载)从 Java 代码到 Java 堆
  • .NET C# 使用 iText 生成PDF
  • .NET Core中Emit的使用
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递