做網(wǎng)站需要公司么中國制造網(wǎng)網(wǎng)站類型
前言:
最近在使用easyExcel操作excel文件時,一直想找到一個方法可以往excel中填充附件,但是目前只發(fā)現(xiàn)POI可以插入附件,于是將方法記錄如下:
實現(xiàn):
這個方法主要是使用 Apache POI 的?HSSFWorkbook
?類來創(chuàng)建一個 Excel 文件,并在其中插入了一個作為 OLE (Object Linking and Embedding) 對象的 PDF 文件。同時,它還關(guān)聯(lián)了一個圖片,作為該 PDF 文件的預(yù)覽或圖標。
當你打開生成的 Excel 文件時,你會看到一個圖片,這個圖片實際上是 PDF 文件的預(yù)覽或圖標。當你雙擊這個圖片時,Excel 會嘗試用關(guān)聯(lián)的 PDF 閱讀器打開這個 PDF 文件。這是通過 OLE 對象實現(xiàn)的,OLE 對象允許在 Excel 文件中嵌入其他類型的數(shù)據(jù)或應(yīng)用程序?qū)ο蟆?/p>
public class poiTest {/*** 寫個main方法來做一個測試* @param args*/public static void main(String[] args) throws Exception{Workbook workbook = new HSSFWorkbook();Sheet sheet = workbook.createSheet("Sheet1");File pdfFile = new File("C:\\Users\\Downloads\\test.pdf");FileInputStream fis = new FileInputStream(pdfFile);byte[] pdfBytes = new byte[(int) pdfFile.length()];fis.read(pdfBytes);fis.close();//獲取pdf展示圖標String imagePath = "C:\\Users\\Desktop\\pdfImage.png";BufferedImage image = ImageIO.read(new File(imagePath));ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(image, "png", baos);byte[] imageBytes = baos.toByteArray();baos.close();int iconid = workbook.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_PNG);//將圖片添加進入到Excel文件內(nèi)int pdfIdx = workbook.addOlePackage(pdfBytes, "111.pdf", "C:\\Users\\Downloads\\test.pdf", "cs.pdf");// 在工作表中創(chuàng)建OLE對象// 創(chuàng)建畫布和錨點Drawing<?> drawing = sheet.createDrawingPatriarch();ClientAnchor anchor = drawing.createAnchor(0, 0, 0 ,0, 2, 2, 4, 4);//這里的參數(shù)后續(xù)根據(jù)傳過來的信息來變化。row,col position[4] * Units.EMU_PER_POINTanchor.setAnchorType(HSSFClientAnchor.AnchorType.MOVE_AND_RESIZE);drawing.createObjectData(anchor, pdfIdx, iconid);//設(shè)置縮略圖和文件錨點的關(guān)系// 保存工作簿至文件try (OutputStream outputStream = new FileOutputStream("C:\\Users\\Desktop\\demo.xlsx")) {//excel保存的路徑是自定義的,可以修改成任意路徑workbook.write(outputStream);}workbook.close();}}
當前我用的?HSSFWorkbook
?是用于處理?.xls
?格式(Excel 97-2003)的,如果你要處理?.xlsx
?格式(Excel 2007 及以后版本),你需要使用?XSSFWorkbook
?類。方法主要通過OLE實現(xiàn),下面簡單介紹一下什么是OLE,這樣或許能幫助大家更好地理解這段代碼是如何實現(xiàn)插入附件的。
OLE:
OLE,全稱Object Linking and Embedding,意為“對象鏈接和嵌入”,是一種實現(xiàn)應(yīng)用程序間數(shù)據(jù)共享和交互的技術(shù)。通過OLE,用戶可以在一個應(yīng)用程序中使用另一個應(yīng)用程序的功能和數(shù)據(jù),而無需離開當前應(yīng)用程序。
OLE不僅是桌面應(yīng)用程序集成,而且還定義和實現(xiàn)了一種允許應(yīng)用程序作為軟件“對象”(數(shù)據(jù)集合和操作數(shù)據(jù)的函數(shù))彼此進行“連接”的機制,這種連接機制和協(xié)議稱為組件對象模型(COM)。OLE可以用來創(chuàng)建復(fù)合文檔,這種文檔包含了來自不同源應(yīng)用程序的、具有不同類型的數(shù)據(jù),因此它可以將文字、聲音、圖像、表格、應(yīng)用程序等組合在一起。
最后:
我嘗試將poi和easyExcel結(jié)合使用,在easyExcel填充時調(diào)用自定義的攔截器,在攔截器中操作sheet和cell來實現(xiàn)附件的填充,但是發(fā)現(xiàn)填充的結(jié)果變成一張圖片,而不是文件。
目前還找不到解決的方法,如果有了解這方面的伙伴可以在評論區(qū)給我留言~
參考:
OLE簡介_excel ole是什么-CSDN博客文章瀏覽閱讀5k次,點贊2次,收藏10次。OLE 背景知識OLE 是一種機制,它允許用戶創(chuàng)建和編輯包含由多個應(yīng)用程序創(chuàng)建的項或者“對象”的文檔。注意 OLE 最初是對象鏈接和嵌入 (Object Linking and Embedding) 的首字母縮寫詞,但現(xiàn)在被稱為 OLE。OLE 中與鏈接和嵌入無關(guān)的部分現(xiàn)在已成為 Active 技術(shù)的一部分。OLE 文檔(過去被稱為復(fù)合文檔)無縫地集成了各種類型的數(shù)據(jù)或組件。聲音剪_excel ole是什么https://blog.csdn.net/smilelance/article/details/750971?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-5-750971-blog-2197360.235%5Ev43%5Econtrol&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-5-750971-blog-2197360.235%5Ev43%5Econtrol&utm_relevant_index=6通過poi導(dǎo)出excel的時候?qū)df等文件以O(shè)LE對象的方式嵌入到excel表格之中_addolepackage-CSDN博客文章瀏覽閱讀717次。通過poi導(dǎo)出excel的時候?qū)df等文件以O(shè)LE對象的方式嵌入到excel表格之中,并支持在excel中打開_addolepackage
https://blog.csdn.net/qq_51149179/article/details/131725603?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-5-131725603-blog-136882129.235%5Ev43%5Econtrol&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-5-131725603-blog-136882129.235%5Ev43%5Econtrol&utm_relevant_index=6