最近用devexpress做excel export,发现devexpress对cell merge的case支持不是很好,没办法,只要调用excel api自己去做merge了。devexpress的mege就是对某列按顺序对相同的值进行merge。写了一个方法,对导出的excel进行merge,如下:
1 private void mergeCell2( string fileName, int rowNumber, List< int> columnIndex) 2 { 3 Microsoft.Office.Interop.Excel.Application _excelApp = new Microsoft.Office.Interop.Excel.Application(); 4 5 try 6 { 7 _excelApp.DisplayAlerts = false; 8 _excelApp.ScreenUpdating = true; 9 10 11 Workbook workBook = _excelApp.Workbooks.Open(fileName, 12 XlUpdateLinks.xlUpdateLinksAlways, Type.Missing, Type.Missing, Type.Missing, 13 Type.Missing, Type.Missing, Type.Missing, Type.Missing, 14 Type.Missing, Type.Missing, Type.Missing, Type.Missing, 15 Type.Missing, Type.Missing); 16 17 Worksheet sheet1 = workBook.Worksheets[ 1] as Worksheet; 18 19 for ( int loopClmIndx = 0; loopClmIndx < columnIndex.Count; loopClmIndx++) 20 { 21 char columnName = Convert.ToChar(Convert.ToInt32( ' A ') + columnIndex[loopClmIndx]); 22 23 Range c1 = sheet1.get_Range( string.Format( " {0}{1} ", columnName, 2), 24 string.Format( " {0}{1} ", columnName, rowNumber + 1)); 25 26 object[,] vv = c1.Cells.Value2 as object[,]; 27 if (vv != null) 28 { 29 int mergeStartIndx = - 1; 30 31 for ( int rowIndx = 1; rowIndx <= vv.Length;rowIndx++) 32 { 33 mergeStartIndx = rowIndx; 34 object tempValue = vv[rowIndx, 1]; 35 string strTempValue = tempValue == null ? string.Empty : tempValue.ToString(); 36 37 while (rowIndx < vv.Length) 38 { 39 object tempNextValue = vv[rowIndx + 1, 1]; 40 string strTempNextValue = tempNextValue == null ? string.Empty : tempNextValue.ToString(); 41 42 if (strTempNextValue.Equals(strTempValue)) 43 { 44 rowIndx++; 45 } 46 else 47 { 48 break; 49 } 50 } 51 52 if (mergeStartIndx != rowIndx) 53 { 54 Range rg = sheet1.get_Range( string.Format( " {0}{1} ", columnName, mergeStartIndx+ 1), 55 string.Format( " {0}{1} ", columnName, rowIndx+ 1)); 56 57 if (rg != null) 58 { 59 rg.Merge( false); 60 } 61 62 Marshal.ReleaseComObject(rg); 63 } 64 } 65 } 66 } 67 68 workBook.Save(); 69 workBook.Close( true, Type.Missing, Type.Missing); 70 71 Marshal.ReleaseComObject(sheet1); 72 Marshal.ReleaseComObject(workBook); 73 } 74 finally 75 { 76 if (_excelApp != null) 77 { 78 _excelApp.Quit(); 79 _excelApp = null; 80 GC.SuppressFinalize( this); 81 } 82 } 83 }
注意,如果excel的cell没有值,没有值的相邻的格子也必须合并。