NPOI(2.1.3)向excel中插入圖片,xls文檔圖片插入成功,xlsx文檔圖片插入失敗


眾所周知,NPOI對xls和xlsx兩個版本的excel文檔的操作並沒有一個統一的支持,

程序若想兼容這兩個版本的操作,必須根據excel版本分別去調用HSSF和XSSF這兩套操作庫,

之前一直不明白NPOI為什么不能提供一個統一的操作接口,現在我還是不明白,

也正是因為存在這個區別才導致了現在的問題!

插入圖片,代碼非常簡單,

 1 IDrawing patriarch = sheet.CreateDrawingPatriarch();
 2 
 3 //將圖片文件讀入一個字符串
 4             byte[] bytes = System.IO.File.ReadAllBytes(setVal);
 5 
 6             int pictureIdx = sheet.Workbook.AddPicture(bytes, PictureType.JPEG);
 7 
 8             IClientAnchor anchor = null;
 9             IPicture pict = null;
10 
11             int dx1 = 0, dy1 = 0, dx2 = 1023, dy2 = 255;
12             int col1 = colIndex, row1 = rowIndex, col2 = colIndex, row2 = rowIndex;
13             //圖片可能會合並多個單元格,需要計算合並的跨度
14             if (sheet.GetRow(row1).GetCell(col1)!=null&&sheet.GetRow(row1).GetCell(col1).IsMergedCell)
15             {
16                 int rowSpan = 0;
17                 int colSpan = 0;
18                 int regionsCount = sheet.NumMergedRegions;
19                 for (int i = 0; i < regionsCount; i++)
20                 {
21                     CellRangeAddress range = sheet.GetMergedRegion(i);
22                     sheet.IsMergedRegion(range);
23                     if (range.FirstRow == row1 && range.FirstColumn == col1)
24                     {
25                         rowSpan = range.LastRow - range.FirstRow + 1;
26                         colSpan = range.LastColumn - range.FirstColumn + 1;
27                         break;
28                     }
29                 }
30 
31                 col2 = col1 + colSpan - 1;
32                 row2 = row1 + rowSpan - 1;
33             }
34 
35             //anchor = patriarch.CreateAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
36             ////把圖片插到相應的位置
37             //pict = patriarch.CreatePicture(anchor, pictureIdx);
38             if (fileExt == ".xls")
39             {
40                 // 插圖片的位置  HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2) 
41                 anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
42                 //把圖片插到相應的位置
43                 pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
44             }
45             else if (fileExt == ".xlsx")
46             {               
47                 anchor = new XSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
48                 //把圖片插到相應的位置
49                 pict = (XSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);                
50             }

最開始的測試模板文件是一個.xls文檔,圖片插入的目的完美實現,

直到幾天之后,來了另外一個.xlsx文檔,我代碼里面如此明顯的支持了它的做法,想當然的以為妥妥的了吧

一測試,瞬間傻眼了懵逼了,導出的文檔中怎么都找不到圖片!!!

各種修改代碼寫法(主要是關注類型的轉換),調試,沒有任何錯誤和異常,網上搜索了大半天問題,更新最新的NPOI庫,甚至到處發帖求教

最后,在網上找了一個簡單的XSSF的示例,看上去代碼邏輯和我的沒什么區別,翻來覆去不就是那么幾行代碼嗎

唯一的不同,示例中的行列參數(col1, row1, col2, row2)是幾個明明白白的整數值

單手機械的點了運行,打開文檔,嘿~圖片居然出現了!只不過由於給的幾個參數值很隨便,所以圖片的位置也很隨便

這是個從無到有實現0突破的偉大時刻啊!

瞬間來勁兒了,關注點轉向了行列參數值,

經過幾輪不同參數值的調試之后,終於在參數和導出的圖片位置之間看出了端倪,

代碼的修改如下:

1 // 插圖片的位置  HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2) 
2                 //后面四個參數定位行列的時候,參數(,,,,0,14,11,14)在xls文檔中可以正確定位插入圖片,
3                 //但是在xlsx文檔中圖片找不到了,參數改成(,,,,0,14,12,15)才能正確定位畫圖
4                 //MMP,定位標准都不統一,嚴重懷疑NPOI的1.x和2.x版本是兩撥人完成,並且沒有很好的工作交接......
5                 anchor = new XSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2+1, row2+1);

一行代碼我給了四行注釋,多余的話也不想再說了,心累。。。。

 

-------------------------------------

現在慢慢緩過來了,

作為一個給予了廣大程序員相當的方便的一個開源庫,還是得感謝NPOI作者,

只能怪自己對它的理解不夠啊。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM