【POI】Excel的xlsx格式的sheet页复制(到新的Excel)

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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值