根据Excel表格的姓名列对应照片插入到Excel里

一、首先创建一个Maven项目

二、在pom文件添加依赖

<dependencies>
        <!-- 这里粘贴你的依赖配置 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- 如果需要对xlsx格式的Excel文件进行处理 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- Apache POI -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.4</version> 
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.4</version> 
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version> <!-- 需要与poi-ooxml版本对应 -->
        </dependency>
    </dependencies>

三、编写代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
/**
 * @author 耀耀
 * @Description 根据Excel表格的姓名列对应照片插入到Excel里
 * @date 2024年04月01日 22:19
 */

public class test {
    public static void main(String[] args) {
        try {
            File file = new File("D:/student/XX中学报名信息表九四.xls");//这里替换你的excel地址
            FileInputStream inputStream = new FileInputStream(file);

            Workbook workbook = new HSSFWorkbook(inputStream);
            Sheet sheet = workbook.getSheetAt(1);  // 假设学生信息在第2个表单中

            for (int rowNumber = 1; rowNumber <= sheet.getLastRowNum(); rowNumber++) {
                Row row = sheet.getRow(rowNumber);
                if (row == null) {
                    continue;
                }

                String studentName = row.getCell(2).getStringCellValue();  // 假设学生姓名在第三列(索引为2)
                String photoFileName = findPhotoFile(studentName);  // 查找学生对应的照片文件名

                if (!photoFileName.isEmpty()) {
                    File imgFile = new File("D:/student/九四照片/九四照片/有档案/" + photoFileName);
                    BufferedImage bufferedImage = ImageIO.read(imgFile);
                    int pictureIdx = workbook.addPicture(ImageUtils.getImageBytes(bufferedImage), Workbook.PICTURE_TYPE_JPEG);

                    CreationHelper helper = workbook.getCreationHelper();
                    Drawing<?> drawing = sheet.createDrawingPatriarch();
                    ClientAnchor anchor = helper.createClientAnchor();

                    // 设置图片起始位置
                    anchor.setCol1(7);  // 图片起始列
                    anchor.setRow1(rowNumber);  // 图片起始行
                    anchor.setCol2(8);  // 图片结束列
                    anchor.setRow2(rowNumber + 1);  // 图片结束行

                    Picture picture = drawing.createPicture(anchor, pictureIdx);
                    picture.resize();  // 调整图片大小
                }
            }

            FileOutputStream fileOut = new FileOutputStream("D:/student/XX中学报名信息表带照片4.xls");
            workbook.write(fileOut);
            fileOut.close();

            workbook.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String findPhotoFile(String studentName) {
        String photoFolderPath = "D:/student/九四照片/九四照片/有档案/";//存放照片的文件地址
        File folder = new File(photoFolderPath);
        File[] files = folder.listFiles();

        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    String fileName = file.getName();
                    // 假设照片文件名与学生姓名匹配(假设按照"学生姓名.jpg"的格式命名)
                    if (fileName.equalsIgnoreCase(studentName + ".jpg")) {
                        return fileName;  // 返回找到的照片文件名
                    }
                }
            }
        }

        return "";  // 如果没有找到匹配的照片文件,可以返回空字符串或者其他适当的默认值
    }
}

class ImageUtils {
    public static byte[] getImageBytes(BufferedImage bufferedImage) {
        byte[] imageBytes = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "jpg", baos);
            imageBytes = baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return imageBytes;
    }
}

四、可能遇到的问题

4.1、java.io.FileNotFoundException: x:\xxx\xx\xx\(拒绝访问。)

这个错误表明您的程序在尝试打开文件输入流时遇到了拒绝访问的问题。通常情况下,这可能是由于以下原因:

  1. 权限问题: 程序没有足够的权限来读取文件或目录。请确保您有正确的权限来访问所需的文件和目录。

  2. 文件路径错误: 可能文件路径指向了一个不存在的文件或目录,或者路径包含了拼写错误。

4.2、The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)

这个错误提示表明你的代码在尝试使用XSSFWorkbook来处理一个不符合OOXML标准的文件,可能是一个传统的OLE2格式的文件。

根据这个错误,有几种可能的原因:

  1. 文件格式问题:你读取的文件可能并非.xlsx格式的文件,而是一些其他格式,比如.xls等。确认你的文件确实是一个有效的.xlsx文件。

  2. POI版本兼容性:如果你确定文件格式正确,那么请检查一下你使用的POI类库版本是否正确。有时不同的POI版本之间会出现一些不兼容的情况。

  3. FileInputStream参数问题:另外,请确保在使用FileInputStream时,参数指向的文件是完整路径下的文件且该文件存在,否则也可能触发这样的异常。

  4. HSSF vs XSSF:最后,请确认你正在使用的POI类库是适用于对应格式的。如果你要处理的是.xls文件,则你需要使用HSSF相关的类;如果是.xlsx文件,则需要使用XSSF相关的类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值