1. 程式人生 > >POI實現excell批註背景圖片(仿html浮窗顯示圖片)

POI實現excell批註背景圖片(仿html浮窗顯示圖片)

              公司客戶需要從系統中匯出一些帶圖片的excel報表,因為圖片的大小不固定,所以如果直接放在excel中會導致嚴重變形。公司的客服說以前有個客戶發給她這樣一個excel表格,在excel中顯示小圖片,滑鼠放到小圖片後顯示大圖片,滑鼠移走後大圖片隱藏(類似html頁面的浮窗)。我讓她把這個excel表格發給我看看,但她說找不到了。我當時覺得不太可能,而且還有很多其它工作需要去完成,所以沒有仔細去研究。最近領導有提到了這個問題,所以去網上查了一下,似乎好像可以通過excel的批註功能來實現,但沒有找到具體的例項,如是乎我就去POI官網去檢視API,然後去實踐,最後終於讓我實現了這個功能,下面貼上實踐的例子:

首先從POI官網下載jar包

我下載的是最新的測試版:

然後解壓zip包

新建JAVA工程,然後將所有jar包匯入專案中(為了減少麻煩所以匯入了全部jar包),編寫測試類,程式碼如下:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;

public class TestImage {

	public static void main(String[] args) throws Exception {
		Workbook wb = new HSSFWorkbook(); //or new HSSFWorkbook();

		InputStream is = new FileInputStream("png.png");
	    byte[] bytes = IOUtils.toByteArray(is);
	    //新增一張圖片到Workbook,並返回圖片索引
	    int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
	    is.close();
	    
	    CreationHelper factory = wb.getCreationHelper();

	    Sheet sheet = wb.createSheet();
	    
	    Row row   = sheet.createRow(3);
	    Cell cell = row.createCell(5);
	    cell.setCellValue("F4");

	    Drawing drawing = sheet.createDrawingPatriarch();

	    // When the comment box is visible, have it show in a 1x3 space
	    ClientAnchor anchor = factory.createClientAnchor();
	    //col2-col1的差為anchor物件的列寬
	    anchor.setCol1(cell.getColumnIndex());
	    anchor.setCol2(cell.getColumnIndex()+10);
	    //row2-row1的差為anchor物件的行高
	    anchor.setRow1(row.getRowNum());
	    anchor.setRow2(row.getRowNum()+14);

	    // Create the comment and set the text+author
	    HSSFComment comment = (HSSFComment) drawing.createCellComment(anchor);
	    comment.setBackgroundImage(pictureIdx);
	    comment.setAuthor("Apache POI");

	    // Assign the comment to the cell
	    cell.setCellComment(comment);

	    String fname = "comment-xssf.xls";
	    //if(wb instanceof HSSFWorkbook) fname += "x";
	    FileOutputStream out = new FileOutputStream(fname);
	    wb.write(out);
	    out.close();
	}
}

專案結構:

  上圖中的comment-xssf.xls就是匯出的excel。

功能效果:

相信上面的說明和程式碼已經說的很詳細了,這裡就不在上傳原始碼了。

最後希望這篇文章可以幫助到遇到同樣問題的人。