From bd5858e1823cc4beb527399fd478253f6a70f815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimi=CC=81r=20Orany=CC=81?= Date: Thu, 22 Oct 2015 14:38:08 +0200 Subject: [PATCH] ability to add image, fixes #7 --- build.gradle | 2 +- docs/index.adoc | 24 +++++++++ .../builder/spreadsheet/api/AbstractCell.java | 4 ++ .../builder/spreadsheet/api/Cell.java | 8 ++- .../builder/spreadsheet/api/ImageCreator.java | 11 +++++ .../builder/spreadsheet/api/ImageKeyword.java | 5 ++ .../builder/spreadsheet/poi/PoiCell.groovy | 37 ++++++++++++++ .../spreadsheet/poi/PoiImageCreator.groovy | 49 +++++++++++++++++++ .../poi/PoiExcelBuilderSpec.groovy | 8 +++ 9 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageCreator.java create mode 100644 spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageKeyword.java create mode 100644 spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiImageCreator.groovy diff --git a/build.gradle b/build.gradle index 13a09e02..d550c8e8 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { id 'org.asciidoctor.gradle.asciidoctor' version '1.5.1' } -String currentVersion = '0.1.10' +String currentVersion = '0.1.11' version = currentVersion diff --git a/docs/index.adoc b/docs/index.adoc index d4434707..e8324cc8 100644 --- a/docs/index.adoc +++ b/docs/index.adoc @@ -275,6 +275,30 @@ _Result_ image:spans.png[] +=== Images +You can insert an image calling one of `png`, `jpeg`, `emf`, `wmf`, `pict`, `dib` method inside the cell definition. + +[source,groovy] +---- +cell ('C') { + png image from 'https://goo.gl/UcL1wy' +} +---- + +_Result_ + +image:image.png[] + +The source of the image can be String which either translates to URL if it starts with `https://` or `http://` or +a file path otherwise. For advanced usage it can be also byte array or any `InputStream`. + +[WARNING] +==== +Resizing images with API is not reliable so you need to resize your image properly before inserting into the spreadsheet. +==== + + + === Comments You can set comment of any cell using the `comment` method. Use the variant accepting closure If you want to specify the author of the comment as well. The author only appears in the status bar of the application. diff --git a/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/AbstractCell.java b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/AbstractCell.java index e4ec021e..7fa49caa 100644 --- a/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/AbstractCell.java +++ b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/AbstractCell.java @@ -11,4 +11,8 @@ public ToKeyword getTo() { return ToKeyword.TO; } + public ImageKeyword getImage() { + return ImageKeyword.IMAGE; + } + } diff --git a/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/Cell.java b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/Cell.java index 934b61d3..c68652bc 100644 --- a/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/Cell.java +++ b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/Cell.java @@ -69,7 +69,13 @@ public interface Cell extends HasStyle { */ void text(String text, @DelegatesTo(Font.class) @ClosureParams(value=FromString.class, options = "org.modelcatalogue.builder.spreadsheet.api.Font") Closure fontConfiguration); + ImageCreator png(ImageKeyword image); + ImageCreator jpeg(ImageKeyword image); + ImageCreator pict(ImageKeyword image); + ImageCreator emf(ImageKeyword image); + ImageCreator wmf(ImageKeyword image); + ImageCreator dib(ImageKeyword image); - + ImageKeyword getImage(); } diff --git a/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageCreator.java b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageCreator.java new file mode 100644 index 00000000..5f72e2f8 --- /dev/null +++ b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageCreator.java @@ -0,0 +1,11 @@ +package org.modelcatalogue.builder.spreadsheet.api; + +import java.io.InputStream; + +public interface ImageCreator { + + void from(String fileOrUrl); + void from(InputStream stream); + void from(byte[] imageData); + +} diff --git a/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageKeyword.java b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageKeyword.java new file mode 100644 index 00000000..6ac2f397 --- /dev/null +++ b/spreadsheet-builder-api/src/main/java/org/modelcatalogue/builder/spreadsheet/api/ImageKeyword.java @@ -0,0 +1,5 @@ +package org.modelcatalogue.builder.spreadsheet.api; + +public enum ImageKeyword { + IMAGE +} diff --git a/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiCell.groovy b/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiCell.groovy index 6463d702..2b790dcb 100644 --- a/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiCell.groovy +++ b/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiCell.groovy @@ -3,6 +3,7 @@ package org.modelcatalogue.builder.spreadsheet.poi import groovy.transform.stc.ClosureParams import groovy.transform.stc.FromString import org.apache.poi.ss.usermodel.Cell +import org.apache.poi.ss.usermodel.Workbook import org.apache.poi.xssf.usermodel.XSSFCell import org.apache.poi.xssf.usermodel.XSSFName import org.apache.poi.xssf.usermodel.XSSFRichTextString @@ -12,6 +13,8 @@ import org.modelcatalogue.builder.spreadsheet.api.AutoKeyword import org.modelcatalogue.builder.spreadsheet.api.CellStyle import org.modelcatalogue.builder.spreadsheet.api.Comment import org.modelcatalogue.builder.spreadsheet.api.Font +import org.modelcatalogue.builder.spreadsheet.api.ImageCreator +import org.modelcatalogue.builder.spreadsheet.api.ImageKeyword import org.modelcatalogue.builder.spreadsheet.api.LinkDefinition import org.modelcatalogue.builder.spreadsheet.api.ToKeyword @@ -185,6 +188,40 @@ class PoiCell extends AbstractCell implements Resolvable { richTextParts << new RichTextPart(run, font, start, end) } + @Override + ImageCreator png(ImageKeyword image) { + return createImageConfigurer(Workbook.PICTURE_TYPE_PNG) + } + + @Override + ImageCreator jpeg(ImageKeyword image) { + return createImageConfigurer(Workbook.PICTURE_TYPE_JPEG) + } + + @Override + ImageCreator pict(ImageKeyword image) { + return createImageConfigurer(Workbook.PICTURE_TYPE_JPEG) + } + + @Override + ImageCreator emf(ImageKeyword image) { + return createImageConfigurer(Workbook.PICTURE_TYPE_EMF) + } + + @Override + ImageCreator wmf(ImageKeyword image) { + return createImageConfigurer(Workbook.PICTURE_TYPE_WMF) + } + + @Override + ImageCreator dib(ImageKeyword image) { + return createImageConfigurer(Workbook.PICTURE_TYPE_DIB) + } + + protected ImageCreator createImageConfigurer(int fileType) { + return new PoiImageCreator(this, fileType) + } + protected int getColspan() { return colspan } diff --git a/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiImageCreator.groovy b/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiImageCreator.groovy new file mode 100644 index 00000000..48abd967 --- /dev/null +++ b/spreadsheet-builder-poi/src/main/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiImageCreator.groovy @@ -0,0 +1,49 @@ +package org.modelcatalogue.builder.spreadsheet.poi + +import org.apache.poi.ss.usermodel.ClientAnchor +import org.apache.poi.ss.usermodel.CreationHelper +import org.apache.poi.ss.usermodel.Drawing +import org.apache.poi.ss.usermodel.Picture +import org.modelcatalogue.builder.spreadsheet.api.ImageCreator + +class PoiImageCreator implements ImageCreator { + + private final PoiCell cell + private final int type + + PoiImageCreator(PoiCell poiCell, int type) { + this.cell = poiCell + this.type = type + } + + @Override + void from(String fileOrUrl) { + if (fileOrUrl.startsWith('https://') || fileOrUrl.startsWith('http://')) { + from new URL(fileOrUrl).newInputStream() + return + } + from new FileInputStream(new File(fileOrUrl)) + } + + @Override + void from(InputStream stream) { + addPicture(cell.row.sheet.sheet.workbook.addPicture(stream, type)) + } + + @Override + void from(byte[] imageData) { + addPicture(cell.row.sheet.sheet.workbook.addPicture(imageData, type)) + } + + void addPicture(int pictureIdx) { + Drawing drawing = cell.row.sheet.sheet.createDrawingPatriarch(); + + CreationHelper helper = cell.row.sheet.sheet.workbook.getCreationHelper(); + ClientAnchor anchor = helper.createClientAnchor(); + anchor.setCol1(cell.cell.columnIndex) + anchor.setRow1(cell.cell.rowIndex) + + Picture pict = drawing.createPicture(anchor, pictureIdx); + pict.resize(); + } +} diff --git a/spreadsheet-builder-poi/src/test/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiExcelBuilderSpec.groovy b/spreadsheet-builder-poi/src/test/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiExcelBuilderSpec.groovy index 227bb426..fd8b7585 100644 --- a/spreadsheet-builder-poi/src/test/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiExcelBuilderSpec.groovy +++ b/spreadsheet-builder-poi/src/test/groovy/org/modelcatalogue/builder/spreadsheet/poi/PoiExcelBuilderSpec.groovy @@ -90,6 +90,14 @@ class PoiExcelBuilderSpec extends Specification { } } + sheet('Image') { + row (3) { + cell ('C') { + png image from 'https://goo.gl/UcL1wy' + } + } + } + sheet('Rich Text') { row { cell {