using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace Config
{
class ExportHelper
{
#region " DataGridViewToXml "
public void DataGridViewToXml(DataGridView dataGridView, String filePath)
{
DataGridViewToXml(new DataGridViewExportOptions(dataGridView), filePath);
}
public void DataGridViewToXml(DataGridViewExportOptions dataGridViewExportOption, String filePath)
{
DataGridViewToXml(new List<DataGridViewExportOptions>(new DataGridViewExportOptions[] { dataGridViewExportOption }), filePath);
}
public void DataGridViewToXml(List<DataGridViewExportOptions> dataGridViewExportOptions, String filePath)
{
if (dataGridViewExportOptions == null || dataGridViewExportOptions.Count == 0) return;
DataSet dataSet = new DataSet("Lists");
int sheetIndex = 1;
List<String> sheetNames = new List<String>();
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 "
/// <summary>
/// 保存 DataSet 数据到 Xml 文件
/// </summary>
/// <param name="dataSet">DataSet数据对象</param>
/// <param name="filePath">Xml 文件地址</param>
private void ExportToXml(DataSet dataSet, String filePath)
{
#region " 判断文件是否存在,存在则删除原有文件 "
try
{
if (File.Exists(filePath)) File.Delete(filePath);
}
catch
{
return;
}
#endregion
dataSet.WriteXml(filePath);
}
#endregion
#region ImportXML
public void Xml2DataGridView(DataGridView dataGridView, String filePath)
{
System.Data.DataSet dataSet1 = new System.Data.DataSet(); ;
dataGridView.Rows.Clear();
dataSet1.ReadXml(filePath, XmlReadMode.Auto);
DataTable dt = dataSet1.Tables[0];
dataGridView.Rows.Add(dt.Rows.Count);
for (int i = 0; i < dt.Rows.Count; i++)
{
object[] data = dt.Rows[i].ItemArray;
for (int j = 0; j < data.Length; j++)
{
dataGridView[j, i].Value = data[j];
}
}
}
#endregion
}
#region " DataColumnExportOptions "
/// <summary>
/// 导出数据字段属性选项类
/// </summary>
class DataColumnExportOptions
{
private String _ColumnName;
private String _Caption;
private Boolean _Visible;
/// <summary>
/// 字段名称
/// </summary>
public String ColumnName
{
get { return _ColumnName; }
set { _ColumnName = value; }
}
/// <summary>
/// 字段标题
/// </summary>
public String Caption
{
get { return _Caption; }
set { _Caption = value; }
}
/// <summary>
/// 是否显示(导出)
/// </summary>
public Boolean Visible
{
get { return _Visible; }
set { _Visible = value; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fColumnName">字段名称</param>
public DataColumnExportOptions(String columnName)
: this(columnName, columnName)
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fColumnName">字段名称</param>
/// <param name="fCaption">字段标题</param>
public DataColumnExportOptions(String columnName, String caption)
: this(columnName, caption, true)
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fColumnName">字段名称</param>
/// <param name="fCaption">字段标题</param>
/// <param name="fVisible">是否显示(导出)</param>
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<DataColumnExportOptions> _ColumnOptions;
private List<DataColumnExportOptions> _VisibleColumnOptions;
private String _WorkSheetName;
/// <summary>
/// 要导出到DataGridView对象
/// </summary>
public DataGridView DataGridView
{
get { return _DataGridView; }
set { _DataGridView = value; }
}
/// <summary>
/// 导出的字段属性列表
/// </summary>
public List<DataColumnExportOptions> ColumnOptions
{
get { return _ColumnOptions; }
set { _ColumnOptions = value; }
}
/// <summary>
/// 要导出的字段列表(只读)
/// </summary>
public List<DataColumnExportOptions> VisibleColumnOptions
{
get { return _VisibleColumnOptions; }
}
/// <summary>
/// 导出的工作表名称
/// </summary>
public String WorkSheetName
{
get { return _WorkSheetName; }
set { _WorkSheetName = value; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dataGridView">要导出到DataGridView对象</param>
public DataGridViewExportOptions(DataGridView dataGridView)
: this(dataGridView, null)
{ }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dataGridView">要导出到DataGridView对象</param>
/// <param name="columnOptions">导出的字段属性列表</param>
public DataGridViewExportOptions(DataGridView dataGridView, List<DataColumnExportOptions> columnOptions)
: this(dataGridView, columnOptions, null) { }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dataGridView">要导出到DataGridView对象</param>
/// <param name="columnOptions">导出的字段属性列表</param>
/// <param name="workSheetName">导出生成的工作表名称</param>
public DataGridViewExportOptions(DataGridView dataGridView, List<DataColumnExportOptions> columnOptions, String workSheetName)
{
if (dataGridView == null) return;
this._DataGridView = dataGridView;
if (columnOptions == null)
{
this._ColumnOptions = new List<DataColumnExportOptions>();
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<DataColumnExportOptions>();
foreach (DataColumnExportOptions option in this._ColumnOptions)
{
if (option.Visible)
this._VisibleColumnOptions.Add(option);
}
}
}
#endregion
}