Java填充Execl模板并返回前端下载

功能:后端使用Java POI填充Execl模板,并返回前端下载

Execl模板如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b07f29d50c1243d4bdc9919381815a68.png

1. Java后端

功能:填充模板EXECL,并返回前端

controller层

package org.huan.controller;

import org.huan.dto.ExcelData;
import org.huan.util.ExcelTemplateFiller;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@Controller
public class ExcelController {

    @PostMapping("/generateExcel")
    @ResponseBody
    public ResponseEntity<byte[]> generateExcel(@RequestBody ExcelData excelData) {
        // You'll need to modify the parameters and logic here based on your object and requirements

        // For example:
        String templateFilePath = "C:\\Users\\lenovo\\Desktop\\aa\\a.xlsx";
        String outputFilePath = "C:\\Users\\lenovo\\Desktop\\aa\\output.xlsx";

        // Generate Excel file based on the received object
        ExcelTemplateFiller.execl(templateFilePath, outputFilePath, excelData);

        try {
            // Read the generated file
            Path path = Paths.get(outputFilePath);
            byte[] fileContent = Files.readAllBytes(path);

            // Create a ResponseEntity with the file content as body
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
            headers.setContentDispositionFormData("attachment", "output.xlsx");
            headers.setContentLength(fileContent.length);

            return ResponseEntity.ok().headers(headers).body(fileContent);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body(null);
        }
    }
}


ExcelTemplateFiller POI填充表格

package org.huan.util;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.huan.dto.ExcelData;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ExcelTemplateFiller {

    public static void main(String[] args) {
        String templateFilePath = "C:\\Users\\lenovo\\Desktop\\aa\\a.xlsx";
        String outputFilePath = "C:\\Users\\lenovo\\Desktop\\aa\\output.xlsx";
        //execl(templateFilePath, outputFilePath);
    }

    public static void execl(String templateFilePath, String outputFilePath, ExcelData excelData) {

        try (InputStream templateInputStream = Files.newInputStream(Paths.get(templateFilePath));
             Workbook workbook = new XSSFWorkbook(templateInputStream)) {
            Sheet sheet = workbook.getSheetAt(0);
            
            //全 称
            sheet.getRow(8).getCell(27).setCellValue(excelData.getFullName());
            //账号
            sheet.getRow(10).getCell(27).setCellValue(excelData.getAccountNumber());
            //开户机构
            sheet.getRow(12).getCell(27).setCellValue(excelData.getAccountInstitution());
            //人民币(大写)
            sheet.getRow(14).getCell(7).setCellValue(excelData.getRmbInWords());

            //十 亿 千 百 十 万 千 百 十 元 角 分
            // 十亿, 亿, 千万, 百万, 十万, 万, 千, 百, 十, 元, 角, 分
            Row row = sheet.getRow(15);
            row.getCell(30).setCellValue(excelData.getBillion());
            row.getCell(31).setCellValue(excelData.getHundredMillion());
            row.getCell(32).setCellValue(excelData.getTenMillion());
            row.getCell(33).setCellValue(excelData.getMillion());
            row.getCell(34).setCellValue(excelData.getHundredThousand());
            row.getCell(35).setCellValue(excelData.getTenThousand());
            row.getCell(36).setCellValue(excelData.getThousand());
            row.getCell(37).setCellValue(excelData.getHundred());
            row.getCell(38).setCellValue(excelData.getTen());
            row.getCell(39).setCellValue(excelData.getYuan());
            row.getCell(40).setCellValue(excelData.getJiao());
            row.getCell(41).setCellValue(excelData.getFen());

            //用途
            sheet.getRow(16).getCell(7).setCellValue(excelData.getPurpose());
            //备注
            sheet.getRow(17).getCell(7).setCellValue(excelData.getRemark());
            try (FileOutputStream fileOutputStream = new FileOutputStream(outputFilePath)) {
                workbook.write(fileOutputStream);
            }
            System.out.println("Data has been filled into the Excel template successfully!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

实体类

package org.huan.dto;

import lombok.Data;

@Data
public class ExcelData {
    private String fullName;
    private String accountNumber;
    private String accountInstitution;
    private String rmbInWords;

    private String billion;
    private String hundredMillion;
    private String tenMillion;
    private String million;
    private String hundredThousand;
    private String tenThousand;
    private String thousand;
    private String hundred;
    private String ten;
    private String yuan;
    private String jiao;
    private String fen;

    private String purpose;
    private String remark;

}

pom依赖

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.14</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>3.14</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-scratchpad</artifactId>
      <version>3.14</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.14</version>
    </dependency>

2. VUE前端

功能:
2.1 利用Vue过滤器实现 Vue数字金额转大写
2.2 点击按钮下载后端 EXECl



<span>{{model.balance | toChies(amount)}}</span>
<template>
  <div>
    <button @click="downloadExcel">Download Excel</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
     excelData: {
        fullName: 'John Doe',
        accountNumber: '1234567890',
        accountInstitution: 'ABC Bank',
        rmbInWords: 'One Thousand Yuan',
        billion: '1',
        hundredMillion: '1',
        tenMillion: '1',
        million: '1',
        hundredThousand: '1',
        tenThousand: '1',
        thousand: '1',
        hundred: '1',
        ten: '1',
        yuan: '1',
        jiao: '1',
        fen: '1',
        purpose: 'Purchase',
        remark: 'No remarks',
      },
    };
    };
  },

filters:{
  toChies(amount){
    // 汉字的数字
    const cnNums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
    // 基本单位
    const cnIntRadice = ["", "拾", "佰", "仟"];
    // 对应整数部分扩展单位
    const cnIntUnits = ["", "万", "亿", "兆"];
    // 对应小数部分单位
    const cnDecUnits = ["角", "分"];
    // 整数金额时后面跟的字符
    const cnInteger = "整";
    // 整型完以后的单位
    const cnIntLast = "元";
    // 最大处理的数字
    const maxNum = 9999999999999999.99;
    // 金额整数部分
    let integerNum;
    // 金额小数部分
    let decimalNum;
    // 输出的中文金额字符串
    let chineseStr = "";
    // 分离金额后用的数组,预定义
    let parts;
    if (amount === "") {
      return "";
    }
    amount = parseFloat(amount);
    if (amount >= maxNum) {
      // 超出最大处理数字
      return "";
    }
    if (amount === 0) {
      chineseStr = cnNums[0] + cnIntLast + cnInteger;
      return chineseStr;
    }
    // 转换为字符串
    amount = amount.toString();
    if (amount.indexOf(".") === -1) {
      integerNum = amount;

      decimalNum = "";
    } else {
      parts = amount.split(".");
      integerNum = parts[0];
      decimalNum = parts[1].substr(0, 4);
    }
    // 获取整型部分转换
    if (parseInt(integerNum, 10) > 0) {
      let zeroCount = 0;
      const IntLen = integerNum.length;
      for (let i = 0; i < IntLen; i++) {
        const n = integerNum.substr(i, 1);
        const p = IntLen - i - 1;
        const q = p / 4;
        const m = p % 4;
        if (n === "0") {
          zeroCount++;
        } else {
          if (zeroCount > 0) {
            chineseStr += cnNums[0];
          }
          // 归零
          zeroCount = 0;
          //alert(cnNums[parseInt(n)])
          chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
        }
        if (m === 0 && zeroCount < 4) {
          chineseStr += cnIntUnits[q];
        }
      }
      chineseStr += cnIntLast;
    }
    // 小数部分
    if (decimalNum !== "") {
      const decLen = decimalNum.length;
      for (let i = 0; i < decLen; i++) {
        const n = decimalNum.substr(i, 1);
        if (n !== "0") {
          chineseStr += cnNums[Number(n)] + cnDecUnits[i];
        }
      }
    }
    if (chineseStr === "") {
      chineseStr += cnNums[0] + cnIntLast + cnInteger;
    } else if (decimalNum === "") {
      chineseStr += cnInteger;
    }
    return chineseStr;
  }
},

 
  methods: {
		const formattedAmount = this.$options.filters.toChies(this.excelData.rmbInWords);
		 downloadExcel() {
 		  this.excelData = { rmbInWords: formattedAmount ...};
	      axios({
	        url: 'http://your-backend-url/generateExcel', // Replace with your backend endpoint
	        method: 'POST',
	        responseType: 'blob', // Specify response type as blob to handle binary data
	        data: this.excelData,
	      })
	        .then((response) => {
	          const url = window.URL.createObjectURL(new Blob([response.data]));
	          const link = document.createElement('a');
	          link.href = url;
	          link.setAttribute('download', 'output.xlsx'); // Set the file name here
	          document.body.appendChild(link);
	          link.click();
	        })
	        .catch((error) => {
	          console.error('Error downloading Excel:', error);
	        });
	    },
};

</script>

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

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

相关文章

DevOps搭建(十六)-Jenkins+K8s部署详细步骤

​ 1、整体部署架构图 2、编写脚本 vi pipeline.yml apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metadata:labels:app: pipelinespec:containers:- nam…

计算机毕业设计——SpringBoot仓库管理系统(附源码)

1&#xff0c;绪论 1.2&#xff0c;项目背景 随着电子计算机技术和信息网络技术的发明和应用&#xff0c;使着人类社会从工业经济时代向知识经济时代发展。在这个知识经济时代里&#xff0c;仓库管理系统将会成为企业生产以及运作不可缺少的管理工具。这个仓库管理系统是由&a…

Linux习题3

解析&#xff1a; grep&#xff1a;查找文件内的内容 gzip&#xff1a;压缩文件&#xff0c;文件经压缩后会增加 gz&#xff1a;扩展名 find&#xff1a;在指定目录下查找文件 解析&#xff1a; A hosts文件是Linux系统上一个负责ip地址与域名快速解析的文件&#xff0c;以…

自动化测试框架pytest系列之21个命令行参数介绍(二)

第一篇 &#xff1a; 自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 接上文 3.pytest功能介绍 3.1 第一条测试用例 首先 &#xff0c;你需要编写一个登录函数&#xff0c;主要是作为被测功能&#xff0c;同时编写一个测试脚本 &#xff0c;进行测试登录功能 。 登…

随机过程——卡尔曼滤波学习笔记

一、均方预测和随机序列分解 考虑随机序列 使用预测 定义 称为的均方可预测部分。 若相互独立&#xff0c;则是均方不可预测的。 定义随机序列的新息序列 V(k)基于样本观测的条件均值为0&#xff0c;即均方不可预测。 V(k)与是正交的&#xff0c;即。 二、卡尔曼滤波 …

哪款台灯护眼效果最好?高品质的儿童护眼台灯推荐

根据去年的报道&#xff0c;全国儿童青少年的整体近视率高达至52.7%&#xff0c;其中幼儿园及小学生患近视率为35.6%&#xff0c;初中生为71.1%&#xff0c;高中生和大学生为80.5%&#xff0c;大学生更是达到90%&#xff01;也就是说几乎绝大部分青少年都患有近视&#xff0c;而…

SpringBoot知识02

1、快速生成mapper和service &#xff08;自动生成简单的单表sql&#xff09; 2、springboot配置swagger&#xff08;路径不用加/api&#xff09; &#xff08;1&#xff09;主pom导包&#xff08;子pom要引用&#xff0c;可选依赖&#xff09; <!-- swagger3…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢&#xff1f; 可以通过 slow log 来查看慢SQL&#xff0c;默认的情况下&#xff0c;MySQL 数据库是不开启慢查询日志&#xff08;slow query log&#xff09;。所以我们需要手动把它打开。 查看下慢查询日志配置&#xff0c;我们可以使用 show …

网络市场中的品牌推广:面向新一代数字原住民的挑战与机遇

随着科技的迅速发展和互联网的普及&#xff0c;我们正处在一个网络成熟期&#xff0c;一个以数字化和网络化为特征的新时代。在这个时代&#xff0c;新一代的数字原住民经营者正在崛起&#xff0c;他们依赖网络寻找商机&#xff0c;建立自己的事业。对于企业来说&#xff0c;如…

易安联参与制定的《面向云计算的零信任体系》行业标准即将实施

中华人民共和国工业和信息化部公告2023年第38号文件正式发布行业标准&#xff1a;YD/T 4598.2-2023《面向云计算的零信任体系 第2部分&#xff1a;关键能力要求》及YD/T 4598.3-2023《面向云计算的零信任体系 第3部分&#xff1a;安全访问服务边缘能力要求》&#xff0c;并于20…

YOLOv8-Seg改进:UNetv2多层次特征融合模块结合DualConv、GSConv

🚀🚀🚀本文改进:多层次特征融合(SDI)结合DualConv、GSConv模块等实现二次创新 🚀🚀🚀SDI 亲测在多个数据集能够实现涨点,同样适用于小目标检测 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定…

怎么做微信秒杀链接_开启用户的购物新体验

微信秒杀&#xff1a;开启你的购物新体验 在繁忙的生活节奏中&#xff0c;你是否厌倦了长时间排队等待购物&#xff0c;或者在电商平台上漫长而复杂的购物流程&#xff1f;今天&#xff0c;我要向你介绍一种全新的购物方式——微信秒杀。这不仅是一种全新的购物体验&#xff0…

YOLOv8改进 | 二次创新篇 | 在Dyhead检测头的基础上替换DCNv3 (全网独家首发)

一、本文介绍 本文给大家带来的改进机制是在DynamicHead上替换DCNv3模块,其中DynamicHead的核心为DCNv2,但是今年新更新了DCNv3其作为v2的升级版效果肯定是更好的,所以我将其中的核心机制替换为DCNv3给Dyhead相当于做了一个升级,效果也比之前的普通版本要好,这个机制我认…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床&#xff0c;可以说是互联网存储中最重要的应用之一&#xff0c;不仅网站需要图床提供的外链调取图片&#xff0c;个人或企业也用图床存储各种图片&#xff0c;方便随时访问查看。不过由于图床很不挣钱&a…

网络层详解

目录 前言 一、IP协议 1、IP协议报头 2、协议字段理解 &#xff08;1&#xff09;4位版本 &#xff08;2&#xff09;4位首部长度 &#xff08;3&#xff09;8位服务类型 &#xff08;4&#xff09;16位总长度 &#xff08;5&#xff09;标识、标志与片偏移 &#xf…

C#系列-手把手教你快速了解.NET Framework

.NET Framework .NET Framework是什么.NET Framework构成部分公共语言运行库&#xff08;CLR&#xff09;框架类库&#xff08;FCL&#xff09;核心语言&#xff08;WinForms、ASP.NET 和 ADO.NET&#xff09;其他模块&#xff08;WCF、WPF、WF、Card Space、LINQ、Entity Fram…

四、C++内存管理

1 C/C内存分布 在学习C的内存管理方式之前&#xff0c;我们先来看一道有关C/C内存分布的题目&#xff1a; 阅读下面的代码&#xff0c;回答相关问题&#xff1a; #include <iostream> using namespace std; int globalVar 1; static int staticGlobalVar 1; int main…

EOCR电机保护器485通讯协议概念

Modbus是由Modicon&#xff08;现为施耐德电气公司的一个品牌&#xff09;在1979年发明的&#xff0c;是全球第一个真正用于工业现场的总线协议。为更好地普及和推动Modbus在基于以太网上的分布式应用&#xff0c;目前施耐德公司已将Modbus协议的所有权移交给IDA&#xff08;In…

性能测试分析案例-定位内核线程CPU利用率太高

环境准备 预先安装 docker、perf、hping3、curl 等工具&#xff0c;如 apt install docker.io linux-tools-common hping3 操作和分析 Linux 在启动过程中&#xff0c;有三个特殊的进程&#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程&#xff0c;这也是系…

2024年五款值得买的云服务器推荐,便宜又好用

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…