最近整理了下前段时间做的东西,关于Excel的读写,在网上也看到不少关于这方面的代码,还是觉得不是很完善,就自己整理了一个Excel文件读写的类。代码如下:
/// <summary>
/// 标题:Excel文件助手类
/// 描述:1.读取指定条件的Excel信息到内存中
/// 2.将内存中的信息导出到Excel文件中
/// </summary>
class Excel
{
//类成员
private string m_filepath;//文件路径
public OleDbConnection pOleDbconnection; //文件链接
string strConnection;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="filepath">excel文件路径</param>
public Excel (string filepath)
{
m_filepath = filepath;
}
public Excel ()
{
}
/// <summary>
/// 获取数据源
/// </summary>
/// <param name="filepath_">Excel文件路径</param>
/// <returns>Excel表格数据集</returns>
/// <example>
/// Provider代表连接驱动4.0版本
/// Data Source代表Excel的路径
/// Extended Properties代表连接Excel的版本,对于Excel 97以上版本都用Excel 8.0
/// HDR代表默认Excel第一行是否列名,Yse代表是可以直接读取,No反之1
/// </example>
public DataSet Excel2DataSet (string filepath_)
{
//获取文件扩展名
string fileType = System.IO.Path.GetExtension(filepath_);
if(fileType==".xls")
{
strConnection = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_filepath + ";Extended Properties=Excel 8.0";
}
else if(fileType == ".xlsx")
{
strConnection = @"Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + m_filepath + ";Extended Properties=Excel 12.0";
}
else if(string.IsNullOrEmpty(fileType))
{
return null;
}
DataSet dataSet = new DataSet();
System.Data.DataTable dtSheetName = new System.Data.DataTable();
OleDbDataAdapter dataAdapter;//数据适配器
try
{ //初始化链接并打开
pOleDbconnection = new OleDbConnection(strConnection);
pOleDbconnection.Open();
//获取数据源的表定义元数据
string SheetName = "";
dtSheetName = pOleDbconnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null,null,null,"TABLE" });
//初始化适配器
dataAdapter = new OleDbDataAdapter();
for(int i = 0;i < dtSheetName.Rows.Count;i++)
{
SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];
string sql_F = @"Select * FROM [" + SheetName + "]";//SQL
//筛选有效表
if(SheetName.Contains("$") || SheetName.Replace("'","").EndsWith("$"))
{
dataAdapter.SelectCommand = new OleDbCommand(sql_F,pOleDbconnection);
DataSet dsItem = new DataSet();
dataAdapter.Fill(dsItem,"[" + SheetName + "]");
dataSet.Tables.Add(dsItem.Tables[0].Copy());
}
}
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show("链接Excel出错!"+ex.Message);
}
return dataSet;
}
/// <summary>
/// 将DataTable导出到Excel
/// </summary>
/// <param name="excelTable">DataTable</param>
/// <param name="strFilepath">文件路径</param>
public void DataTable2Excel (System.Data.DataTable excelTable,string strFilepath)
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
app.Visible = false;
Microsoft.Office.Interop.Excel.Workbook wBook = app.Workbooks.Add(true);
Microsoft.Office.Interop.Excel.Worksheet wSheet = wBook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
if(excelTable.Rows.Count > 0)
{
int row = 0;
row = excelTable.Rows.Count;
int col = excelTable.Columns.Count;
for(int i = 0;i < row;i++)
{
for(int j = 0;j < col;j++)
{
string str = excelTable.Rows[i][j].ToString();
wSheet.Cells[i + 2,j + 1] = str;
}
}
}
int size = excelTable.Columns.Count;
for(int i = 0;i < size;i++)
{
wSheet.Cells[1,1 + i] = excelTable.Columns[i].ColumnName;
}
//设置禁止弹出保存和覆盖的询问提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
//保存工作簿
wBook.Save();
//保存excel文件
app.Save(strFilepath);
app.SaveWorkspace(strFilepath);
app.Quit();
app = null;
}
catch(Exception err)
{
System.Windows.Forms.MessageBox.Show("导出Excel出错!错误原因:" + err.Message,"提示信息",
System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Information);
}
finally
{
}
}
}