一、背景

工作内容需要生成大量数据(含图片)、格式自定义的 Excel,网络上没有找到对应的解决方案,试着自己摸索了下。好在有一个基本的解决思路了。

10w 条数据,图片大约 2G,测试下来生成时间不到 2 分钟。

二、基本概念

1、excel 本质上是一个压缩包,右键打开压缩包可查看其对应结构。如下:

2、excel 另存为 xml ,表示用 xml 来描述该表格,但仅能保存文本类型的数据,图片类的资源会丢失。

xml 能够描述一类数据结构的组织关系。对于文本类型的数据,只需在 xml 标签里面直接填入文字即可,而对于图片或是其它资源,xml 无法直接表示,但可以与具体类型的文档约定转换规则。如:work 在另存为 xml 时,图片会直接转换成 base64,存放在标签里,打开时,可直接解析为图片。

excel 本质上是一种压缩包,图片是直接以文件的方式存放在压缩包的 root\xl\media\ 目录下,在另存为 xml 时,仅将文字描述信息保存,图片直接丢失了。这时不禁产生了一个思考,有没有什么办法可以将这种转换关系表达出来?

三、操作步骤

操作步骤分为大体分为三步:

1、将编辑好的模板转存为 xml 文件,其中,图片格式调整为嵌入式图片;此时,打开xml文件发现,原来图片所在单元格内出现了一个如下字符:

<Row ss:Height="31.35"><Cell ss:Formula="=DISPIMG(&quot;ID_44FBDDF08CF34A229F9C95EDAB8D6D4E&quot;,1)"><Data ss:Type="String">=DISPIMG(&quot;ID_44FBDDF08CF34A229F9C95EDAB8D6D4E&quot;,1)</Data></Cell>
</Row>

DISPIMG 是 excel 内置函数,表示在单元格内插入图片

2、将步骤 1 中的 xml 另存为 ftl,通过 freemarker 生成一份包含数据的 xml,其中,图片部分按照上述格式填入图片的标识
3、将步骤 2 中生成的 xml 转存为 xlsx (java)
4、将以下 4 个配置文件分别生成拷贝到 excel 压缩包对应目录中
(1)[Content_Types].xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="jpeg"ContentType="image/jpeg"/><Default Extension="JPG"ContentType="image/.jpg"/><Default Extension="rels"ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml"ContentType="application/xml"/><Override PartName="/docProps/app.xml"ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/><Override PartName="/docProps/core.xml"ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/custom.xml"ContentType="application/vnd.openxmlformats-officedocument.custom-properties+xml"/><Override PartName="/xl/cellimages.xml"ContentType="application/vnd.wps-officedocument.cellimage+xml"/><Override PartName="/xl/sharedStrings.xml"ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/><Override PartName="/xl/styles.xml"ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/><Override PartName="/xl/theme/theme1.xml"ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/xl/workbook.xml"ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml"ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
</Types>

(2)cellimages.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<etc:cellImages xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"xmlns:etc="http://www.wps.cn/officeDocument/2017/etCustomData"><etc:cellImage><xdr:pic><xdr:nvPicPr><xdr:cNvPr id="3"name="ID_F15EB208E8164494AD0AFF387A896542"descr="D:\tmp\003833-1649695113a4a0.jpg003833-1649695113a4a0"/><xdr:cNvPicPr><a:picLocks noChangeAspect="1"/></xdr:cNvPicPr></xdr:nvPicPr><xdr:blipFill><a:blip r:embed="rId1"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></xdr:blipFill><xdr:spPr><a:xfrm><a:off x="9671050"y="2582545"/><a:ext cx="1203960"cy="686435"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></xdr:spPr></xdr:pic></etc:cellImage>
</etc:cellImages>

(3)cellimages.xml.rels

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"Target="media/image1.jpeg"/>
</Relationships>

(4)workbook.xml.rels

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId5"Type="http://www.wps.cn/officeDocument/2020/cellImage"Target="cellimages.xml"/><Relationship Id="rId4"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"Target="sharedStrings.xml"/><Relationship Id="rId3"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"Target="styles.xml"/><Relationship Id="rId2"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"Target="theme/theme1.xml"/><Relationship Id="rId1"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"Target="worksheets/sheet1.xml"/>
</Relationships>

上面的 4 个配置文件描述了资源的对应关系

时间有限,后续会继续补充!!!

大量数据(含图片)、格式自定义的 Excel 生成思路相关推荐

  1. excel自动排班表_巧用常见工具:怎样将图片格式数据转换成EXCEL表格

    有时我们需要处理的数据以图片或pdf的形式存储,无法直接粘贴到EXCEL中.今天小白通介绍一种将图片中数据转换成表格的方法,为大家解决这个烦恼. 1. 假设我们需要处理的数据存储在这张图片中. 2. ...

  2. python批量提取word文档中的图片(含图片格式转换和GUI)

    作者:小小明 文章目录 doc格式批量转为docx 批量提取docx文档的图片 批量图片格式转换 完整代码 GUI图形化工具开发 打包exe 给GUI加入进度条 日常工作中,领导要求你将一份 Word ...

  3. Java爬虫,爬取竞彩网数据并按指定格式输出到excel表格中

    首先需要下载相关的依赖包,我用的是eclipse,直接百度maven然后搜索相应的依赖放到pom文件中就行了. 爬取的网址为:http://info.sporttery.cn/football/mat ...

  4. Qt处理JSON数据(含数组)并保存至excel表格

    今天主要是说一下,今天在项目中解决掉得一个项目需求,需求大概是这样的:qt后台需要处理一份JSON文件,当然了这个是一份标准的JSON文件,然后处理转换存入excel表格.其实这个需求可以分解为三步: ...

  5. base64格式图片数据转为图片格式

    方法一(base64转file): 1.method方法: base64ImgtoFile(base64data, filename = 'file') {let arr = base64data.s ...

  6. jpg、jpeg、png、gif、bmp、tiff、ai、cdr、eps 图片格式的区别

    jpg.jpeg.png.gif.bmp.tiff.ai.cdr.eps这些图片格式是最常用的,也是最常见的,几乎每一天都要与他们打交道. 刚刚入门的新人通常不知道在什么地方如何使用他们或者说如何更有 ...

  7. 常见图片格式jpg、jpeg、png、gif等之间的区别

    jpg.jpeg.png.gif.bmp.tiff.ai.cdr.eps 对于做设计这一行的人来说,这几个图片格式是最常用的,也是最常见的,几乎每一天都要与他们打交道.刚刚入门的新人通常不知道在什么地 ...

  8. c语言判断后缀是否为bmp,c语言_常见图片格式判断

    c语言_常见图片格式判断 我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我 ...

  9. bootstraptable导出excel独立使用_使用 EasyPOI 优雅导出Excel模板数据(含图片)

    EasyPOI功能如同名字Easy,主打的功能就是容易,让一个没接触过POI的人员可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出.通过简单的注解和模板语言(熟悉的表 ...

最新文章

  1. 文件读取getline与fscanf_s
  2. Spring+SpringMVC项目搭建
  3. css教程之列表属性
  4. percona-xtrabackup-8.0.7简单快捷使用
  5. 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
  6. 互联网移动支付技术_安全架构图(安全技术/安全协议/加密技术)——转载图片...
  7. 【机器视觉学习笔记】直方图的绘制及直方图均衡化(C++)
  8. LeetCode 275. H指数 II(二分查找)
  9. 谷歌AI算法 助力可控核聚变研究
  10. 1块钱的路由器,10亿美金的小米网络
  11. Brother DCP-1608 Printer共享打印机防坑指南
  12. 说到建模,如果不提这几个软件的话……
  13. 时速云Kubernetes进阶培训 第三期
  14. c语言经典面试题(附答案)
  15. AiChallenger比赛记录之样本不均衡
  16. 【MM32F5270开发板试用】硬件IIC读取SHT20温湿度传感器
  17. Easyui文件上传格式限制
  18. 腾讯秋招--微信支付面经
  19. linux rhel unix centos FreeBSD 查看CPU核数使用率 系统 位 内存大小 硬盘 HBA光纤卡号 常用命令
  20. 鲍尔默评论谷歌退出中国事件

热门文章

  1. 押注零知识证明赛道,Conflux与ACCSEAL达成战略合作
  2. MAC 通过终端连接AWS云服务上的linux系统(Ubuntu)修改Html的标题
  3. Google drive如何下载大文件
  4. 十年总结(17):谈谈温伯格的三本书 - 思考是进步的原动力
  5. 中国舷外机行业研究与投资战略报告(2021版)
  6. 1.专家系统涉及内容简介-01
  7. 百超激光 镭射 bysoft6.8.1软件
  8. 2018级河南省学业水平测试计算机,郑州市教育局关于2018级普通高中信息技术学业水平考试有关事宜的通知...
  9. 百胜IPOS图片处理
  10. 第十一届蓝桥杯python组试题解答