Paolo Dell'Aguzzo
  • Chi sono
  • Cosa offro
  • Portfolio e Carriera
    • Carriera
    • Portfolio
  • PRESS e Guest Post
  • Contatti
  • Blog
Paolo Dell'Aguzzo
  • Chi sono
  • Cosa offro
  • Portfolio e Carriera
    • Carriera
    • Portfolio
  • PRESS e Guest Post
  • Contatti
  • Blog
Ott 27

Inserire un’immagine con Java Apache POI

  • 27/10/2017
  • Paolo Dell'Aguzzo
  • No Comments
  • Java
  • apache poi, excel, immagini, java

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:

Development Category (English)728x90

  • 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:

Deep Learning Specialization on Coursera
<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:

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!).

Commenti

Condividi:

  • Fai clic qui per condividere su Twitter (Si apre in una nuova finestra)
  • Fai clic per condividere su Facebook (Si apre in una nuova finestra)
  • Fai clic qui per condividere su Tumblr (Si apre in una nuova finestra)
  • Fai clic qui per condividere su LinkedIn (Si apre in una nuova finestra)
  • Fai clic qui per condividere su Pinterest (Si apre in una nuova finestra)
  • Fai clic per condividere su WhatsApp (Si apre in una nuova finestra)
  • Fai clic per condividere su Telegram (Si apre in una nuova finestra)
  • Clicca per condividere su Skype (Si apre in una nuova finestra)
  • Fai clic qui per stampare (Si apre in una nuova finestra)

Correlati

  • Facebook
  • Twitter
  • Tumblr
  • Pinterest
  • Google+
  • LinkedIn
  • E-Mail
Paolo Dell'Aguzzo

About The Author

Sono sempre stato affascinato dal marketing e dall'informatica a tal punto di unire le due passioni :) Se ti piace l'articolo fammelo sapere in un commento :)

Related Posts

    Fammi sapere cosa ne pensi :) Annulla risposta

    Impara ReactJS imparare react
    I 10 + 1 Libri che Dovrebbe Leggere Ogni Programmatore libri programmatore
    Newsletter

    Seguimi su Facebook :)

    Facebook Pagelike Widget
    Impara React Native imparare react native
    10 Cose per Stare Più Comodo in Ufficio stare più comodo in ufficio
    Impara a Creare un Tema Wordpress imparare creare tema wordpress
    Udemy I Migliori Corsi per Programmatori udemy corsi programmatori
    UX: Perché la User Experience è Importante UX importante e cos'è
    Metodologie Agili e Lean: Come migliorare la tua azienda metodologie agili
    Libri per Imparare JavaScript Imparare JavaScript libri

    Articoli recenti

    • I principali engine utilizzati per lo sviluppo di videogiochi
    • Dalla visione alla realtà: Lo sviluppo di videogiochi dal punto di vista di un programmatore
    • 8 consigli per migliorare la tua SEO Locale

    Categorie

    • CSS
    • Interviste
    • Java
    • Lavoro
    • Normative
    • Personale
    • Programmazione
    • Strategia & Marketing
    • Tech
    • Web Design
    • Wordpress
    Paolo Dell'Aguzzo
    Programmatore Software - Marotta di Mondolfo, Pesaro e Urbino
    P. IVA: IT02758450429
    Mail: info@paolodellaguzzo.com
    Via Litoranea, 284/C - Marotta (PU)
    Privacy Policy
    Cookie Policy
    In qualità di Affiliato Amazon, ricevo un guadagno per ciascun acquisto idoneo
    Amazon e il logo Amazon sono marchi registrati di Amazon.com, Inc. o delle sue affiliate
    Programmatore Senigallia, Ancona - Siti web, app iOS e Android, gestionali ReactJS, React Native, Java, SQL, PL/SQL, Heroku

     

    Caricamento commenti...