POI——将Excel的一个sheet复制到新的Excel中
一、场景说明
某个xlsx格式的excel,sheet页很多,每个sheet页中都有图片、图形、绘图、图表等各种东西,现在需要将各个sheet页分离出来,每个sheet页单独保存为一个Excel
二、探索(可跳过)
1、使用POI提供的高级API,将一个Excel的sheet复制到另一个Excel,大致步骤如下
① 打开Excel
② 遍历sheet页
③ 遍历每个sheet页的每一个可见单元格,复制文本、样式、边框
● 这一步没有过多的问题,最多慢一些
④ 遍历每个sheet页的shapes,获取图形、图片信息,如果存在图形组,还需要递归遍历
● 到这里会出现问题(使用POI的高级API)
> 图片复制的过程中,不仅需要复制其原始文件,而且还要复制图片在sheet页中的坐标,若图片在单元格内,则位置的处理相对简单;
> 若不在单元格内,而是在单元格“上面”(即图层),则图片定位的获取则相对麻烦;
> 若图片位于一个图形组内,则图片的定位此时不依赖于sheet窗口,而是所在图形组内的相对位置;目前POI的高级API,无法直接获取图形组内的图片的相对位置(截止到POI 5.2.5)
> 若图片不是PNG等常见格式,而是SVG或者OBJ,POI也同样不提供直接获取的方法
> 到了图形的层面,POI的高级API甚至无法复制
● 综上,夭折
2、使用POI提供的低级API,将一个Excel的sheet复制到另一个Excel
● 大致步骤是相同的
● 不同点在于,我们可以直接通过复制XML的形式,轻松愉快的复制上面提到的图形
● 低级API,即 extends org.apache.xmlbeans.XmlObject 的各种东西,比如 CTWorkbook、CTWorksheet、CTRow等,他们都可以直接获取到xlsx文件的各种XML格式文件的内容

● 我们可以通过创建一个新的workbook和worksheet,copy旧的workbook、worksheet的xml,新建drawing图层,复制旧的worksheet关联的drawing.xml,此时便解决了图形的问题(前提需要处理好各种引用关系)
● 比如,workbook.xml中,涉及到sheet的引用
<sheets>
<sheet name="Sheet1" sheetId="1" r:id="rId1" />
</sheets>
● workbook.xml.rels中,有各种引用位置
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<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/r

&spm=1001.2101.3001.5002&articleId=137948717&d=1&t=3&u=ec11e588fed448c181c7924b64cb2e10)
3608

被折叠的 条评论
为什么被折叠?



