获取导入excel的某一列的所有数据并查询图片批量的进行导出到压缩包

首先列出 工具类解析excel,及MultipartFile转换为File

package com.ott.server.btt.webapi.utils;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
public class ReadExcelUtil {
    /**
     * 读取Excel文件指定列的数据
     * @param iStream 文件InputStream
     * @param columnIndex 读第几列 (0开始)
     * @return
     * @throws IOException
     * @throws InvalidFormatException
     */
    public static List<String> getColumn(InputStream iStream, int columnIndex) throws IOException, InvalidFormatException {
        List<String> columnList=new ArrayList<>();
        Workbook book = WorkbookFactory.create(iStream);
        Sheet sheet = book.getSheetAt(0);

        for (int runNum =1; runNum <=sheet.getLastRowNum();runNum++) {
            Row row = sheet.getRow(runNum);
            if (row != null) {
                int minColIx = row.getFirstCellNum();
                int maxColIx = row.getLastCellNum();
                //遍历该行,获取每个cell元素
                for (int colIx = minColIx; colIx < maxColIx; colIx++) {
                    Cell cell = row.getCell(colIx);
                    //获取指定的一列
                    if (cell.getColumnIndex() == columnIndex) {
                        columnList.add(cell.getStringCellValue());
                    } else {
                        continue;
                    }
                }
            }
        }
        return columnList;
    }
    /**
     * MultipartFile 转 File
     *
     * @param multipartFile
     * @throws Exception
     */
    public static File MultipartFileToFile(MultipartFile multipartFile) {

        File file = null;
        //判断是否为null
        if (multipartFile.equals("") || multipartFile.getSize() <= 0) {
            return file;
        }
        //MultipartFile转换为File
        InputStream ins = null;
        OutputStream os = null;
        try {
            ins = multipartFile.getInputStream();
            file = new File(multipartFile.getOriginalFilename());
            os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ins != null){
                try {
                    ins.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }
}

业务处理

  public void downInvoiceImageZip(MultipartFile file, HttpServletResponse response) throws IOException, InvalidFormatException {
        File fileNew = ReadExcelUtil.MultipartFileToFile(file);
        List<String> invoiceCode = ReadExcelUtil.getColumn(new FileInputStream(fileNew),3);
        List<String> invoiceNo = ReadExcelUtil.getColumn(new FileInputStream(fileNew),2);
        List<Map<String,byte[]>> stringList = new ArrayList<>();
        byte[] imageByteArray;
        for(int i=0;i<invoiceNo.size();i++){
            LambdaQueryWrapper<PurchaseInvoiceMain> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(PurchaseInvoiceMain::getInvoiceNo,invoiceNo.get(i));
            queryWrapper.eq(PurchaseInvoiceMain::getInvoiceCode,invoiceCode.get(i));
            //查询出匹配发票代码及发票号码的集合
            List<PurchaseInvoiceMain> list =this.list(queryWrapper);
            for(int t=0;t<list.size();t++){
                try {
                   //我是通过url 获取字节,这块可以自己处理
                    imageByteArray = fileChange.channel(SFile.channel()).read(privateBucket, list.get(t).getScanDeductionImageUrl());
                } catch (IOException e) {
                    throw new BusinessException("读取图片异常:" + e.getMessage());
                } catch (NoSuchKeyException e) {
                    throw new BusinessException("读取图片异常:文件不存在");
                }
                int start =list.get(t).getScanDeductionImageUrl().lastIndexOf("/");
                int end = list.get(t).getScanDeductionImageUrl().lastIndexOf(".");
                String name=list.get(t).getScanDeductionImageUrl().substring(start+1,end);
                Map<String,byte[]> map = new HashMap<>();
                map.put(name,imageByteArray);
                stringList.add(map);
            }
        }
        //获取到所有发票代码的url地址,通过地址将图片批量下载并转换为zip
        try {
            String downloadFilename = "发票图片";//文件的名称
            downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");//转换中文否则可能会产生乱码
            response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename +".zip");// 设置在下载框默认显示的文件名
            ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
            for (int i = 0; i < stringList.size(); i++) {
                Set<String> keySet = stringList.get(i).keySet();
                String keySting=null;
                for (String key:keySet){
                    keySting=key;
                    zos.putNextEntry(new ZipEntry(key+new Date().getTime()+".jpg"));
                }
                InputStream fis = new ByteArrayInputStream(stringList.get(i).get(keySting));
                byte[] buffer = new byte[1024];
                int r = 0;
                while ((r = fis.read(buffer)) != -1) {
                    zos.write(buffer, 0, r);
                }
                fis.close();
            }
            zos.flush();
            zos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

可以使用 VBA 的 Excel 对象模型来编写一个加载项来实现这个功能。 首先,我们需要创建一个菜单项,用于触发图片批量导出导入的功能。在 Excel 中,可以通过添加一个自定义 Ribbon 来实现此目的。 以下是一个基本的 VBA 代码示例,用于创建一个自定义 Ribbon 和菜单项: ```vba ' 定义一个 Ribbon XML 字符串,用于创建自定义 Ribbon Const ribbonXml As String = "<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui'>" & _ "<ribbon><tabs><tab id='customTab' label='My Tools'>" & _ "<group id='customGroup' label='Image Tools'>" & _ "<button id='exportImagesButton' label='Export Images' size='large' onAction='ExportImages' imageMso='ExportExcel'/>" & _ "<button id='importImagesButton' label='Import Images' size='large' onAction='ImportImages' imageMso='ImportExcel'/>" & _ "</group></tab></tabs></ribbon></customUI>" ' 在加载项启动时创建自定义 Ribbon Private Sub Workbook_Open() ' 创建一个自定义 Ribbon Call RibbonX.Create(ribbonXml) End Sub ``` 以上代码会在加载项打开时创建一个自定义 Ribbon,其中包含一个名为“Image Tools”的菜单组,其中包含两个菜单项:“Export Images”和“Import Images”。 接下来,我们需要编写菜单项的处理程序,以实现图片批量导出导入的功能。 以下是一个示例代码,用于实现图片批量导出的功能: ```vba ' 处理“Export Images”菜单项的单击事件 Private Sub ExportImages(control As IRibbonControl) ' 获取当前活动的工作表 Dim ws As Worksheet Set ws = ActiveSheet ' 定义图片保存目录 Dim folderPath As String folderPath = Application.GetSaveAsFilename("", "JPEG Files (*.jpg), *.jpg") ' 获取导出图片 Dim imageColumn As Range Set imageColumn = Application.InputBox("Please select the column containing image names", Type:=8) ' 循环处理每个单元格 Dim cell As Range For Each cell In imageColumn.Cells ' 跳过空单元格 If IsEmpty(cell.Value) Then GoTo NextCell ' 获取图片文件名 Dim imageName As String imageName = cell.Value & ".jpg" ' 获取图片对象 Dim image As Shape Set image = ws.Shapes(imageName) ' 保存图片为 JPEG 文件 image.CopyPicture Appearance:=xlScreen, Format:=xlPicture Dim savePath As String savePath = folderPath & imageName With New MSForms.DataObject .SetData image .PutInClipboard With New MSForms.DataObject .GetFromClipboard .SaveAsFile savePath End With End With NextCell: Next cell End Sub ``` 以上代码会展示一个输入框,提示用户选择包含图片文件名的,然后将该中每个单元格中的图片导出为 JPEG 文件。 而以下是一个示例代码,用于实现图片批量导入的功能: ```vba ' 处理“Import Images”菜单项的单击事件 Private Sub ImportImages(control As IRibbonControl) ' 获取当前活动的工作表 Dim ws As Worksheet Set ws = ActiveSheet ' 定义图片目录 Dim folderPath As String folderPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) ' 获取导入图片 Dim imageColumn As Range Set imageColumn = Application.InputBox("Please select the column to insert images", Type:=8) ' 循环处理每个单元格 Dim cell As Range For Each cell In imageColumn.Cells ' 跳过空单元格 If IsEmpty(cell.Value) Then GoTo NextCell ' 获取图片文件名 Dim imageName As String imageName = cell.Value & ".jpg" ' 插入图片 Dim image As Shape Set image = ws.Shapes.AddPicture(folderPath & imageName, msoFalse, msoTrue, cell.Left, cell.Top, -1, -1) image.Name = imageName NextCell: Next cell End Sub ``` 以上代码会展示一个输入框,提示用户选择包含要插入图片,然后将该中每个单元格中的图片文件插入到工作表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值