Hai bisogno di inserire un’immagine con Java Apache POI? In questo articolo ti spiego come fare. L’importante è che segui in ordine questi semplici passaggi.
Come già detto nel precedente articolo, il codice non rispetta i canoni del codice pulito, ma questa sembra la soluzione migliore per favorire il copia/incolla dell’utente e la lettura.
Inserire un’immagine con Java Apache POI
Inserire un’immagine con Apache POI è molto più semplice di quanto si pensi.
E’ necessario inserire all’interno del progetto (io ho creato un progetto Maven) un’immagine e posizionarla nella root del progetto.
Nel mio caso l’immagine la farò creare in Java come nell’esempio visto ieri. Ti consiglio di provarci che tanto ci impieghi 2 secondi 🙂 .
Cosa vogliamo fare
In ordine ho una classe Main che all’interno del metodo main andrà a:
- Creare l’immagine (puoi saltare questo step!)
- Creare un Workbook con uno sheet ed una cella
- Leggere l’immagine ed inserirla nel workbook
- Scrivere il file in formato .xls
Creare un’immagine con Java
Per quanto riguarda questo ti rimando direttamente all’articolo visto ieri: Creare Immagini con Java.
Creare un Workbook con uno Sheet ed una Cella
Per poter inserire un’immagine con Java Apache POI è necessario creare un workbook ed uno sheet.
Per prima cosa aggiungi le dipendenze ad Apache POI nel pom.xml:
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> </dependencies>
A questo punto siamo pronti per utilizzare Apache POI.
Crea una classe WorkbookHelper ed al suo interno inserisci questo metodo:
public HSSFWorkbook createWorkbookSheetWithCell(String sheetName, Integer cellValue){ HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(sheetName); HSSFRow row = sheet.createRow(0); HSSFCell testCell = row.createCell(0); testCell.setCellValue(cellValue); return workbook; }
Questo metodo serve per farti vedere come funziona la creazione di un Workbook, di uno Sheet e di una cella.
In ordine:
- Creiamo un Workbook
- Quindi Creiamo uno sheet con nome preso dai parametri del metodo
- Creiamo una riga all’indice 0
- Creiamo una cella con indice 0 (quindi la prima colonna del nostro foglio di calcolo)
- Impostiamo come valore della cella il valore che ci arriva come parametro di ingresso
- Ritorniamo il workbook
Leggere l’immagine ed Inserirla nel Workbook
Abbiamo visto velocemente come creare un Workbook con uno Sheet ed una cella. Lo scopo di questo articolo è però rivolto a chi già utilizza Apache POI, quindi arriviamo al dunque.
Vogliamo inserire un’immagine con Java Apache POI. Per farlo creiamo un metodo sempre nella nostra classe WorkbookHelper di questo tipo:
public void readImageAndPutInWorkbook(HSSFWorkbook workbook, String sheetName, String imagePath) throws IOException{ InputStream inputStream = new FileInputStream(imagePath); // Lettura immagine come InputStream byte[] bytes = IOUtils.toByteArray(inputStream); // Trasformiamo l'inputStream in un array di byte int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); //Aggiunta dell'immagine al workbook inputStream.close(); // Chiusura dell'inputStream CreationHelper helper = workbook.getCreationHelper(); //E' un oggetto che gestisce l'istanziazione delle classi ClientAnchor anchor = helper.createClientAnchor(); //Creazione di un'ancora anchor.setCol1(3); //Impostiamo l'ancora. Necessita per forza di col1, row1, col2 e row2 anchor.setRow1(2); //Stiamo creando un punto di appoggio per l'immagine anchor.setCol2(20); //Tale punto di appoggio spazia dalla colonna 3 alla colonna 20 in larghezza anchor.setRow2(19); //E dalla riga 2 alla riga 19 in altezza Drawing<?> drawing = workbook.getSheet(sheetName).createDrawingPatriarch(); //Necessario drawing.createPicture(anchor, pictureIdx); //Leghiamo l'ancora all'id dell'immagine associata prima al workbook }
Quello che avviene in ordine:
- Il metodo prende come parametri un workbook, il nome dello sheet ed il percorso dell’immagine
- Legge l’immagine come InputStream
- Inserisce l’InputStream in un array di byte
- Inserisce l’immagine nel workbook tramite metodo addPicture che ci ritorna l’id dell’immagine
- Chiudiamo lo stream
- Creiamo un oggetto di utilità per la creazione di altri oggetti (CreationHelper)
- Tramite questo helper creiamo un’ancora
- Impostiamo le dimensioni dell’ancora (da colonna X a colonna Y e da riga A fino a riga B)
- Creiamo un oggetto drawing necessario
- Tale oggetto utilizza il metodo createPicture per inserire nello spazio rivolto all’ancora l’immagine associata al workbook
Scrivere il file in formato .xls
Per scrivere un’immagine con Java Apache POI non ci resta che scrivere il file Excel.
Di conseguenza, sempre all’interno della classe WorkbookHelper, andiamo a scrivere questo ultimo metodo:
public void writeOnFile(HSSFWorkbook workbook, String fileName){ try { FileOutputStream outputStream = new FileOutputStream(fileName); workbook.write(outputStream); workbook.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
Il metodo prende in ingresso un workbook ed un nome di file e poi all’interno di un blocco try/catch crea un FileOutputStream nel quale scrivere il workbook.
Il Main
A questo punto vediamo il main:
public static void main(String[] args) throws IOException, InterruptedException { ImageCreator imageCreator = new ImageCreator(); imageCreator.createImage(IMAGE_NAME); //Creiamo l'immagine come già visto WorkbookHelper workbookHelper = new WorkbookHelper(); //Creazione del Workbook con una cella HSSFWorkbook workbook = workbookHelper.createWorkbookSheetWithCell(SHEET_NAME, 123); //Lettura dell'immagine ed inserimento del Workbook workbookHelper.readImageAndPutInWorkbook(workbook, SHEET_NAME, System.getProperty("user.dir") + "/" + IMAGE_NAME); //Scrittura del workbook su file workbookHelper.writeOnFile(workbook, FILE_NAME); }
Quello che accade in ordine:
- Creiamo l’immagine come definito nell’articolo visto precedentemente (se non vuoi fare così ti è sufficiente inserire un’immagine nella root del tuo progetto).
- Chiamiamo il metodo del workbookHelper createWorkbookSheetWithCell passandogli il nome dello sheet (nel mio caso SHEET_NAME è una costante che contiene “Test”) e un valore (io gli passo 123 tanto per fare un esempio).
- Dunque chiamiamo readImageAndPutInWorkbook al quale passiamo il workbook, il nome dello sheet ed il percorso dell’immagine.
NOTA BENE: Ogni volta che un metodo contiene “And” è un chiaro smell di codice non pulito. Come già detto ai fini della lettura e del copia/incolla solo per questo caso ho accettato di scrivere codice in questo modo. - Infine chiamiamo il metodo writeOnFile di workbookHelper. Tale metodo vuole ricevere il workbook e il nome del file (io gli passo una costante che contiene “res.xls”).
Il Risultato Finale
Direi che siamo riusciti ad inserire un’immagine con Java Apache POI:
Conclusioni
Come hai visto inserire un’immagine con Java Apache POI è veramente facile. La mia esigenza è nata dal fatto che capita che i clienti ti chiedano di creare un excel e di allegare immagini, così come capita che hai bisogno di creare un organigramma come questo, ma Apache POI non ti permette di giocare molto con i grafici.
Ti ricordo che se vuoi imparare a creare un organigramma come quello con Java ti basta leggere questo articolo.
Vuoi conoscere altro su Java? Che ne dici di imparare a creare un Bot Telegram?
Se vuoi iscriviti alla newsletter e non ti perderai i nuovi articoli. Mando da 1 a 4 mail al mese ricapitolando dove siamo arrivati con ogni guida. Con la newsletter hai anche accesso a libri ed ebook gratuiti, così come a coupon Udemy ? .
Per dubbi o domande scrivimi nei commenti ? .
Se ti è piaciuto l’articolo seguimi su Facebook e Twitter oppure rimani sempre aggiornato con la newsletter (da 1 a 4 mail al mese!).