代码控制写入excel文件

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

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值