先看一张图

可以看图片是一张内存图片,并不是一个具体地址,那么在读取excel的时候,应该要怎么保存图片。和在数据库存入对应的地址呢?

其实excel文件也是一个压缩文件。先把文件转成zip解压

media文件家里就是图片文件

这个图片和excel里的这个如何对应的。那么我们要解析这个cellimages.xml,得到内存和真实图片的对应关系,python代码就不解释了,直接用吧

import xml.etree.ElementTree as ET
import openpyxl

# 加载XML文件
tree = ET.parse('cellimages.xml')
root = tree.getroot()

# 创建Excel工作簿和工作表
workbook = openpyxl.Workbook()
worksheet = workbook.active

# 添加表头
worksheet['A1'] = 'Name'
worksheet['B1'] = 'Embed'

# 命名空间字典
namespaces = {
    'etc': 'http://www.wps.cn/officeDocument/2017/etCustomData',
    'a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
    'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
    'xdr': 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'
}

# 解析每个cellImage元素
row = 2
for cell_image in root.findall('etc:cellImage', namespaces):
    name_element = cell_image.find('xdr:pic/xdr:nvPicPr/xdr:cNvPr', namespaces)
    embed_element = cell_image.find('xdr:pic/xdr:blipFill/a:blip', namespaces)
    
    # 检查元素是否存在
    if name_element is not None and embed_element is not None:
        name = name_element.get('name')
        embed = embed_element.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed')
        
        # 将数据写入Excel
        worksheet.cell(row=row, column=1, value=name)
        worksheet.cell(row=row, column=2, value=embed)
        
        row += 1

# 保存Excel文件
workbook.save('cellimages.xlsx')

最后得到

rId1对应的image1 ,以此类推。把所有图片上传到阿里云oss就行了。

那么如果把图片都上传到fastdfs,fastdfs上传后会得到一个唯一id,并不是image1这个文件名。所以咱们要得到,唯一id和image1得对应关系。上python

#!/bin/bash

IMAGES_DIR="/home/media/"
IMAGE_LIST_FILE="/home/tup.txt"
NAME_MAPPING_FILE="/home/name_mapping.txt"
FASTDFS_CONFIG="/etc/fdfs/client.conf"
TRACKER_ADDRESS="192.168.51.61:22122"
GROUP_NAME="group1"

# Create or truncate the name_mapping.txt file
> "$NAME_MAPPING_FILE"

# Read image paths from image_list.txt
while IFS= read -r image_path; do
    echo "$image_path"
    # Upload image to FastDFS
    output=$(/usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf  {$image_path})

    # Get the uploaded file ID from the output
    file_id=$(echo "$output" | awk -F': ' '{print $2}')

    # Write filename mapping to name_mapping.txt
    echo "$(basename "$image_path") $file_id" >> "$NAME_MAPPING_FILE"
done < "$IMAGE_LIST_FILE"

上面的意思是得到id和image的关系 存到文本里。所有就等到了 内存中

和fastdfs文件id的关系了。

最后就是最简单的了。读取excel行。获得dspimg("id_xxxx")这个文本,替换成对应的oss或者fastdfs的地址就行了。最后落入数据库就行了。这里的java简单写一下

  FileInputStream file = new FileInputStream("D:\\1\\1(2).xlsx");
  Workbook workbook = new XSSFWorkbook(file);

  //档案分类id 写死的需要修改    读取第几个工作表
  Sheet sheet = workbook.getSheetAt(0); // 读取第一个工作表
  //都会不写了

 循环落库就行了。就不写了

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐