眾所周知,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作者,
只能怪自己對它的理解不夠啊。。。