代码控制写入excel文件

news2025/1/15 8:10:08

1、引言

        在工作和学习中,我们经常使用到excel表格,有时候表格中的数据很多,此时我们就希望能够通过程序去控制某些表格数据的生成和修改,从而达到简化操作,缩减工作量的目的,这里就来简单实现一下对excel表格数据的写入操作。

2、jar包引入

        这里我是在android中使用poi.jar来实现,如果在maven项目中也一样,直接引入poi的相关依赖就行,在android要使用两个jar包,分别是poi-android.jar和poi-ooxml-schemas.jar,这两个jar包在文章末尾提供的源码下载地址中下载源码获取,jar包就在源码中。

3、代码实现

package xyz.dritrtj.excel;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.File;
import java.io.FileOutputStream;

import xyz.dritrtj.excel.interfaces.Init;
import xyz.dritrtj.excel.utils.SetUiSize;

public class MainActivity extends AppCompatActivity implements Init {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setViewSize();
        setData();
    }

    /**
     * 生成excel表格
     * @param path
     */
    private void initWorkbook(File path) {
        HSSFWorkbook wb = new HSSFWorkbook();
        //标题栏单元格样式
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中显示
        HSSFFont font = wb.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short) 16);
        cellStyle.setFont(font);


        //创建execl中的一个表,就是excel下面的一个工作簿
        Sheet sheet = wb.createSheet();
        wb.setSheetName(0, "my-test");
        //创建标题栏1
        Row titleRow1 = sheet.createRow(0);//创建第一行
        //设置样式优先以单元格为主,创建的单元格会覆盖默认行样式

        // 设置标题栏高度,也就是这一行的高度
        titleRow1.setHeightInPoints(24);

        //创建标题栏第1个标题
        for (int i = 0; i < 6; i++) {
            titleRow1.createCell(i)
                    .setCellValue("");//设置当前单元格的值
        }
        Cell cellTitle = titleRow1.createCell(6);
        cellTitle.setCellValue("镇雄县学生营养改善计划食品学校自行采购清单");//设置当前单元格的值
        cellTitle.setCellStyle(cellStyle);
        //设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
        sheet.addMergedRegion(CellRangeAddress.valueOf("$G$1:$O$1"));

        Row titleRow2 = sheet.createRow(1);//创建第二行
        titleRow2.createCell(0)
                .setCellValue("");//设置当前单元格的值
        titleRow2.createCell(1)
                .setCellValue("附加信息:");//设置当前单元格的值
        //设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
        sheet.addMergedRegion(CellRangeAddress.valueOf("$B$2:$D$2"));
        titleRow2.createCell(4)
                .setCellValue("");//设置当前单元格的值
        titleRow2.createCell(5)
                .setCellValue("");//设置当前单元格的值
        titleRow2.createCell(6)
                .setCellValue("供餐学校:");//设置当前单元格的值
        //设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
        sheet.addMergedRegion(CellRangeAddress.valueOf("$G$2:$H$2"));
        titleRow2.createCell(8)
                .setCellValue("");//设置当前单元格的值
        titleRow2.createCell(9)
                .setCellValue("入库日期:2023年 月 日");//设置当前单元格的值
        //设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
        sheet.addMergedRegion(CellRangeAddress.valueOf("$J$2:$O$2"));

        Row titleRow3 = sheet.createRow(2);//创建第三行
        titleRow3.createCell(0)
                .setCellValue("序号");//设置当前单元格的值
        titleRow3.createCell(1)
                .setCellValue("收货入库时间");//设置当前单元格的值
        titleRow3.createCell(2)
                .setCellValue("独立核算学校");//设置当前单元格的值
        titleRow3.createCell(3)
                .setCellValue("供餐校点名称");//设置当前单元格的值
        titleRow3.createCell(4)
                .setCellValue("食材编码");//设置当前单元格的值
        titleRow3.createCell(5)
                .setCellValue("食材类别");//设置当前单元格的值
        titleRow3.createCell(6)
                .setCellValue("食材名称");//设置当前单元格的值
        titleRow3.createCell(7)
                .setCellValue("单位");//设置当前单元格的值
        titleRow3.createCell(8)
                .setCellValue("单价(元)");//设置当前单元格的值
        titleRow3.createCell(9)
                .setCellValue("数量");//设置当前单元格的值
        titleRow3.createCell(10)
                .setCellValue("金额(元)");//设置当前单元格的值
        titleRow3.createCell(11)
                .setCellValue("检验是否合格");//设置当前单元格的值
        titleRow3.createCell(12)
                .setCellValue("供货(单位)人");//设置当前单元格的值
        titleRow3.createCell(13)
                .setCellValue("供货人电话");//设置当前单元格的值
        titleRow3.createCell(14)
                .setCellValue("所索证件名称");//设置当前单元格的值
        titleRow3.createCell(15)
                .setCellValue("收货入库辅助列(禁止修改或删除)");//设置当前单元格的值
        //设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
        sheet.addMergedRegion(CellRangeAddress.valueOf("$P$3:$R$3"));

        Row titleRow4 = sheet.createRow(3);//创建第四行
        titleRow4.createCell(0)
                .setCellValue("1");//设置当前单元格的值
        titleRow4.createCell(1)
                .setCellValue("1月2日");//设置当前单元格的值
        titleRow4.createCell(2)
                .setCellValue("镇雄县场坝镇中心学校");//设置当前单元格的值
        titleRow4.createCell(3)
                .setCellValue("镇雄县场坝镇摩多小学");//设置当前单元格的值
        titleRow4.createCell(4)
                .setCellValue("z1101");//设置当前单元格的值
        titleRow4.createCell(5)
                .setCellValue("");//设置当前单元格的值
        titleRow4.createCell(6)
                .setCellValue("蔬菜辣椒");//设置当前单元格的值
        titleRow4.createCell(7)
                .setCellValue("斤");//设置当前单元格的值
        titleRow4.createCell(8)
                .setCellValue("1");//设置当前单元格的值
        titleRow4.createCell(9)
                .setCellValue("2");//设置当前单元格的值
        titleRow4.createCell(10)
                .setCellValue("2");//设置当前单元格的值
        titleRow4.createCell(11)
                .setCellValue("是");//设置当前单元格的值
        titleRow4.createCell(12)
                .setCellValue("XXX");//设置当前单元格的值
        titleRow4.createCell(13)
                .setCellValue("12222222");//设置当前单元格的值
        titleRow4.createCell(14)
                .setCellValue("122222");//设置当前单元格的值
        titleRow4.createCell(15)
                .setCellValue("2024年1月");//设置当前单元格的值
        titleRow4.createCell(16)
                .setCellValue("星期二");//设置当前单元格的值

        writeFile(wb, path);
    }

    /**
     * 将Excle表格写入文件中
     * @param workbook
     * @param fileName
     */
    private static void writeFile(Workbook workbook, File fileName) {
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(fileName);
            workbook.write(outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (workbook != null) {
                    workbook.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void initView() {
        View decorView=getWindow().getDecorView();//获取当前界面的DecorView
        int option=View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;//更改文字颜色为深黑色
        decorView.setSystemUiVisibility(option);//设置系统UI元素的可见性
        getWindow().setNavigationBarColor(Color.TRANSPARENT);
        getWindow().setStatusBarColor(Color.parseColor("#ffffff"));//将状态栏设置为白色
        getSupportActionBar().hide();

        //获取屏幕宽度
        Display display= getWindowManager().getDefaultDisplay();
        Point point=new Point();
        display.getSize(point);
        SetUiSize.displayWidth=display.getWidth();
        SetUiSize.displayHeight=display.getHeight();


    }

    @Override
    public void setViewSize() {

    }

    @Override
    public void setData() {
        File file=new File(getExternalFilesDir(null),"my.xlsx");
        initWorkbook(file);
    }

    /**
     * 信息提示
     * @param message
     */
    private void tip(final String message){
        runOnUiThread(() -> {
            //更改默认Toast显示方式,需要什么直接调用方法就行
            Toast toast=Toast.makeText(MainActivity.this,
                    message,Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.TOP,
                    0, (int) (SetUiSize.displayHeight*0.4));
            toast.show();
        });
    }
}

4、注意事项

        关于单元格中样式会有覆盖的情况,行样式会覆盖工作簿样式,单元格会覆盖工作簿样式和行样式,不管你是否设置样式都会覆盖,因此对样式要针对单元格设置,在覆盖时只会由代码直接生成的单元格或者行覆盖默认样式,对单元格或者行设置样式都是通过cellTitle.setCellStyle(cellStyle);方法设置,设置样式参照这个就行。

5、效果

6、源码下载地址

        下载地址如下:

code.drjtrtj.xyz/downCode?id=6

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

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

相关文章

【办公技巧】如何压缩为rar格式文件?

压缩包格式是我们生活工作中常用到的文件格式&#xff0c;那么如何得到一个rar格式的压缩文件&#xff1f;或者说如何将文件压缩成rar格式而不是zip格式呢&#xff1f;今天我们来了解一下如何压缩为rar格式文件。 首先&#xff0c;想要压缩文件&#xff0c;我们需要压缩软件&a…

【C/C++】实现Reactor高并发服务器 完整版

代码结构 文件介绍 InetAddress.h InetAddress类 ip和端口设置 Socket.h Socket类 设置fd Epoll.h epollfd 管理类 Channel.h Channel类 管理epoll以及对应回调函数实现 EventLoop.h EventLoop事件循环类 TcpServer.h 服务器类 tcpepoll.cpp 主函数 InetAddress.h #if…

uniapp项目准备工作

1.封装请求 export const baseUrl function getHeaders () {let token uni.getStorageSync(token)let header {"access-token":token,// X-Requested-With: XMLHttpRequest,Content-Type: application/json; charsetUTF-8}return header } function reLogin(){/…

【Label Studio运行报错】ModuleNotFoundError: No module named ‘google.rpc‘

报错截图&#xff1a; 解决方法&#xff1a; 新建虚拟环境&#xff0c;安装google相关包 pip install google-cloud-core google-cloud-storage把虚拟环境中site-packages下google文件夹拷贝到当前环境的对应位置下。去官网下载最新的sqlite3&#xff0c;复制到AppData\Loca…

adobe软件提示This non-genuine Adobe app will be disabled soon【软件版本】

因为电脑上级路由器装了小飞机&#xff0c;导致本机电脑ps等adobe的系列软件出现了 This non-genuine Adobe app will be disabled soon&#xff0c;烦人的狠&#xff0c;之前有写过一篇通过更改host的教程&#xff0c;现在已经失效了&#xff0c;今天为大家分享一个用软件来屏…

【嵌入式学习】IO进程线程day02.20

一、思维导图 二、习题 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fpNULL;FILE *fqNULL;pid_t pidfork();if(pid>0){//在父进程中打开复制文件if((fpfopen("./text.txt","r"))NULL){perror("fopen error");…

职业资格高级执法考试试题及答案,分享几个实用搜题和学习工具 #知识分享#微信

作为当代大学生&#xff0c;我们常常面临着繁重的学业压力和众多的学习任务。在这个信息爆炸的时代&#xff0c;如何高效地进行搜题和学习成了我们迫切需要解决的问题。幸运的是&#xff0c;随着科技的不断进步&#xff0c;我们拥有了许多方便、实用的日常搜题和学习软件。 1.…

解决kkFileView4.4.0版本pdf、word不能预览问题

这里使用的是http下载流url预览&#xff0c;遇到的问题。 官方使用指南&#xff1a;kkFileView - 在线文件预览 1 前端测试代码 1.1 官方示例代码 1.2 本人测试代码 注意&#xff1a;要给预览文件的url进行编码encodeURIComponent(Base64.encode(previewUrl))。 <!DOCTYP…

Spring两大核心思想:IOC和AOP

目录 IOC:控制反转 Ioc概念 Ioc的优点 Spring Ioc AOP:面向切面编程 AOP的优点 Spring AOP 1.添加依赖 2.核心概念 3.通知的类型 4.切点表达式 5.公共切点 pointCut 6.切面优先级 Order 7.使用自定义注解完成AOP的开发 Spring AOP实现有几种方式&#xff1f; S…

Jakarta Bean Validation

Validation 官网 https://beanvalidation.org/ 常见注解 Bean Validation中定义的注解&#xff1a; 注解详细信息Null被注释的元素必须为 nullNotNull被注释的元素必须不为 nullAssertTrue被注释的元素必须为 trueAssertFalse被注释的元素必须为 falseMin(value)被注释的元素…

阿里云幻兽帕鲁服务器,游戏服务端版本升级怎么操作?

用阿里云一键部署的幻兽帕鲁服务器&#xff0c;想要更新游戏服务端版本&#xff0c;现在非常简单。之前还需要通过输入一行命令来更新&#xff0c;而现在可以直接通过面板上的选型来操作。 打开阿里云的计算巢&#xff0c;找到你的这台服务实例&#xff0c;点击进入&#xff0…

【编程题】跳石板

跳石板 分析后可知 要在众多解中寻找最优解 因此用动态规划 比如&#xff1a; 4-6只需跳一步&#xff0c;而6-8也只需一步&#xff0c;因此在刚才跳了一步的基础上再加1 8到10一步&#xff0c;8到12一步&#xff0c;9到12一步&#xff0c;8-10-12两步&#xff0c;因此到12位置…

Stable Diffusion 绘画入门教程(webui)

文章目录 一、前言二、做出的效果三、SD使用流程1、大模型2、关键字3、调参数 一、前言 随着mj和sd绘画软件发布之后&#xff0c;AI绘画开始爆火&#xff0c;很多小伙伴已经挖掘出很多的玩法&#xff0c;哪怕最基础的AI美女、AI壁纸、真人漫改等等都赚的盆满钵满&#xff0c;当…

Nginx 配置详解

官网&#xff1a;http://www.nginx.org/ 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务…

Satoshivm一文科普,手把手教你交互(bitget 钱包)

什么是 SatoshiVM&#xff1f; SatoshiVM 是一种去中心化的第 2 层解决方案&#xff0c;创新地将比特币网络的强大安全性和价值稳定性与以太坊虚拟机 (EVM) 的高级可编程性和灵活性相结合。 SatoshiVM 是区块链领域的一个突出功能&#xff0c;支持使用原生 BTC 作为 Gas&#x…

防火墙——计算机网络

前述基于密码的安全机制不能有效解决以下安全问题&#xff1a; 用户入侵&#xff1a; 利用系统漏洞进行未授权登录&#xff1b; 授权用户非法获取更高级别权限等。 软件入侵&#xff1a; 通过网络传播病毒、蠕虫和特洛伊木马。 拒绝服务攻击等。 解决方法&#xff1a; 防火墙&a…

Leetcode刷题笔记题解(C++):203. 移除链表元素

思路&#xff1a;不同的情况出现了&#xff0c;就是第一个节点要是为等于val的节点&#xff0c;可以新建一个节点&#xff0c;并next指向head&#xff0c;这样就可以遍历新的链表来删除节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* L…

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

提升竞争力!攻读在职硕士为职业发展加冕——社科院与杜兰大学金融管理硕士

在现如今竞争激烈的职场环境中&#xff0c;不断提升自身的竞争力是每个职场人士都面临的重要任务。攻读在职硕士学位成为越来越多人实现个人职业发展目标的首选方式之一。特别是社科院与杜兰大学合作开设的金融管理硕士项目&#xff0c;为那些希望在金融行业取得突破的职业人士…

vue3实现瀑布流布局组件

先看效果图 直接上代码 utils.js // 用于模拟接口请求 export const getRemoteData (data 获取数据, time 2000) > {return new Promise((resolve) > {setTimeout(() > {console.log(模拟获取接口数据, data)resolve(data)}, time)}) }// 获取数组随机项 export…