读取excel内存中的图片,如何存入数据库和上传到fastdfs
·
先看一张图


可以看图片是一张内存图片,并不是一个具体地址,那么在读取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); // 读取第一个工作表
//都会不写了
循环落库就行了。就不写了
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)