1. 程式人生 > >消除datagirdview匯出excel合併行出現合併提示對話方塊

消除datagirdview匯出excel合併行出現合併提示對話方塊

要將事業部匯出excel的時候合併,就得動態的去判斷事業部下的內容,遇到相同的則合併,不相同 的不合並。不能動態寫死(文中加粗處)。 private void ExportExcels(string fileName, Mes.ControlsEx.DataGridViewEx myDGV) { string saveFileName = ""; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls"; saveDialog.Filter = "Excel檔案|*.xls"; saveDialog.FileName = fileName; saveDialog.ShowDialog(); saveFileName = saveDialog.FileName; if (saveFileName.IndexOf(":") < 0) return; //被點了取消 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); //禁止彈出對話方塊 (合併單元格時會提示僅保留左上角的資料) xlApp.DisplayAlerts = false
; if (xlApp == null) { MessageBox.Show("無法建立Excel物件,可能您的主機未安裝Excel"); return; } Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 int colIndex = 0; //寫入標題 for (int i = 0; i < myDGV.ColumnCount; i++) { //僅顯示可見的列 if (myDGV.Columns[i].Visible) { colIndex++; worksheet.Cells[1, colIndex] = myDGV.Columns[i].HeaderText; } } //寫入數值 for (int r = 0; r < myDGV.Rows.Count; r++) { colIndex = 0; for (int i = 0; i < myDGV.ColumnCount; i++) { if (myDGV.Columns[i].Visible) { colIndex++; //從第2行開始寫資料 worksheet.Cells[r + 2, colIndex] = myDGV.Rows[r].Cells[i].Value; } } System.Windows.Forms.Application.DoEvents(); } //合併單元格
int startIdx = -1; int endIdx = -1; string cellValue = string.Empty; for (int i = 0; i < myDGV.Rows.Count; i++) { //如果是第一行 或者 當前行內容不等於上一行 if (i == 0 || !StrUtil.ValueToString(myDGV.Rows[i].Cells[Column1.Index].Value).Equals(StrUtil.ValueToString(myDGV.Rows[i - 1].Cells[Column1.Index].Value))) { startIdx = i;
cellValue = StrUtil.ValueToString(myDGV.Rows[i].Cells[Column1.Index].Value); } //如果是最後一行 或者 當前行與上一行的內容一樣 並且 當前行與下一行的內容不一樣 if (i == myDGV.Rows.Count - 1 || (StrUtil.ValueToString(myDGV.Rows[i].Cells[Column1.Index].Value).Equals(cellValue) && !StrUtil.ValueToString(myDGV.Rows[i].Cells[Column1.Index].Value).Equals(StrUtil.ValueToString(myDGV.Rows[i + 1].Cells[Column1.Index].Value)))) { endIdx = i; MergeHeader(worksheet, "A" + (startIdx + 2), "A" + (endIdx + 2)); } } worksheet.Columns.EntireColumn.AutoFit();//列寬自適應 if (saveFileName != "") { try { workbook.Saved = true; workbook.SaveCopyAs(saveFileName); } catch (Exception ex) { MessageBox.Show("匯出檔案時出錯,檔案可能正被開啟!\n" + ex.Message); } } xlApp.Quit(); GC.Collect();//強行銷燬 MessageBox.Show("檔案: " + fileName + " 儲存成功", "資訊提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } public void MergeHeader(Worksheet worksheet, string startcell, string endcell) { Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(startcell, endcell); range.Merge(0); range.HorizontalAlignment = XlVAlign.xlVAlignCenter; ///字型大小 // range.Font.Size = 18; ///字型 // range.Font.Name = "黑體"; ///行高 range.RowHeight = 20; //自動調整列寬 range.EntireColumn.AutoFit(); //填充顏色 range.Interior.ColorIndex = 20; //設定單元格邊框的粗細 range.Cells.Borders.LineStyle = 1; } 這樣合併是沒問題的,能實現: 但是再儲存的時候會提示如下內容,原因是本來的單元格中有內容,會彈出提示讓你確定是否合併,每合併一個就有一個提示框,這樣的使用者體驗太差了,所以就在網上查資料如何去掉這個對話方塊。 //禁止彈出對話方塊 (合併單元格時會提示僅保留左上角的資料) xlApp.DisplayAlerts = false; 這句程式碼就可實現不彈出提示對話方塊的效果。