Java-操作xls替换文本或图片

准备xls模板文件:template.xls

df86a85401114bc5b98b6d39de32efce.png

要求根据不同的产品型号和图片,插入到模板文件中,然后再填充产品信息。

准备需要替换的图片和数据

94109c85a9484da18c3221060774469f.png

功能实现

package net.work.controller.base;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import net.work.request.base.BaseProductReq;
import net.work.request.base.ProductExcelReq;
import net.work.service.base.BaseProductService;
import net.work.util.JsonData;
import net.work.util.StoreUtil;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;@RefreshScope
@Api(tags = "成品管理")
@RestController
@RequestMapping("/api/base/v1/product/")
public class BaseProductController {@Value("${product.filePath}")private String filePath;@Autowiredprivate BaseProductService baseProductService;@ApiOperation("产品尺寸图和接线图导入")@PostMapping("importProductImage")public JsonData importProductImage(@RequestParam("file") MultipartFile file, String productModel) throws Exception {return baseProductService.importProductImage(file, filePath, productModel);}@ApiOperation("创建产品规格书xlsx")@PostMapping("createProductExcel")public void createProductExcel(@RequestBody ProductExcelReq productExcelReq) throws Exception {String productModel = productExcelReq.getProductModel();File file1 = new File(filePath + productModel + "\\img1.png");if (!file1.exists()) {throw new Exception("当前产品型号【" + productModel + "】img1.png文件不存在!");}File file2 = new File(filePath + productModel + "\\img2.png");if (!file2.exists()) {throw new Exception("当前产品型号【" + productModel + "】img2.png文件不存在!");}InputStream inputStream1 = new FileInputStream(file1);InputStream inputStream2 = new FileInputStream(file2);Workbook workbook = StoreUtil.createProductExcel(filePath, inputStream1, inputStream2, productExcelReq);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();workbook.write(outputStream);workbook.close();HttpServletResponse response = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getResponse();response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + productExcelReq.getProductModel() + ".xlsx");OutputStream out = response.getOutputStream();outputStream.writeTo(out);out.flush();out.close();}}
    public static Workbook createProductExcel(String filePath, InputStream inp2, InputStream inp3,ProductExcelReq productExcelReq) {String templateName1 = "template1.xlsx";String templateName2 = "template2.xlsx";if (productExcelReq.getLanguage() == 1) {templateName1 = "template1_en.xlsx";templateName2 = "template2_en.xlsx";}try (InputStream inp0 = new FileInputStream(filePath + templateName1);InputStream inp1 = new FileInputStream(filePath + templateName2)) {InputStream inp = inp0;// 可以根据不同的类型决定使用哪个模板if (productExcelReq.getInstallType().contains("xxx")) {inp = inp1;}Workbook workbook = new XSSFWorkbook(inp);Sheet sheet = workbook.getSheetAt(0);{byte[] bytes1 = IOUtils.toByteArray(inp2);byte[] bytes2 = IOUtils.toByteArray(inp3);int pictureIdx1 = workbook.addPicture(bytes1, Workbook.PICTURE_TYPE_PNG);int pictureIdx2 = workbook.addPicture(bytes2, Workbook.PICTURE_TYPE_PNG);CreationHelper helper = workbook.getCreationHelper();Drawing<?> drawing = sheet.createDrawingPatriarch();ClientAnchor anchor1 = helper.createClientAnchor();anchor1.setCol1(2);anchor1.setRow1(6);ClientAnchor anchor2 = helper.createClientAnchor();anchor2.setCol1(5);anchor2.setRow1(18);Picture pict1 = drawing.createPicture(anchor1, pictureIdx1);Picture pict2 = drawing.createPicture(anchor2, pictureIdx2);pict1.resize(4.08, 7.67);pict2.resize(1, 3.05);// 修改单元格内容Row row = sheet.getRow(15);Cell cell = row.getCell(3);cell.setCellValue(productExcelReq.getSpecification());row = sheet.getRow(16);cell = row.getCell(3);cell.setCellValue(productExcelReq.getProductModel());row = sheet.getRow(17);cell = row.getCell(3);cell.setCellValue(productExcelReq.getSwitchType());row = sheet.getRow(18);cell = row.getCell(3);cell.setCellValue(productExcelReq.getWorkDistance());row = sheet.getRow(19);cell = row.getCell(3);cell.setCellValue(productExcelReq.getInstallType());return workbook;}} catch (IOException e) {throw new RuntimeException(e);}}

BaseProductController 类是一个基于Spring框架的RESTful API控制器,用于处理与产品规格书创建和产品图片导入相关的请求。下面将对这个类以及相关功能进行详细的描述。

功能描述

1. 产品尺寸图和接线图导入(importProductImage)

此功能允许用户上传与特定产品型号关联的图像文件。通过向 /api/base/v1/product/importProductImage 发送POST请求,并附带一个MultipartFile对象作为参数,该方法会调用 BaseProductServiceimportProductImage 方法来处理上传的文件,并将其存储在由配置属性 ${product.filePath} 指定的路径下。成功后返回JsonData对象给客户端,其中包含操作结果信息。

2. 创建产品规格书xlsx(createProductExcel)

此功能旨在为指定的产品型号生成一个带有预定义模板格式的Excel文档(xlsx)。它接收JSON格式的数据体,这些数据体包含了要填充到Excel中的产品信息,如型号、语言、安装类型等。具体来说:

  • 它首先检查所需的两个PNG图片文件是否存在。
  • 然后读取这两个图片文件并创建对应的输入流。
  • 接着选择合适的模板文件(根据语言和其他条件),并加载模板。
  • 使用Apache POI库创建一个新的工作簿实例,并获取第一个工作表。
  • 将提供的图片插入到指定的单元格位置,并调整它们的大小以适应表格布局。
  • 更新工作表中的一些单元格内容,比如规格、型号、开关类型、工作距离和安装类型等。
  • 最后,将生成的工作簿写入到输出流,并设置响应头以提示浏览器下载生成的Excel文件。

技术细节

  • 依赖库:使用了Apache POI来操作Excel文件,org.apache.poi.ss.usermodel.Workbook 是其核心接口之一。
  • 异常处理:当缺少必要的图片文件时,会抛出异常并中断流程。
  • 国际化支持:根据传入的语言参数选择不同的模板文件(中文或英文)。
  • 多态性:通过判断 installType 来决定使用哪个模板,体现了面向对象编程的多态性原则。
  • 资源管理:确保所有打开的资源(如文件输入流)都能正确关闭,避免资源泄漏。
  • 安全性:采用了Swagger注解来描述API,便于开发人员理解和测试;同时也遵循了RESTful设计原则。

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

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

相关文章

.Net学习

1 什么是.NET Core .NET是开发平台&#xff0c;.NET Framework、.NET Core、Xamaarin/Mono的统称。 .NET Framework是只能在Windows上开发的技术 .NET Core是可以跨平台开发的技术 Xamaarin/Mono是移动端开发的技术 .NET Core&#xff1a;跨平台、免费、开源&#xff0c;可…

半监督学习与数据增强

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【成功解决:Can‘t uninstall ‘ultralytics‘. No files were found to uninstall.】

问题&#xff1a; 尝试卸载ultralytics时&#xff0c;使用pip uninstall ultralytics命令&#xff0c;已经卸载了ultralytics&#xff0c;但是仍出现Cant uninstall ultralytics. No files were found to uninstall&#xff0c;导致无法卸载干净。 原因 ultralytics相应的dis…

AcWing 3496. 特殊年份

文章目录 前言代码思路 前言 写简单题没啥。反正都是要写的&#xff0c;先把能拿到的分数拿了&#xff0c;之后有机会再去啃一啃硬骨头。啃不下来就算了。 代码 #include<bits/stdc.h> using namespace std; char a1[10],a2[10],a3[10],a4[10],a5[10]; int main(){cin…

MongoDB性能监控工具

mongostat mongostat是MongoDB自带的监控工具&#xff0c;其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令&#xff0c;可以呈现出实时的状态变化。不同的是&#xff0c;mongostat所监视的对象是数据库进程。mongostat常用于…

【LeetCode: 999. 可以被一步捕获的棋子数 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

智创 AI 新视界 -- 优化 AI 模型训练效率的策略与技巧(16 - 1)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束&#xff0c;专业819信号系统与信号处理140&#xff0c;总分420&#xff0c;终于梦圆交大&#xff0c;高考时敢都不敢想目标&#xff0c;现在已经成为现实&#xff0c;考研后劲很大&#xff0c;这一年的复习经历&#xff0c;还是历历在目&#xff0c;整理一下&#xff…

K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常

一、背景 程序在运行过程中&#xff0c;突然无法访问&#xff0c;发现后台接口也无法访问&#xff1b;查看kuboard&#xff0c;发现报如下异常&#xff1a;The node had condition: [DiskPressure]. 继续查看磁盘使用率&#xff0c;发现系统盘使用率已经高达93%。问题前后呼应…

【工具变量】上市公司企业违规数据(企业当年是否违规、企业当年违规的次数)2000-2022年

一、测算方式&#xff1a;参考C刊《当代财经》纪亚方&#xff08;2023&#xff09;老师的研究&#xff0c;通过对上市公司被处罚涉及的年份进行追溯&#xff0c;为了保证企业违规行为变量度量的准确性&#xff0c;将追溯到公司被处罚的年份定义为违规年份。 采用两个指标对企业…

视频孪生携手视联网 智汇云舟亮相中国电信2024数字科技生态大会

12月3日&#xff0c;由中国电信主办的“2024数字科技生态大会”在广州盛大开幕。活动现场&#xff0c;前沿科技与创新理念交相辉映&#xff0c;数字科技未来蓝图徐徐展开。智汇云舟作为中国电信的战略合作伙伴&#xff0c;受邀出席本次活动。 展会期间&#xff0c;以“天翼视联…

Unity 使用LineRenderer制作模拟2d绳子

效果展示&#xff1a; 实现如下&#xff1a; 首先&#xff0c;直接上代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineFourRender : MonoBehaviour {public Transform StartNode;public Transform MidNod…

力扣-图论-4【算法学习day.54】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

【射频IC进阶实践教程】2.6 LNA版图设计及DRC/LVS验证

射频集成电路的版图设计非常关键&#xff0c;他对寄生参数非常敏感&#xff0c;需要使其最小化。还需要注意相互耦合的方式本次课程主要介绍射频IC的一些相关布局和连线方面的考虑。 一、版图设计 1. 版图的元件布局 首先打开对应的原理图 点击进行版图设计 由于已经有做好的…

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现&#xff0c;因为官方有很多相关的功能和方法…

Spring Bean 的生命周期和获取方式

优质博文&#xff1a;IT-BLOG-CN 一、Spring Bean 的生命周期&#xff0c;如何被管理的 对于普通的 Java对象&#xff0c;当 new的时候创建对象&#xff0c;当它没有任何引用的时候被垃圾回收机制回收。而由 Spring IoC容器托管的对象&#xff0c;它们的生命周期完全由容器控…

【Spring MVC篇】返回响应

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、返回静态页面…

使用Python创建API服务器并打包成exe文件

本文来记录下使用Python创建API服务器并打包成exe文件 文章目录 概述简述API服务器创建打包API服务器为exe文件本文小结 概述 在软件开发中&#xff0c;API服务器是连接前端和后端服务的桥梁&#xff0c;而Python因其丰富的库和框架&#xff0c;如Flask、Django等&#xff0c;成…

MHA切换过程

MHA&#xff08;Master High Availability&#xff09;是一套用于MySQL数据库的高可用性解决方案&#xff0c;它能够在主服务器发生故障时自动将一个从服务器提升为新的主服务器&#xff0c;从而实现数据库服务的持续可用。MHA的切换过程主要包括以下几个步骤&#xff1a; 1. …

NextUI 教程:打造美观高效的React UI

NextUI 教程&#xff1a;打造美观高效的React UI 项目地址:https://gitcode.com/gh_mirrors/ne/nextui 1. 项目介绍 NextUI 是一个轻量级、快速且现代化的React UI库&#xff0c;提供了一系列优雅的组件以帮助开发者构建令人印象深刻的Web应用。它注重性能和用户体验&#x…