1. 程式人生 > >C# DataGridView匯出Excel,設定單元格合併,隱藏行

C# DataGridView匯出Excel,設定單元格合併,隱藏行

不得不承認,做程式需要研究。

DataGridView匯出Excel的原始碼

using System.Windows.Forms;
using System.Collections.Generic;
using System;
using Microsoft.Office.Interop.Excel;
public class CommanPrint
{
    /// <summary>
    /// 匯出Excel

    /// </summary>
    /// <param name="mydgv">控制元件 DataGridView </param>
    /// <param name="dic">中英文對照的標題 </param>
    public static void ExportTasks(DataGridView mydgv, Dictionary<string, string> dic)
    {
        // 定義要使用的Excel 元件介面
        // 定義Application 物件,此物件表示整個Excel 程式
        Microsoft.Office.Interop.Excel.Application excelApp = null;
        // 定義Workbook物件,此物件代表工作薄
        Microsoft.Office.Interop.Excel.Workbook workBook;
        // 定義Worksheet 物件,此物件表示Execel 中的一張工作表
        Microsoft.Office.Interop.Excel.Worksheet ws = null;
        //定義Range物件,此物件代表單元格區域
        Microsoft.Office.Interop.Excel.Range range;

       // Microsoft.Office.Interop.Excel.c

        int dcell = 1;
        int rowindex = 0; int colindex = 0;

        int rowcount = mydgv.Rows.Count;
        int colcount = mydgv.Columns.Count;
        int dispcolcount = dic.Count;
        try
        {
            //初始化 Application 物件 excelApp
            excelApp = new Microsoft.Office.Interop.Excel.Application();
            //在工作薄的第一個工作表上建立任務列表
            workBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            ws = (Worksheet)workBook.Worksheets[1];

            // 命名工作表的名稱為
            ws.Name = "Sheet1";
            //建立快取
            Object[,] objdata = new object[rowcount + 2, colcount];
            //建立標題
            foreach (string s in dic.Keys)
            {
                objdata[rowindex, colindex++] = dic[s].ToString();
            }
                //建立快取
            //Object[,] objdata1 = new object[rowcount + 1, colcount];
            //建立標題
            colindex = 0;
            foreach (string s in dic.Keys)
            {
                objdata[1, colindex++] = s;
            }
            //獲取資料
            for (int i = 0; i < rowcount; i++)
            {
                dcell = 0;
                foreach (string ss in dic.Keys)
                {
                    for (int j = 0; j < colcount; j++)
                    {
                        if (mydgv.Columns[j].Name == ss)
                        {
                            objdata[i + 2, dcell++] = mydgv.Rows[i].Cells[j].FormattedValue.ToString(); //得到樣式之後的值
                        }
                    }
                }
            }
            //設定表頭
           
            range = ws.get_Range("A1", "A2");           
            range.Merge(false);
            range.Value2 = "客戶名稱";
            range = ws.get_Range(excelApp.Cells[1, 2], excelApp.Cells[1, 3]);
            range.Merge(true);
            range.Value2 = "合計";
            range.HorizontalAlignment = Constants.xlCenter;
            range = ws.get_Range("D1","D2");
            range.Merge(false);
            range.Value2 = "單位";
            //寫入Excel       
            range = ws.get_Range(excelApp.Cells[3, 1], excelApp.Cells[rowcount+1, dispcolcount]);
            range.Value2 = objdata;        
            System.Windows.Forms.Application.DoEvents();
            //設定格式
            excelApp.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlLeft; //全域性左對齊
            excelApp.Cells.EntireColumn.AutoFit();
            range = ws.get_Range(excelApp.Cells[1, 1], excelApp.Cells[2, colcount]);           
            range.Font.Bold = true; //標題粗體
            //excelApp.Rows[2].Hidden = true;
            range = ws.get_Range(excelApp.Cells[3, 1], excelApp.Cells[3, colcount]);
            range.EntireRow.Hidden = true;
            //range.Merge(true);
            //range.Value2 = "wwww";
            range = ws.get_Range(excelApp.Cells[1, 2], excelApp.Cells[1, 3]);
            range.HorizontalAlignment = Constants.xlCenter;
            //顯示 Excel
            excelApp.Visible = true;
            //range.Hidden = true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

這裡使用的是天山寒雪的原始碼,保留原資訊,並致以感謝。

我從他的原始碼的基礎上加上了關於多表頭的設定和行的隱藏,在多表的設定中需要用到單元格合併。

            range = ws.get_Range("A1", "A2");           
            range.Merge(false);
            range.Value2 = "客戶名稱";

選擇A1和A2兩個單位格,合併,設值。屬於上下合併


            range = ws.get_Range(excelApp.Cells[1, 2], excelApp.Cells[1, 3]);
            range.Merge(true);
            range.Value2 = "合計";

選擇第一行第二個和第一行第三個單元格,合併,賦值,左右合併。

隱藏row

 range = ws.get_Range(excelApp.Cells[3, 1], excelApp.Cells[3, colcount]);
            range.EntireRow.Hidden = true;
選中部分單元格,把選中的單元格所在的行的Hidden屬性設為true。

完成。