分享

C#实现将 DataGridView 中数据导出到 Excel 或 Xml 的通用类

 貌似小白 2013-05-21

using System;   

using System.IO;   

using System.Collections.Generic;   

using System.Text;   

using System.Data;   

using System.Drawing;   

using System.Windows.Forms;   

namespace eCityboySoft.Common   

{   

///   

/// 标题:将 DataGridView 导出到 Excel 或 Xml 通用类   

/// 作者:宜城小子(http://blog.)   

/// 日期:2010-03-21   

/// 描述:导出时可以指定需要导出的 DataGridViewColumn 及自定义导出后的列名   

///   

class ExportHelper   

{   

private object missing = Type.Missing;  

#region " DataGridViewToExcel "   

///   

/// 将 DataGridView 保存为 Excel   

///   

/// DataGridView 对象   

/// 保存的文件路径   

public void DataGridViewToExcel(DataGridView dataGridView, String filePath)   

{   

DataGridViewToExcel(new DataGridViewExportOptions(dataGridView), filePath);   

}   

///   

/// 将 DataGridView 保存为 Excel   

///   

/// DataGridViewExportOptions 对象   

/// 保存的文件路径   

public void DataGridViewToExcel(DataGridViewExportOptions dataGridViewExportOption, String filePath)   

{   

DataGridViewToExcel(new List(new DataGridViewExportOptions[] { dataGridViewExportOption }), filePath);   

}   

///   

/// 将 DataGridView 保存为 Excel   

///   

/// DataGridViewExportOptions 对象列表   

/// 保存的文件路径   

public void DataGridViewToExcel(List dataGridViewExportOptions, String filePath)   

{   

if (dataGridViewExportOptions == null || dataGridViewExportOptions.Count == 0) return;  

#region " 判断文件是否存在,存在则删除原有文件 "   

try  

{   

if (File.Exists(filePath)) File.Delete(filePath);   

}   

catch  

{   

return;   

}  

#endregion   

Excel.Application application = new Excel.Application();   

application.Visible = false;   

application.UserControl = false;   

Excel.Workbook workBook = (Excel.Workbook)(application.Workbooks.Add(missing));  

#region " 根据需要导出的 DataGridView 数量,预先增加不足的工作表或移除多余的工作表 "   

// 移除多余的工作表   

while (application.ActiveWorkbook.Sheets.Count > dataGridViewExportOptions.Count)   

((Excel.Worksheet)application.ActiveWorkbook.Sheets[1]).Delete();   

// 添加工作表   

while (application.ActiveWorkbook.Sheets.Count < dataGridViewExportOptions.Count)   

application.Worksheets.Add(missing, missing, missing, missing);  

#endregion   

int sheetIndex = 1;   

List sheetNames = new List();   

try  

{   

foreach (DataGridViewExportOptions option in dataGridViewExportOptions)   

{  

#region " 处理在多个 DataGridView 设置为相同的工作表名称的问题 "   

if (sheetNames.Contains(option.WorkSheetName))   

{   

int i = 1;   

while (true)   

{   

string newSheetName = option.WorkSheetName + i.ToString();   

if (!sheetNames.Contains(newSheetName))   

{   

sheetNames.Add(newSheetName);   

option.WorkSheetName = newSheetName;   

break;   

}   

i++;   

}   

}   

else  

{   

sheetNames.Add(option.WorkSheetName);   

}  

#endregion   

ExportToExcel(application, workBook, (Excel.Worksheet)application.ActiveWorkbook.Sheets[sheetIndex], option);   

sheetIndex++;   

}   

workBook.SaveAs(filePath, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);   

}   

finally  

{   

application.Quit();   

System.Runtime.InteropServices.Marshal.ReleaseComObject(application);   

GC.Collect();   

}   

}  

#endregion  

#region " DataGridViewToXml "   

public void DataGridViewToXml(DataGridView dataGridView, String filePath)   

{   

DataGridViewToXml(new DataGridViewExportOptions(dataGridView), filePath);   

}   

public void DataGridViewToXml(DataGridViewExportOptions dataGridViewExportOption, String filePath)   

{   

DataGridViewToXml(new List(new DataGridViewExportOptions[] { dataGridViewExportOption }), filePath);   

}   

public void DataGridViewToXml(List dataGridViewExportOptions, String filePath)   

{   

if (dataGridViewExportOptions == null || dataGridViewExportOptions.Count == 0) return;   

DataSet dataSet = new DataSet();   

int sheetIndex = 1;   

List sheetNames = new List();   

try  

{   

foreach (DataGridViewExportOptions option in dataGridViewExportOptions)   

{  

#region " 处理在多个 DataGridView 设置为相同的表名称的问题 "   

if (sheetNames.Contains(option.WorkSheetName))   

{   

int i = 1;   

while (true)   

{   

string newSheetName = option.WorkSheetName + i.ToString();   

if (!sheetNames.Contains(newSheetName))   

{   

sheetNames.Add(newSheetName);   

option.WorkSheetName = newSheetName;   

break;   

}   

i++;   

}   

}   

else  

{   

sheetNames.Add(option.WorkSheetName);   

}   

DataGridViewFillToDataSet(dataSet, option);   

sheetIndex++;  

#endregion   

}   

ExportToXml(dataSet, filePath);   

}   

finally  

{   

dataSet.Dispose();   

GC.Collect();   

}   

}   

// 处理 DataGridView 中的数据以填充到指定的 DataSet 中   

private void DataGridViewFillToDataSet(DataSet dataSet, DataGridViewExportOptions Option)   

{   

DataTable Table = new DataTable();   

Table.TableName = Option.WorkSheetName;   

if (Option.DataGridView == null) return;  

#region " 填充表头内容 "   

foreach (DataColumnExportOptions option in Option.VisibleColumnOptions)   

{   

if (!option.Visible) continue;   

Table.Columns.Add(new DataColumn(option.ColumnName));   

}  

#endregion  

#region " 填充表格正文内容 "   

foreach (DataGridViewRow dataRow in Option.DataGridView.Rows)   

{   

if (dataRow.IsNewRow) continue;   

DataRow Row = Table.NewRow();   

foreach (DataColumnExportOptions option in Option.VisibleColumnOptions)   

{   

if (dataRow.Cells[option.ColumnName].Value == null)   

{   

Row[option.ColumnName] = "";   

}   

else  

{   

Row[option.ColumnName] = dataRow.Cells[option.ColumnName].Value.ToString();   

}   

}   

Table.Rows.Add(Row);   

}  

#endregion   

dataSet.Tables.Add(Table);   

}  

#endregion  

#region " ExportToXml "   

///   

/// 保存 DataSet 数据到 Xml 文件   

///   

/// DataSet数据对象   

/// Xml 文件地址   

private void ExportToXml(DataSet dataSet, String filePath)   

{  

#region " 判断文件是否存在,存在则删除原有文件 "   

try  

{   

if (File.Exists(filePath)) File.Delete(filePath);   

}   

catch  

{   

return;   

}  

#endregion   

dataSet.WriteXml(filePath);   

}  

#endregion  

#region " ExportToExcel "   

private void ExportToExcel(Excel.Application application, Excel._Workbook workBook, Excel.Worksheet worksheet, DataGridViewExportOptions Option)   

{   

Excel.Range range;   

worksheet.Name = Option.WorkSheetName;   

if (Option.DataGridView == null) return;   

int _RowCount = Option.DataGridView.AllowUserToAddRows ? Option.DataGridView.Rows.Count - 1 : Option.DataGridView.Rows.Count;   

int _CellCount = Option.VisibleColumnOptions.Count;   

int _CellIndex = 0;   

int _RowIndex = 0;  

#region " 填充表头内容 "   

object[,] _HeadValues = new object[1, _CellCount];   

foreach (DataColumnExportOptions option in Option.VisibleColumnOptions)   

{   

if (!option.Visible) continue;   

_HeadValues[0, _CellIndex] = option.Caption;   

_CellIndex++;   

}   

range = worksheet.get_Range(GetExcelCellName(1, 1), GetExcelCellName(_CellCount, 1));   

range.Value2 = _HeadValues;  

#endregion  

#region " 设置表头样式 "   

range.Font.Bold = true;   

range.Font.Name = "Georgia";   

range.Font.Size = 10;   

range.RowHeight = 26;   

range.EntireColumn.AutoFit();  

#endregion  

#region " 填充表格正文内容 "   

object[,] _RowValues = new object[_RowCount, _CellCount];   

_RowIndex = 0;   

foreach (DataGridViewRow dataRow in Option.DataGridView.Rows)   

{   

if (dataRow.IsNewRow) continue;   

_CellIndex = 0;   

foreach (DataColumnExportOptions option in Option.VisibleColumnOptions)   

{   

_RowValues[_RowIndex, _CellIndex] = dataRow.Cells[option.ColumnName].Value;   

_CellIndex++;   

}   

_RowIndex++;   

}   

range = worksheet.get_Range(GetExcelCellName(1, 2), GetExcelCellName(_CellCount, _RowCount + 1));   

range.Value2 = _RowValues;  

#endregion  

#region " 设置表格正文样式 "   

range.Font.Name = "Georgia";   

range.Font.Size = 9;   

range.RowHeight = 18;   

range.EntireColumn.AutoFit();  

#endregion  

#region " 设置单元格边框样式 "   

range = worksheet.get_Range(GetExcelCellName(1, 1), GetExcelCellName(_CellCount, _RowCount + 1));   

range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;   

range.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;   

range.Borders.Weight = Excel.XlBorderWeight.xlThin;   

range.Borders.Color = Color.Black.ToArgb();  

#endregion   

}  

#endregion  

#region " GetExcelCellName "   

///   

/// 取得Excel单元格编号   

///   

///   

///   

/// A1,A2,B3,...,AB10,...  

private string GetExcelCellName(int cellIndex, int rowIndex)   

{   

if (cellIndex <= 0 || cellIndex > 256)   

{   

throw new Exception("Excel 列索引数值超出范围(1-256)!");   

}   

else if (cellIndex <= 26)   

{   

return GetExcelCellName(cellIndex) + rowIndex.ToString();   

}   

else  

{   

string retLetter = GetExcelCellName(cellIndex / 26);   

retLetter += GetExcelCellName(cellIndex % 26);   

retLetter += rowIndex.ToString();   

return retLetter;   

}   

}   

///   

/// 取得Excel单元格列编号   

///   

///   

/// A,B,...,AC,...  

private string GetExcelCellName(int cellIndex)   

{   

int i = 1;   

foreach (string letter in Enum.GetNames(typeof(ExcelColumnLetters)))   

{   

if (i == cellIndex)   

return letter;   

i++;   

}   

throw new Exception("Excel 列索引数值超出范围(1-256)!");   

}  

#endregion   

}  

#region " ExcelColumnLetters "   

enum ExcelColumnLetters   

{   

A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 10,   

K = 11, L = 12, M = 13, N = 14, O = 15, P = 16, Q = 17, R = 18, S = 19, T = 20,   

U = 21, V = 22, W = 23, X = 24, Y = 25, Z = 26   

}  

#endregion  

#region " DataColumnExportOptions "   

///   

/// 导出数据字段属性选项类   

///   

class DataColumnExportOptions   

{   

private String _ColumnName;   

private String _Caption;   

private Boolean _Visible;   

///   

/// 字段名称   

///   

public String ColumnName   

{   

get { return _ColumnName; }   

set { _ColumnName = value; }   

}   

///   

/// 字段标题   

///   

public String Caption   

{   

get { return _Caption; }   

set { _Caption = value; }   

}   

///   

/// 是否显示(导出)   

///   

public Boolean Visible   

{   

get { return _Visible; }   

set { _Visible = value; }   

}   

///   

/// 构造函数   

///   

/// 字段名称   

public DataColumnExportOptions(String columnName)   

: this(columnName, columnName)   

{   

}   

///   

/// 构造函数   

///   

/// 字段名称   

/// 字段标题   

public DataColumnExportOptions(String columnName, String caption)   

: this(columnName, caption, true)   

{   

}   

///   

/// 构造函数   

///   

/// 字段名称   

/// 字段标题   

/// 是否显示(导出)   

public DataColumnExportOptions(String columnName, String caption, Boolean visible)   

{   

this._ColumnName = columnName;   

this._Caption = caption;   

this._Visible = visible;   

}   

}  

#endregion  

#region " DataGridViewExportOptions “   

class DataGridViewExportOptions   

{   

private DataGridView _DataGridView;   

private List _ColumnOptions;   

private List _VisibleColumnOptions;   

private String _WorkSheetName;   

///   

/// 要导出到DataGridView对象   

///   

public DataGridView DataGridView   

{   

get { return _DataGridView; }   

set { _DataGridView = value; }   

}   

///   

/// 导出的字段属性列表   

///   

public List ColumnOptions   

{   

get { return _ColumnOptions; }   

set { _ColumnOptions = value; }   

}   

///   

/// 要导出的字段列表(只读)   

///   

public List VisibleColumnOptions   

{   

get { return _VisibleColumnOptions; }   

}   

///   

/// 导出的工作表名称   

///   

public String WorkSheetName   

{   

get { return _WorkSheetName; }   

set { _WorkSheetName = value; }   

}   

///   

/// 构造函数   

///   

/// 要导出到DataGridView对象   

public DataGridViewExportOptions(DataGridView dataGridView)   

: this(dataGridView, null)   

{ }   

///   

/// 构造函数   

///   

/// 要导出到DataGridView对象   

/// 导出的字段属性列表   

public DataGridViewExportOptions(DataGridView dataGridView, List columnOptions)   

: this(dataGridView, columnOptions, null) { }   

///   

/// 构造函数   

///   

/// 要导出到DataGridView对象   

/// 导出的字段属性列表   

/// 导出生成的工作表名称   

public DataGridViewExportOptions(DataGridView dataGridView, List columnOptions, String workSheetName)   

{   

if (dataGridView == null) return;   

this._DataGridView = dataGridView;   

if (columnOptions == null)   

{   

this._ColumnOptions = new List();   

foreach (DataGridViewColumn dataColumn in dataGridView.Columns)   

this._ColumnOptions.Add(new DataColumnExportOptions(dataColumn.Name, dataColumn.HeaderText, dataColumn.Visible));   

}   

else  

{   

this._ColumnOptions = columnOptions;   

}   

if (String.IsNullOrEmpty(workSheetName))   

this._WorkSheetName = dataGridView.Name;   

else  

this._WorkSheetName = workSheetName;   

this._VisibleColumnOptions = new List();   

foreach (DataColumnExportOptions option in this._ColumnOptions)   

{   

if (option.Visible)   

this._VisibleColumnOptions.Add(option);   

}   

}   

}  

#endregion   

}  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多