diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ad368e38..7817627a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [fj-doc-mod-poi] element phrase it is not correcly rendered - [fj-doc-freemarker] handling link in asciidoc handler ## [8.13.3] - 2025-04-24 diff --git a/fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/BasicPoiTypeHandler.java b/fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/BasicPoiTypeHandler.java index 562aed948..f67024ecc 100644 --- a/fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/BasicPoiTypeHandler.java +++ b/fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/BasicPoiTypeHandler.java @@ -10,16 +10,9 @@ import java.util.HashSet; import java.util.Iterator; -import org.apache.poi.ss.usermodel.BorderStyle; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.CreationHelper; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.VerticalAlignment; -import org.apache.poi.ss.usermodel.Workbook; +import lombok.Setter; +import org.apache.poi.common.usermodel.HyperlinkType; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.fugerit.java.core.function.SafeFunction; import org.fugerit.java.core.lang.helpers.BooleanUtils; @@ -28,13 +21,7 @@ import org.fugerit.java.doc.base.config.DocInput; import org.fugerit.java.doc.base.config.DocOutput; import org.fugerit.java.doc.base.config.DocTypeHandlerDefault; -import org.fugerit.java.doc.base.model.DocBase; -import org.fugerit.java.doc.base.model.DocBorders; -import org.fugerit.java.doc.base.model.DocCell; -import org.fugerit.java.doc.base.model.DocElement; -import org.fugerit.java.doc.base.model.DocPara; -import org.fugerit.java.doc.base.model.DocRow; -import org.fugerit.java.doc.base.model.DocTable; +import org.fugerit.java.doc.base.model.*; import org.fugerit.java.doc.base.typehelper.excel.ExcelHelperConsts; import org.fugerit.java.doc.base.typehelper.excel.ExcelHelperUtils; import org.fugerit.java.doc.base.typehelper.excel.TableMatrix; @@ -188,35 +175,61 @@ private void checkFormat( WorkbookDataWrapper wrapper, Collection styleSet , int rn, int cn, Row currentRow ) throws Exception { TableMatrix matrix = wrapper.getTableMatrix(); Workbook workbook = wrapper.getWorkbook(); - String type = null; - String format = null; DocCell cell = matrix.getCell( rn, cn ); DocCell parent = matrix.getParent( rn, cn ); - String text = ""; - DocPara currentePara = null; + CellHolder holder = new CellHolder(); if ( cell != null ) { - Iterator it1 = cell.docElements(); - DocElement current = it1.next(); - if ( current instanceof DocPara ) { - currentePara = ((DocPara)current); - text = currentePara.getText(); - type = currentePara.getType(); - format = currentePara.getFormat(); - } else { - text = String.valueOf( current ); - currentePara = null; - } - } else { - currentePara = null; + this.handleElement( holder, cell ); } Cell currentCell = currentRow.getCell( cn ); if ( currentCell == null ) { currentCell = currentRow.createCell( cn ); } + this.handleHyperLink( holder.getLink(), workbook, currentCell ); if ( cell != null && parent != null && !ignoreFormat ) { - this.checkFormat( wrapper, styleSet, currentePara, cell, rn, cn, currentCell ); + this.checkFormat( wrapper, styleSet, holder.getCurrentePara(), cell, rn, cn, currentCell ); } - this.setCellValue( workbook, currentCell, type, format, text); + this.setCellValue( workbook, currentCell, holder.getType(), holder.getFormat(), holder.getText()); + } + + private void handleElement( CellHolder holder, DocCell cell ) throws Exception { + Iterator it1 = cell.docElements(); + DocElement current = it1.next(); + if ( current instanceof DocPara ) { + holder.setCurrentePara((DocPara) current); + holder.setText(holder.getCurrentePara().getText()); + holder.setType(holder.getCurrentePara().getType()); + holder.setFormat(holder.getCurrentePara().getFormat()); + } else if ( current instanceof DocPhrase) { + DocPhrase phrase = (DocPhrase) current; + holder.setText(phrase.getText()); + holder.setLink(phrase.getLink()); + holder.setCurrentePara(null); + } else { + holder.setText( String.valueOf( current ) ); + holder.setCurrentePara(null); + } + } + + private class CellHolder { + @Getter @Setter + private String text = ""; + @Getter @Setter + private String link; + @Getter @Setter + private String type; + @Getter @Setter + private String format; + @Getter @Setter + private DocPara currentePara; + } + + private void handleHyperLink( String link, Workbook workbook, Cell currentCell ) { + if ( StringUtils.isNotEmpty(link) ) { + Hyperlink hyperlink = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL); + hyperlink.setAddress( link ); + currentCell.setHyperlink( hyperlink ); + } } private void handleSubmatrix( TableMatrix matrix, boolean ignoreFormat, Sheet sheet, WorkbookHelper helper, HashSet styleSet ) throws Exception { diff --git a/fj-doc-mod-poi/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-mod-poi/reflect-config.json b/fj-doc-mod-poi/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-mod-poi/reflect-config.json index 997fc6a3b..7125ec079 100644 --- a/fj-doc-mod-poi/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-mod-poi/reflect-config.json +++ b/fj-doc-mod-poi/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-mod-poi/reflect-config.json @@ -1,4 +1,37 @@ [ { + "condition" : { + "typeReachable" : "org.fugerit.java.doc.base.facade.DocFacadeSource" + }, + "name" : "org.fugerit.java.doc.mod.poi.BasicPoiTypeHandler$1", + "methods" : [ { + "name" : "equals", + "parameterTypes" : [ "java.lang.Object" ] + }, { + "name" : "getClass", + "parameterTypes" : [ ] + }, { + "name" : "hashCode", + "parameterTypes" : [ ] + }, { + "name" : "notify", + "parameterTypes" : [ ] + }, { + "name" : "notifyAll", + "parameterTypes" : [ ] + }, { + "name" : "toString", + "parameterTypes" : [ ] + }, { + "name" : "wait", + "parameterTypes" : [ ] + }, { + "name" : "wait", + "parameterTypes" : [ "long" ] + }, { + "name" : "wait", + "parameterTypes" : [ "long", "int" ] + } ] +}, { "condition" : { "typeReachable" : "org.fugerit.java.doc.base.facade.DocFacadeSource" }, @@ -79,6 +112,69 @@ "name" : "wait", "parameterTypes" : [ "long", "int" ] } ] +}, { + "condition" : { + "typeReachable" : "org.fugerit.java.doc.base.facade.DocFacadeSource" + }, + "name" : "org.fugerit.java.doc.mod.poi.BasicPoiTypeHandler$CellHolder", + "methods" : [ { + "name" : "equals", + "parameterTypes" : [ "java.lang.Object" ] + }, { + "name" : "getClass", + "parameterTypes" : [ ] + }, { + "name" : "getCurrentePara", + "parameterTypes" : [ ] + }, { + "name" : "getFormat", + "parameterTypes" : [ ] + }, { + "name" : "getLink", + "parameterTypes" : [ ] + }, { + "name" : "getText", + "parameterTypes" : [ ] + }, { + "name" : "getType", + "parameterTypes" : [ ] + }, { + "name" : "hashCode", + "parameterTypes" : [ ] + }, { + "name" : "notify", + "parameterTypes" : [ ] + }, { + "name" : "notifyAll", + "parameterTypes" : [ ] + }, { + "name" : "setCurrentePara", + "parameterTypes" : [ "org.fugerit.java.doc.base.model.DocPara" ] + }, { + "name" : "setFormat", + "parameterTypes" : [ "java.lang.String" ] + }, { + "name" : "setLink", + "parameterTypes" : [ "java.lang.String" ] + }, { + "name" : "setText", + "parameterTypes" : [ "java.lang.String" ] + }, { + "name" : "setType", + "parameterTypes" : [ "java.lang.String" ] + }, { + "name" : "toString", + "parameterTypes" : [ ] + }, { + "name" : "wait", + "parameterTypes" : [ ] + }, { + "name" : "wait", + "parameterTypes" : [ "long" ] + }, { + "name" : "wait", + "parameterTypes" : [ "long", "int" ] + } ] }, { "condition" : { "typeReachable" : "org.fugerit.java.doc.base.facade.DocFacadeSource" diff --git a/fj-doc-mod-poi/src/test/java/test/org/fugerit/java/doc/mod/poi/coverage/TestPoiCoverage.java b/fj-doc-mod-poi/src/test/java/test/org/fugerit/java/doc/mod/poi/coverage/TestPoiCoverage.java index 457676e73..1a98ba30b 100644 --- a/fj-doc-mod-poi/src/test/java/test/org/fugerit/java/doc/mod/poi/coverage/TestPoiCoverage.java +++ b/fj-doc-mod-poi/src/test/java/test/org/fugerit/java/doc/mod/poi/coverage/TestPoiCoverage.java @@ -1,7 +1,6 @@ package test.org.fugerit.java.doc.mod.poi.coverage; -import java.io.ByteArrayOutputStream; -import java.io.InputStreamReader; +import java.io.*; import java.util.Arrays; import org.fugerit.java.core.function.SafeFunction; @@ -43,5 +42,19 @@ void test01() { } ); Assertions.assertTrue( Boolean.TRUE ); } + + @Test + void testDoc() throws Exception { + String fileName = "test_doc"; + DocTypeHandler handler = XlsxPoiTypeHandler.HANDLER; + String inputXml = String.format( "coverage/xml/%s.xml", fileName ); + String outputFile = String.format( "target/%s.%s", fileName, handler.getType() ); + File output = new File( outputFile ); + try ( FileOutputStream fos = new FileOutputStream( output ); + InputStreamReader reader = new InputStreamReader( ClassHelper.loadFromDefaultClassLoader(inputXml) );) { + handler.handle( DocInput.newInput( handler.getType(), reader ), DocOutput.newOutput( fos ) ); + } + Assertions.assertTrue( output.exists() ); + } } diff --git a/fj-doc-mod-poi/src/test/resources/coverage/xml/test_doc.xml b/fj-doc-mod-poi/src/test/resources/coverage/xml/test_doc.xml new file mode 100644 index 000000000..ad6591e93 --- /dev/null +++ b/fj-doc-mod-poi/src/test/resources/coverage/xml/test_doc.xml @@ -0,0 +1,109 @@ + + + + + + 10;10;10;30 + excel-table=print,excel-table-1=print1 + + Basic example + fj doc venus sample source xml + fugerit79 + en + + true + /css/test.css + + header test + + + test + ${r"${currentPage}"} / ${r"${pageCount}"} + test + + + Test + + + + main title h1 + Test times roman + Courier + Symbol + Symbol + Test default font +
+ + + + Name + Surname + Title + + + + + + + + + + + + + + + + + + + + + + + rowspan 2 + colspn 2 + + + colspn 2 + +
+ + + Name + Surname + Title + + + + + + +
+ +
  • test 1
  • +
    + +
  • test 2
  • +
    + +
  • test 3
  • +
    + +
  • test 4
  • +
    + +
  • test 5
  • +
    + +
  • test 6
  • +
    + +
  • test 7
  • +
    + + +
    \ No newline at end of file