首页 > 其他分享 >根据链接自动生成二维码,并嵌入Excel后导出

根据链接自动生成二维码,并嵌入Excel后导出

时间:2024-11-29 11:29:28浏览次数:10  
标签:嵌入 String int Excel 二维码 import new path public

文章目录

1.需求

根据每个用户链接自动生成二维码,导出用户基础信息和二维码到excel中

效果如下:
在这里插入图片描述

2.依赖

       <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>

3.主体方法

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
/**
 * @description:
 * @author: xxjxl
 * @date: 2024/11/26 9:54
 */
public class UserQRCodeToExcel {
    public static void main(String[] args) throws IOException, WriterException {
        // 用户数据
        List<User> users = new ArrayList<>();
        users.add(new User(1L,"张三", "北京市,海淀区,清华大学附属小学", "小学语文班", "https://www.tsinghua.edu.cn/", "https://www.tsinghua.edu.cn/"));
        users.add(new User(2L,"李四", "北京市,海淀区,清华大学附属小学", "小学数学班", "https://www.tsinghua.edu.cn/", "https://www.tsinghua.edu.cn/"));
        users.add(new User(3L,"王五", "北京市,海淀区,清华大学附属小学", "小学英语班", "https://www.tsinghua.edu.cn/", "https://www.tsinghua.edu.cn/"));
        users.add(new User(4L,"赵六", "北京市,海淀区,清华大学附属小学", "小学体育班", "https://www.tsinghua.edu.cn/", "https://www.tsinghua.edu.cn/"));
        users.add(new User(5L,"钱七", "北京市,海淀区,清华大学附属小学", "小学音乐班", "https://www.tsinghua.edu.cn/", "https://www.tsinghua.edu.cn/"));

        // 创建Excel工作簿
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("用户信息");
        //设置列宽,根据自身要求变换
        int columnWidthInUnits1 = (int) (35 * 40 / 0.14);
        int columnWidthInUnits2 = (int) (35 * 20 / 0.14);
        int columnWidthInUnits3 = (int) (35 * 70 / 0.14);
        int columnWidthInUnits4 = (int) (25 * 13 / 0.14);
        sheet.setColumnWidth(1,  columnWidthInUnits1);
        sheet.setColumnWidth(2,  columnWidthInUnits2);
        sheet.setColumnWidth(3,  columnWidthInUnits3);
        sheet.setColumnWidth(4,  columnWidthInUnits4);
        // 创建表头
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("姓名");
        headerRow.createCell(1).setCellValue("区域");
        headerRow.createCell(2).setCellValue("学习圈");
        headerRow.createCell(3).setCellValue("链接");
        headerRow.createCell(4).setCellValue("二维码");

        // 生成二维码并写入Excel
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        for (int i = 0; i < users.size(); i++) {
        	//校验是否有文件夹
            if ( i == 0 ){
                createDirectoryIfNotExists("F:\\Export\\");
            }
			//把每个人的信息填写进去,二维码不填
            User user = users.get(i);
            Row row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(user.getName());
            row.createCell(1).setCellValue(user.getPath());
            row.createCell(2).setCellValue(user.getCircleName());
            row.createCell(3).setCellValue(user.getLink());

            // 生成二维码
            BitMatrix bitMatrix = qrCodeWriter.encode(user.getLink(), BarcodeFormat.QR_CODE, 200, 200);
            File qrFile = new File("F:/Export/qr_" + user.getName() + ".png");
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", qrFile.toPath());

            // 将二维码图片插入到Excel中
            insertImageToExcel(sheet, qrFile, i + 1);
            // 设置行高为3厘米,可自行变换
            row.setHeightInPoints(3 * 28.35f); // 3厘米转换为点
        }

        // 保存Excel文件
        try (FileOutputStream fileOut = new FileOutputStream("F:/Export/用户信息.xlsx")) {
            workbook.write(fileOut);
        }

        workbook.close();
        System.out.println("Excel文件已保存到F盘。");
    }

    private static void insertImageToExcel(Sheet sheet, File imageFile, int rowIndex) throws IOException {
        Workbook workbook = sheet.getWorkbook();
        int pictureIdx = workbook.addPicture(convertFileToByteArray(imageFile), Workbook.PICTURE_TYPE_PNG);
        CreationHelper helper = workbook.getCreationHelper();
        Drawing<?> drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = helper.createClientAnchor();
        anchor.setCol1(4); // 图片插入到第6列
        anchor.setRow1(rowIndex); // 插入到对应的行

        anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
        drawing.createPicture(anchor, pictureIdx).resize(); // 先创建图片
        anchor.setCol2(5); // 设置结束列
        anchor.setRow2(rowIndex + 1); // 设置结束行
    }
    
    private static void createDirectoryIfNotExists(String directoryPath) {
        Path path = Paths.get(directoryPath);
        if (Files.notExists(path)) {
            try {
                Files.createDirectories(path);
                System.out.println("目录已创建: " + directoryPath);
            } catch (IOException e) {
                System.err.println("创建目录时出错: " + e.getMessage());
            }
        } else {
            System.out.println("目录已存在: " + directoryPath);
        }
    }

    private static byte[] convertFileToByteArray(File file) {
        byte[] fileData = null;

        try (FileInputStream fis = new FileInputStream(file);
             ByteArrayOutputStream bos = new ByteArrayOutputStream()) {

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }

            fileData = bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return fileData;
    }
    static class User {
        private Long userId;
        private String name;
        private String path;
        private String circleName;
        private String link;
        private String QRcode;

        public User(Long userId, String name, String path, String circleName, String link, String QRcode) {
            this.userId = userId;
            this.name = name;
            this.path = path;
            this.circleName = circleName;
            this.link = link;
            this.QRcode = QRcode;
        }


        public Long getUserId() {
            return userId;
        }

        public void setUserId(Long userId) {
            this.userId = userId;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPath() {
            return path;
        }

        public void setPath(String path) {
            this.path = path;
        }

        public String getCircleName() {
            return circleName;
        }

        public void setCircleName(String circleName) {
            this.circleName = circleName;
        }

        public String getLink() {
            return link;
        }

        public void setLink(String link) {
            this.link = link;
        }

        public String getQRcode() {
            return QRcode;
        }

        public void setQRcode(String QRcode) {
            this.QRcode = QRcode;
        }
    }
}

注:这里user实体类可以单独创建一个Java文件并且使用@Data来减少重复代码,由于这只是一个demo就没有过多的操作,怎么快怎么来

标签:嵌入,String,int,Excel,二维码,import,new,path,public
From: https://blog.csdn.net/MaxBigBug/article/details/144128212

相关文章

  • 序列到序列的学习 (seq2seq - 词嵌入 - Embedding层 - mask掩码 - 后续会加入注意力机
    目录0.前言1.编码器 (encoder)补充1:词嵌入(WordEmbedding)补充2:嵌入层(EmbeddingLayer)2.解码器(decoder)3.损失函数4.训练5.预测6.预测序列的评估(BLEU)7.小结0.前言课程全部代码(pytorch版)已上传到附件本章节为原书第9章(现代循环网络),共分为8......
  • 知识图谱嵌入在推荐系统中的指南
    推荐系统的核心目标是根据用户的历史行为、兴趣和偏好,向他们推荐个性化的内容或产品。在传统推荐系统中,常用的方法包括协同过滤、矩阵分解和基于内容的推荐。这些方法虽然有效,但在面对冷启动问题、数据稀疏性以及复杂关系(如用户-物品、物品-属性之间的关联)时,存在一定的局限性。......
  • 【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值
    【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值零、起因是这样的,目前朋友托我写一款模板生成软件,任务是先把他写的程序文件复制一份出来,然后再根据Excel中对应位置的单元格的值,修改程序文件副本中的某些文件。对于读Excel的需求,经过测试,最终选择Qxlsx这款开源QT组件来读取......
  • linux嵌入式开发板推荐(附学习资料)
    嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一,由于人才的缺乏,企业对于嵌入式工程师的需求量增大,薪资水平也较为可观。很多人选择嵌入式行业但不知道怎么入门,学习嵌入式,开发板是最离不开的了,今天华清的资深程序员就来给大家分享如何选择嵌入式开发板。 对于嵌入......
  • 云闪付支付宝微信拉出代付或支付二维码让好友支
    云闪付支付宝微信等支付平台通道生成支付代付链接或者二维码如下图所示      ......
  • python之Excel操作库XlsxWriter
    github: https://github.com/jmcnamara/XlsxWriter PythonXlsxWriter是一个用于创建Excel2007+XLSX文件的库,它提供了简单易用的接口,使得开发者可以轻松地生成Excel文件,并且支持多种高级功能,如格式设置、图表绘制、数据透视表等。XlsxWriter与Excel文件的兼容性非常......
  • 试题转excel;试题整理;试卷转Excel,word试题转excel
    一、问题描述我父亲是一名教师,偶尔会需要整理一些高质量的题目到excel中以往都是手动复制搬运,几百道题几乎需要一个下午的时间关键这些事,枯燥无聊费眼睛,实在是看起来就很蠢的工作就想着做一个工具,可以自动处理这个工作,自动将word试题按照要求写入excel中,自动整理试题比如:......
  • 嵌入式linux开发板gdbserver+vscode可视化断点调试
    安卓板子请移步https://www.cnblogs.com/chenshao107/p/18548660gdb和gdbserver一般来说进行,进行嵌入式linux开发时,都会从开发板厂商拿到sdk,里面的工具链就有可用的gdb和gdbserver,所以一般是不需要自己去编译的。常见的比如,如果你用的工具链是arm-linux-gnueabihf-gcc,那你一般......
  • Qt操作Excel
    Qt操作Excel1.库的下载与安装由于xlsxwriter库是跨平台的,支持读写操作的,所以我选择该第三方库来操作excel该库的镜像地址如下:https://gitcode.com/gh_mirrors/qt/QtXlsxWriter/overview?utm_source=csdn_github_accelerator克隆命令为:gitclonehttps://gitcode.com/gh_mir......
  • 【嵌入式开发】log.c:一个非常轻量的嵌入式日志库
    log.c简介github链接:https://github.com/rxi/log.clog.c是一个轻量级的日志库。一个用C99实现的简单日志库,这意味着它应该可以在任何支持C99标准的平台上编译和运行,如我们的嵌入式系统中。特点:使用C99标准,适用于嵌入式。支持静默模式。支持日志级别设置。支持ANSI颜......