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

news2025/1/12 15:12:40

功能:后端使用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>

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

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

相关文章

GIT - 清除历史 Commit 瘦身仓库

目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长&#xff0c;分支较多&#xff0c;且分支内包含很多不同的大文件&#xff0c;随着时间的推移&#xff0c;历史 Git 库的容量日渐增发&#xff0c…

高级分布式系统-第6讲 分布式系统的容错性--故障/错误/失效/异常

分布式系统容错性的概念 分布式系统的容错性&#xff1a; 当发生故障时&#xff0c; 分布式系统应当在进行恢复的同时继续以可接受的方式进行操作&#xff0c; 并且可以从部分失效中自动恢复&#xff0c; 且不会严重影响整体性能。 具体包括以下4个方面的内容&#xff1a; 可…

nas系统盘制作(群晖)

目录 一、前言 二、制作系统盘 &#xff08;一&#xff09;下载镜像 &#xff08;二&#xff09;下载U盘刷写工具 三、资料获取 一、前言 群晖系统是使用比较多的nas系统。现在主要使用的是7版本的系统。 h群晖是指“h群晖NAS”&#xff08;Hackintosh NAS&#xff09;系统…

MindOpt:阿里巴巴达摩院打造的优化求解器及其组件全面介绍

MindOpt 简介和获取 MindOpt 是阿里巴巴达摩院决策智能实验室研发的决策优化软件。团队组建于2019年&#xff0c;聚焦于研发尖端运筹优化和机器学习技术&#xff0c;构建智能决策系统&#xff0c;更快更好地向各行各业提供数学建模与求解能力&#xff0c;帮助业务更快更好地做…

工作电压范围宽的国产音频限幅器D2761用于蓝牙音箱,输出噪声最大仅-90dBV

近年来随着相关技术的不断提升&#xff0c;音箱也逐渐从传统的音箱向智能音箱、无线音箱升级。同时在消费升级的背景下&#xff0c;智能音箱成为人们提升生活品质的方式之一。智能音箱是智能化和语音交互技术的产物&#xff0c;具有点歌、购物、控制智能家居设备等功能&#xf…

苹果可充电键盘背光系统专利曝光:延长MacBook Air / Pro续航

根据美国商标和专利局&#xff08;USPTO&#xff09;近日公示的清单&#xff0c;苹果公司近日获得了一项关于电子设备键盘的相关专利。 苹果公司在专利中表示&#xff0c;为了在低光环境下&#xff0c;能够提高用户敲击键盘的输入体验&#xff0c;通常键盘会提供背光。 传统键…

获取进行逗号分隔的id值 Split的使用

获取进行逗号分隔的id值,Split的使用 后台实现对有逗号进行分割的字符串 使用这行代码就不会有一个空数组值,直接过滤调数组中的空值 var ids = key.Split(,).Where(s => !string.IsNullOrEmpty(s

使用pycharm连接读取orcl数据库的表

背景&#xff1a;工作需要 需求&#xff1a;使用pycharm访问远程oracle类型数据库的表&#xff0c;表中包含lob字段&#xff08;这也是个坑&#xff01;&#xff09; 麻了&#xff0c;搞了一个星期&#xff0c;终于成功了&#xff0c;真可谓是每步都有坑&#xff0c;看的文章也…

全网最全持续集成接口自动化-jmeter+ant+jenkins

ant 批量执行Jmeter 一、环境准备 1、JDK环境&#xff1a;Java Downloads | Oracle 2、ANT环境&#xff1a;Apache Ant - Binary Distributions 3、Jmeter&#xff1a;Apache JMeter - Download Apache JMeter 4、将 jmeter的extras目录中ant-jmeter-1.1.1.jar包拷贝至ant…

Whale 帷幄创始人叶生晅:AIGC 时代,营销的范式变了丨未来 AI 谈

「未来 AI 谈」是「Marteker 营销技术官」联合「Digital Frontier 首席数字官」共同发起的一档对话栏目&#xff0c;旨在探讨生成式 AI 的崛起对泛营销技术和营销自动化带来的影响&#xff0c;以期帮助全行业探索 AIGC 时代的新营销之路。 本期嘉宾&#xff1a;「Whale 帷幄」创…

【发票识别】支持pdf、ofd、图片格式的发票

背景 为了能够满足识别各种发票的功能&#xff0c;特地开发了当前发票识别的功能&#xff0c;当前的功能支持pdf、ofd、图片格式的发票识别&#xff0c;使用到的技术包括文本提取匹配、ocr识别和信息提取等相关的技术&#xff0c;用到机器学习和深度学习的相关技术。 体验 体…

显示器新赛道Type-C接口

如果把主机比作大脑&#xff0c;那显示器就是眼睛&#xff0c;没有眼睛&#xff0c;大脑再强大也发挥不出效果&#xff0c;所以显示器作为电脑最重要的输出设备&#xff0c;有着举足轻重的地位&#xff0c;可以说在生活中处处都有显示器的影子。其实显示器的历史也是科技发展史…

5288 SDH/PDH数字传输分析仪

5288 SDH/PDH数字传输分析仪 数字通信测量仪器 5288 SDH/PDH数字传输分析仪为高性能手持式数字传输分析仪&#xff0c;符合ITU-T SDH/PDH技术规范和我国光同步传输网技术体制的规定,支持2.048、34.368、139.264Mb/s及155.520Mb/s传输速率的测试。可进行SDH/PDH传输设备和网络的…

java返回链表中间节点

下面我用两种方式来演示 第一种&#xff1a;就是先求出链表长度&#xff0c;长度count,长度除2的值,再从头指针处走num-1次就是返回节点这也是我们常用方法&#xff0c;代码演示&#xff1a; class Solution {public ListNode middleNode(ListNode head) {if(headnull)return…

浅谈电动机监控系统在企业降碳过程中的作用 ——安科瑞 顾烊宇

1.前言 据《2017-2022年中国电力工业产业专项调查及十三五市场商机分析报告》显示&#xff0c;从我国目前全社会用电结构来看&#xff0c;工商业用户耗电量约占 80%&#xff0c;其中电机耗电约占工业用电的 75%&#xff0c;全国总耗电的 60%&#xff0c;是用户终端耗电占比较大…

怎样创建vue项目(分别基于vue-cli和vite两种的创建方式)

一、基于vue-cli脚手架创建 1、安装node.js 1、首先需要安装node.js&#xff0c;推荐下载地址&#xff1a;Node.js 2、检查是否安装成功&#xff0c;使用打开黑窗口的快捷键windowR&#xff0c;输入cmd&#xff0c;在黑窗口输入node -v&#xff0c;如果输出版本号&#xff0…

iOS 调试工具CocoaDebug

1、使用pod工具在项目里面添加CocoaDebug的SDK。 platform :ios, 11.0target ShopService doproject ShopServiceuse_frameworks!pod CocoaDebug, :configurations > [Debug]end2、之后就可以在项目里面看到效果了 APP上显示的是一个黑色背景的小圆圈。 上面39表示调用了39…

three.js 使用 tweenjs绘制相机运动动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

挖到宝啦,大部分人都不知道的企业内部知识库搭建方法

在竞争激烈的现代社会中&#xff0c;企业要取得成功&#xff0c;必须拥有自己的知识库。这是企业能力的一种体现&#xff0c;也是其取得竞争优势的主要途径之一。所谓知识库&#xff0c;就是把企业内部的各种知识&#xff0c;包括技术、管理、市场等方面的知识进行系统化、结构…

电脑删除文件夹时提示“已在另一个程序中打开”

我们在使用电脑删除某个文件夹&#xff0c;特别是一些程序卸载后的残留文件夹时&#xff0c;可能会出现“操作无法完成&#xff0c;因为其中的文件夹或文件已在另一个程序中打开”的弹窗提示。有些是可以在任务管理器中关闭某个进程的占用来解决&#xff0c;但是有些却难以找到…