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。
完成。