From 61c80a9ff2a12d6c180e3a9e14679f98ba959732 Mon Sep 17 00:00:00 2001 From: Jiaju Zhuang Date: Wed, 8 Jun 2022 17:38:09 +0800 Subject: [PATCH] =?UTF-8?q?*=20=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86xlsx?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AF=BB=E5=8F=96=E8=B6=85=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../excel/analysis/v07/XlsxSaxAnalyser.java | 46 ++++++++++++++++-- .../v07/handlers/HyperlinkTagHandler.java | 31 ++++++++++-- .../excel/constant/ExcelXmlConstants.java | 5 ++ .../holder/xlsx/XlsxReadSheetHolder.java | 8 +++ .../holder/xlsx/XlsxReadWorkbookHolder.java | 6 +++ .../test/core/extra/ExtraDataTest.java | 44 ++++++++++++++++- .../resources/extra/extraRelationships.xlsx | Bin 0 -> 8826 bytes pom.xml | 4 +- update.md | 3 ++ 10 files changed, 136 insertions(+), 13 deletions(-) create mode 100644 easyexcel-test/src/test/resources/extra/extraRelationships.xlsx diff --git a/README.md b/README.md index 071815a4..649a114a 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都 com.alibaba easyexcel - 3.1.0 + 3.1.1 poi-ooxml-schemas diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java index 38918fb8..5104b1e3 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import javax.xml.parsers.ParserConfigurationException; @@ -25,17 +26,23 @@ import com.alibaba.excel.metadata.CellExtra; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder; import com.alibaba.excel.util.FileUtils; +import com.alibaba.excel.util.MapUtils; import com.alibaba.excel.util.SheetUtils; import com.alibaba.excel.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackagePartName; +import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; +import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.model.CommentsTable; +import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.usermodel.XSSFComment; import org.apache.poi.xssf.usermodel.XSSFRelation; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; @@ -52,6 +59,20 @@ import org.xml.sax.XMLReader; @Slf4j public class XlsxSaxAnalyser implements ExcelReadExecutor { + /** + * Storage sheet SharedStrings + */ + public static final PackagePartName SHARED_STRINGS_PART_NAME; + + static { + try { + SHARED_STRINGS_PART_NAME = PackagingURIHelper.createPartName("/xl/sharedStrings.xml"); + } catch (InvalidFormatException e) { + log.error("Initialize the XlsxSaxAnalyser failure", e); + throw new ExcelAnalysisException("Initialize the XlsxSaxAnalyser failure", e); + } + } + private final XlsxReadContext xlsxReadContext; private final List sheetList; private final Map sheetMap; @@ -68,11 +89,9 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { OPCPackage pkg = readOpcPackage(xlsxReadWorkbookHolder, decryptedStream); xlsxReadWorkbookHolder.setOpcPackage(pkg); - ArrayList packageParts = pkg.getPartsByContentType(XSSFRelation.SHARED_STRINGS.getContentType()); - - if (!CollectionUtils.isEmpty(packageParts)) { - PackagePart sharedStringsTablePackagePart = packageParts.get(0); - + // Read the Shared information Strings + PackagePart sharedStringsTablePackagePart = pkg.getPart(SHARED_STRINGS_PART_NAME); + if (sharedStringsTablePackagePart != null) { // Specify default cache defaultReadCache(xlsxReadWorkbookHolder, sharedStringsTablePackagePart); @@ -89,6 +108,9 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { sheetList = new ArrayList<>(); sheetMap = new HashMap<>(); commentsTableMap = new HashMap<>(); + Map packageRelationshipCollectionMap = MapUtils.newHashMap(); + xlsxReadWorkbookHolder.setPackageRelationshipCollectionMap(packageRelationshipCollectionMap); + XSSFReader.SheetIterator ite = (XSSFReader.SheetIterator)xssfReader.getSheetsData(); int index = 0; if (!ite.hasNext()) { @@ -104,6 +126,20 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { commentsTableMap.put(index, commentsTable); } } + if (xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.HYPERLINK)) { + PackageRelationshipCollection packageRelationshipCollection = Optional.ofNullable(ite.getSheetPart()) + .map(packagePart -> { + try { + return packagePart.getRelationships(); + } catch (InvalidFormatException e) { + log.warn("Reading the Relationship failed", e); + return null; + } + }).orElse(null); + if (packageRelationshipCollection != null) { + packageRelationshipCollectionMap.put(index, packageRelationshipCollection); + } + } index++; } } diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java index ee0154e7..3f9e2ce7 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/handlers/HyperlinkTagHandler.java @@ -1,5 +1,9 @@ package com.alibaba.excel.analysis.v07.handlers; +import java.util.Optional; + +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; import org.xml.sax.Attributes; import com.alibaba.excel.constant.ExcelXmlConstants; @@ -23,13 +27,32 @@ public class HyperlinkTagHandler extends AbstractXlsxTagHandler { @Override public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) { String ref = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_REF); - String location = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_LOCATION); if (StringUtils.isEmpty(ref)) { return; } - CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.HYPERLINK, location, ref); - xlsxReadContext.readSheetHolder().setCellExtra(cellExtra); - xlsxReadContext.analysisEventProcessor().extra(xlsxReadContext); + // Hyperlink has 2 case: + // case 1,In the 'location' tag + String location = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_LOCATION); + if (location != null) { + CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.HYPERLINK, location, ref); + xlsxReadContext.readSheetHolder().setCellExtra(cellExtra); + xlsxReadContext.analysisEventProcessor().extra(xlsxReadContext); + return; + } + // case 2, In the 'r:id' tag, Then go to 'PackageRelationshipCollection' to get inside + String rId = attributes.getValue(ExcelXmlConstants.ATTRIBUTE_RID); + PackageRelationshipCollection packageRelationshipCollection = xlsxReadContext.xlsxReadSheetHolder() + .getPackageRelationshipCollection(); + if (rId == null || packageRelationshipCollection == null) { + return; + } + Optional.ofNullable(packageRelationshipCollection.getRelationshipByID(rId)) + .map(PackageRelationship::getTargetURI) + .ifPresent(uri -> { + CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.HYPERLINK, uri.toString(), ref); + xlsxReadContext.readSheetHolder().setCellExtra(cellExtra); + xlsxReadContext.analysisEventProcessor().extra(xlsxReadContext); + }); } } diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java b/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java index 38c20050..bfd319a2 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/constant/ExcelXmlConstants.java @@ -49,6 +49,11 @@ public class ExcelXmlConstants { */ public static final String ATTRIBUTE_LOCATION = "location"; + /** + * rId attribute + */ + public static final String ATTRIBUTE_RID = "r:id"; + /** * Cell range split */ diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadSheetHolder.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadSheetHolder.java index f4ed56e7..9fa9182d 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadSheetHolder.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadSheetHolder.java @@ -10,6 +10,7 @@ import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; /** * sheet holder @@ -36,9 +37,16 @@ public class XlsxReadSheetHolder extends ReadSheetHolder { * Formula for current label. */ private StringBuilder tempFormula; + /** + * excel Relationship + */ + private PackageRelationshipCollection packageRelationshipCollection; public XlsxReadSheetHolder(ReadSheet readSheet, ReadWorkbookHolder readWorkbookHolder) { super(readSheet, readWorkbookHolder); this.tagDeque = new LinkedList(); + packageRelationshipCollection + = ((XlsxReadWorkbookHolder)readWorkbookHolder).getPackageRelationshipCollectionMap().get( + readSheet.getSheetNo()); } } diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadWorkbookHolder.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadWorkbookHolder.java index c5d78e0f..fbeaf048 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadWorkbookHolder.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xlsx/XlsxReadWorkbookHolder.java @@ -15,6 +15,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; import org.apache.poi.xssf.model.StylesTable; import org.apache.poi.xssf.usermodel.XSSFCellStyle; @@ -51,6 +52,11 @@ public class XlsxReadWorkbookHolder extends ReadWorkbookHolder { */ private Map dataFormatDataCache; + /** + * excel Relationship, key: sheetNo value: PackageRelationshipCollection + */ + private Map packageRelationshipCollectionMap; + public XlsxReadWorkbookHolder(ReadWorkbook readWorkbook) { super(readWorkbook); this.saxParserFactoryName = readWorkbook.getXlsxSAXParserFactoryName(); diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/extra/ExtraDataTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/extra/ExtraDataTest.java index cf7418d5..4475d83c 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/extra/ExtraDataTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/extra/ExtraDataTest.java @@ -2,6 +2,7 @@ package com.alibaba.easyexcel.test.core.extra; import java.io.File; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -9,10 +10,13 @@ import org.slf4j.LoggerFactory; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.enums.CellExtraTypeEnum; +import com.alibaba.excel.metadata.CellExtra; +import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.fastjson.JSON; /** - * * @author Jiaju Zhuang */ public class ExtraDataTest { @@ -20,10 +24,13 @@ public class ExtraDataTest { private static File file03; private static File file07; + private static File extraRelationships; + @BeforeClass public static void init() { file03 = TestFileUtil.readFile("extra" + File.separator + "extra.xls"); file07 = TestFileUtil.readFile("extra" + File.separator + "extra.xlsx"); + extraRelationships = TestFileUtil.readFile("extra" + File.separator + "extraRelationships.xlsx"); } @Test @@ -36,6 +43,41 @@ public class ExtraDataTest { read(file03); } + @Test + public void t03Read() { + EasyExcel.read(extraRelationships, ExtraData.class, new ReadListener() { + @Override + public void invoke(Object data, AnalysisContext context) { + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + } + + @Override + public void extra(CellExtra extra, AnalysisContext context) { + LOGGER.info("extra data:{}", JSON.toJSONString(extra)); + switch (extra.getType()) { + case HYPERLINK: + if ("222222222".equals(extra.getText())) { + Assert.assertEquals(1, (int)extra.getRowIndex()); + Assert.assertEquals(0, (int)extra.getColumnIndex()); + } else if ("333333333333".equals(extra.getText())) { + Assert.assertEquals(1, (int)extra.getRowIndex()); + Assert.assertEquals(1, (int)extra.getColumnIndex()); + } else { + Assert.fail("Unknown hyperlink!"); + } + break; + default: + } + } + }) + .extraRead(CellExtraTypeEnum.HYPERLINK) + .sheet() + .doRead(); + } + private void read(File file) { EasyExcel.read(file, ExtraData.class, new ExtraDataListener()).extraRead(CellExtraTypeEnum.COMMENT) .extraRead(CellExtraTypeEnum.HYPERLINK).extraRead(CellExtraTypeEnum.MERGE).sheet().doRead(); diff --git a/easyexcel-test/src/test/resources/extra/extraRelationships.xlsx b/easyexcel-test/src/test/resources/extra/extraRelationships.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5784cd8b6766e1fd6a8bc3759080ea2ec3c6ae33 GIT binary patch literal 8826 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 - 3.1.0 + 3.1.1 UTF-8 1.8 true @@ -145,7 +145,7 @@ com.alibaba fastjson - 1.2.78 + 2.0.6 org.springframework.boot diff --git a/update.md b/update.md index f2bb7a64..6944a0ee 100644 --- a/update.md +++ b/update.md @@ -1,3 +1,6 @@ +# 3.1.1 +* 修复部分xlsx无法读取超链接的bug + # 3.1.0 * 支持jdk17,去除cglib&asm依赖,改成重新拷贝一份 [Issue #2240](https://github.com/alibaba/easyexcel/issues/2240) * 升级ehcache 到 3.9.9 ,为了兼容jdk17