Android:生成Excel表格并保存到本地

提醒
本文实例是使用Kotlin进行开发演示的。

一、技术方案

  • org.apache.poi:poi
  • org.apache.poi:poi-ooxml

二、添加依赖

[versions]

poi = "5.2.3"
log4j = "2.24.2"

[libraries]

#https://mvnrepository.com/artifact/org.apache.poi/poi
apache-poi = { module = "org.apache.poi:poi", version.ref = "poi" }
apache-poi-ooxml = { module = "org.apache.poi:poi-ooxml", version.ref = "poi" }
# https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core 上面的 apache-poi 需要添加log4j-core
log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" }
implementation(libs.apache.poi)
implementation(libs.apache.poi.ooxml)
implementation(libs.log4j.core)

三、效果图

在这里插入图片描述

四、示例代码

TestPoi.kt

package com.example.test.test

import org.apache.poi.ss.usermodel.HorizontalAlignment
import org.apache.poi.ss.usermodel.VerticalAlignment
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.io.File
import java.io.FileOutputStream

data class Fruit(
    val id: Long,
    var name: String,
    var price: String,
    var desc: String?,
    var count: Int = 0,
    var tip: String? = null
)


fun getProductList(): List<Fruit> {
    val productList: MutableList<Fruit> = mutableListOf()
    productList.add(Fruit(1001, "蓝莓", "40.00", "新鲜水果", 10))
    productList.add(Fruit(1002, "葡萄", "15.00", "新鲜水果", 20))
    productList.add(Fruit(1003, "苹果", "12.00", "新鲜水果", 30))
    productList.add(Fruit(1004, "香蕉", "8.00", "新鲜水果", 15))
    productList.add(Fruit(1005, "西瓜", "4.00", "新鲜水果", 6))
    productList.add(Fruit(1006, "橙子", "5.00", "新鲜水果", 9))
    productList.add(Fruit(1007, "柚子", "5.00", "新鲜水果", 5))
    productList.add(Fruit(1008, "火龙果", "9.00", "新鲜水果", 11))
    productList.add(Fruit(1009, "猕猴桃", "10.00", "新鲜水果", 12))
    productList.add(Fruit(1010, "哈密瓜", "7.00", "新鲜水果", 6))
    productList.add(Fruit(1011, "皇冠梨", "5.00", "新鲜水果", 8))
    return productList
}

fun createExcelSheet() {
    // 创建一个新的工作簿
    val workbook = XSSFWorkbook()
    // 创建一个工作表(sheet)
    val sheet = workbook.createSheet("水果清单")

    //创建XSSFFont对象
    val headXSSFFont = workbook.createFont()

    //设置字体样式,如字体名称、字体大小、加粗等, 下面设置了字体名称为Arial、字体大小为12、加粗
    headXSSFFont.fontName = "Arial"
    headXSSFFont.fontHeightInPoints = 14
    headXSSFFont.bold = true

    // 创建一个XSSFCellStyle对象来表示要设置的样式
    val headXSSFCellStyle = workbook.createCellStyle()
    // 将字体样式设置到XSSFCellStyle对象中
    headXSSFCellStyle.setFont(headXSSFFont)


    // 居中对齐
    headXSSFCellStyle.alignment = HorizontalAlignment.CENTER
    headXSSFCellStyle.verticalAlignment = VerticalAlignment.CENTER

    // 创建行(0基索引)
    var xssFRow = sheet.createRow(0)
    //设置行高
    xssFRow.heightInPoints = 40F
//    xssFRow.height = 600
    //设置样式
//    xssFRow.rowStyle = headXSSFCellStyle
    val excleHead = arrayOf("编号", "水果名", "价格(斤)", "库存(箱)", "描述", "备注")
    for ((index, item) in excleHead.withIndex()) {
        var width = 20 * 256
        if (index == 2 || index == 3) {
            width = 15 * 256
        } else if (index == 4 || index == 5) {
            width = width shl 1
        }
        // 设置列宽
        sheet.setColumnWidth(index, width)
        val xSSFCell = xssFRow.createCell(index)
        //设置样式
        xSSFCell.cellStyle = headXSSFCellStyle
        xSSFCell.setCellValue(item)
    }

    val deviceInfoList = getProductList()

    val xSSFFont = workbook.createFont()
    xSSFFont.fontHeightInPoints = 12
    val xSSFCellStyle = workbook.createCellStyle()
    xSSFCellStyle.setFont(xSSFFont)
    xSSFCellStyle.alignment = HorizontalAlignment.CENTER
    xSSFCellStyle.verticalAlignment = VerticalAlignment.CENTER

    for ((index, item) in deviceInfoList.withIndex()) {
        xssFRow = sheet.createRow(index + 1)
        xssFRow.heightInPoints = 40F
//        xssFRow.height = 600
        val cXSSFCell0 = xssFRow.createCell(0)
        cXSSFCell0.setCellValue(item.id.toString())
        cXSSFCell0.cellStyle = xSSFCellStyle

        val cXSSFCell1 = xssFRow.createCell(1)
        cXSSFCell1.setCellValue(item.name)
        cXSSFCell1.cellStyle = xSSFCellStyle

        val cXSSFCell2 = xssFRow.createCell(2)
        cXSSFCell2.setCellValue(item.price)
        cXSSFCell2.cellStyle = xSSFCellStyle

        val cXSSFCell3 = xssFRow.createCell(3)
        cXSSFCell3.setCellValue(item.count.toString())
        cXSSFCell3.cellStyle = xSSFCellStyle

        val cXSSFCell4 = xssFRow.createCell(4)
        cXSSFCell4.setCellValue(item.desc.toString())
        cXSSFCell4.cellStyle = xSSFCellStyle
    }

    try {
        val fileOutputStream = FileOutputStream("水果清单.xlsx")
//        val fileOutputStream = FileOutputStream(File("D:\\水果清单.xlsx"))// Windows磁盘: D盘
//        val fileOutputStream = FileOutputStream(File("/Users/chinadragon/Desktop/水果清单.xlsx"))// mac 文件地址
        workbook.write(fileOutputStream)
        fileOutputStream.close()
        workbook.close()
        println("成功创建水果清单表格")
    } catch (e: Exception) {
        println("生成水果清单表格发生异常 $e")

    }
}

fun main() {
    createExcelSheet()
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3576技术笔记之一 RK3576单板介绍

第二篇嘛&#xff0c;亮亮我们做出来的板子&#xff0c;3576这个片子的基本功能接口单板都做了&#xff0c;接口数量肯定是比不上3588&#xff08;PS&#xff1a;这个我们也在做&#xff0c;后续都完成后会发文章&#xff09;&#xff0c;但是比起3568来说还是升级了&#xff0…

SQL进阶技巧:如何寻找同一批用户 | 断点分组应用【最新面试题】

目录 0 问题描述 1 数据准备 2 问题分析 ​编辑 3 小结 0 问题描述 用户登录时间不超过10分钟的视为同一批用户,找出以下用户哪些属于同一批用户(SQL实现) 例如: user_name time a 2024-10-01 09:55 b 2024-10-01 09:57 c 2024-10-01…

数字图像处理(11):RGB转YUV

&#xff08;1&#xff09;RGB颜色空间 RGB颜色空间&#xff0c;是一种基于红色、绿色、蓝色三种基本颜色进行混合的颜色空间&#xff0c;通过这三种颜色的叠加&#xff0c;可以产生丰富而广泛的颜色。RGB颜色空间在计算机图像处理、显示器显示、摄影和影视制作等领域具有广泛应…

利用Ubuntu批量下载modis图像(New)

由于最近modis原来批量下载的代码不再直接给出&#xff0c;因此&#xff0c;再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长&#xff0c;现在只给出一部分&#xff0c;需要自己再补充另一部分。之前的为&#xff1a; 感谢郭师兄的指导&#xff08;https://blo…

HTTP 长连接(HTTP Persistent Connection)简介

HTTP长连接怎么看&#xff1f; HTTP 长连接&#xff08;HTTP Persistent Connection&#xff09;简介 HTTP 长连接&#xff08;Persistent Connection&#xff09;是 HTTP/1.1 的一个重要特性&#xff0c;它允许在一个 TCP 连接上发送多个 HTTP 请求和响应&#xff0c;而无需为…

淘宝商品详情主图SKU图价格|品牌监控|电商API接口

淘宝/天猫获得淘宝商品详情 API 返回值说明 item_get-获得淘宝商品详情 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&a…

单片机学习笔记 17. 串口通信-发送汉字

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

五层网络协议(封装和分用)

目录 七层网络协议五层网络协议封装1.应用层2.传输层3.网络层4.数据链路层5.物理层 分用1. 物理层2.数据链路层3.网络层 IP 协议4.传输层 UDP 协议5.应用层 七层网络协议 网络通信过程中&#xff0c;需要涉及到的细节&#xff0c;其实是非常非常多的&#xff0c;如果要有一个协…

阿里云人工智能平台(PAI)免费使用教程

文章目录 注册新建实例交互式建模(DSW)注册 注册阿里云账号进行支付宝验证 新建实例 选择资源信息和环境信息,填写实例名称 资源类型需要选择公共资源,才能使用资源包进行抵扣。目前每月送250计算时。1 * NVIDIA A10 8 vCPU 30 GiB 1 * 24 GiB1 * NVIDIA V100 8 vCPU 32 Gi…

【实战】Oracle基础之控制文件内容的5种查询方法

关于Jady&#xff1a; ★工作经验&#xff1a;近20年IT技术服务经验&#xff0c;熟悉业务又深耕技术&#xff0c;为业务加持左能进行IT技术规划&#xff0c;右能处理综合性故障与疑难杂症&#xff1b; ★成长历程&#xff1a;网络运维、主机/存储运维、程序/数据库开发、大数…

蓝桥杯第 23 场 小白入门赛

一、前言 好久没打蓝桥杯官网上的比赛了&#xff0c;回来感受一下&#xff0c;这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …

使用 Pytorch 构建 Vanilla GAN

文章目录 一、说明二、什么是 GAN&#xff1f;三、使用 PyTorch 的简单 GAN&#xff08;完整解释的代码示例&#xff09;3.1 配置变量3.2 、PyTorch 加速3.3 构建生成器3.4 构建鉴别器 四、准备数据集五、初始化函数六、前向和后向传递七、执行训练步骤八、结果 一、说明 使用…

【Windows 11专业版】使用问题集合

博文将不断学习补充 I、设置WIN R打开应用默认使用管理员启动 1、WIN R输入 secpol.msc 进入“本地安全策略”。 2、按照如下路径&#xff0c;找到条目&#xff1a; “安全设置”—“本地策略”—“安全选项”—“用户账户控制&#xff1a;以管理员批准模式运行所有管理员” …

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意&#xff1a;如果不是全局设置&#xff0c;仅仅针对某个项目有效&#xff1b;例在利用网上教程解决maven加载过慢的问题时&#xff0c;按步骤设置却得不到解决&#xff0c;原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面&#xff0c;点击f…

Java - JSR223规范解读_在JVM上实现多语言支持

文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223&#xff08;Java Spe…

oracle数据库的启动与关闭

一.oracle数据库的启动过程 启动实例&#xff08;Start the Instance&#xff09; 启动实例&#xff1a;一个Oracle数据库实例由内存结构和后台进程组成&#xff0c;启动实例时会加载这些内存结构和启动进程。实例是数据库的一个运行时环境&#xff0c;它包含了数据库的控制文…

【C++】自主实现stack/queue

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的自主实现stack/queue&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. stack2. queue 栈&#xff1a;后进先出 队列&#xff1a;先进先出 栈和队列…

Hive学习基本概念

基本概念 hive是什么&#xff1f; Facebook 开源&#xff0c;用于解决海量结构化日志的数据统计。 基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能 本质是将HQL转化为MapReduce程序。 Hive处理的数据存储在H…

Android studio 签名加固后的apk文件

Android studio打包时&#xff0c;可以选择签名类型v1和v2&#xff0c;但是在经过加固后&#xff0c;签名就不在了&#xff0c;或者只有v1签名&#xff0c;这样是不安全的。 操作流程&#xff1a; 1、Android studio 对项目进行打包&#xff0c;生成有签名的apk文件&#xff…