这里讨论的是使用.NET操作Excel从面生成Excel文档,比如导出数据或从Excel中读取数据。
我们一般采用的是在项目里添加Excel的Com引用,这样会把所需的类型信息导入到当前程序集中便于使用Excel的相关对象。这种方式类型明确,易于操作,很容易上手。可是这种方式有着一个非常明显的问题,就是Excel版本的问题。因为我们引用Excel的Com组件信息的时候使用的是本机的已安装的Excel,当把项目换到其它机子上的时候或部署到其它的用户机上的时候,可能目标机的Excel跟本就不和程序里引用的版本相兼容,这样要么程序报错,要么操作无效。直接影响了使用。
为了解决这个版本上的不一致问题,我们可以采用非引用Com的方式来使用或操作Excel,或叫后期绑定,相对来说引用的方式就叫前期绑定。下面的代码示例表示对一个DataTabl导出到Excel的操作。通过传入必要的参数信息,代码能够把一个DataTable对象的内容导入到一个Excel文件中,并可无限制的由Excel应用程序打开。为了方便查找或能帮到有相关问题的网友,特把代码粘到这里以共享:
/// <summary>/// 把DataTable的数据导出到Excel文件中
/// </summary>
/// <param name="fileName"> Excel文件名 </param>
/// <param name="dataTable"> 要导出的数据表 </param>
/// <param name="errorInfo">操作 出错信息 </param>
/// <returns> 是否导出成功 </returns>
public static bool GenerateExcel( string fileName, DataTable dataTable, out string errorInfo)
{
errorInfo = null ;
object objApp;
object objBook;
object objBooks;
object objSheets;
object objSheet;
object objCells;
object [] Parameters;
if (dataTable == null || dataTable.Rows.Count == 0 )
{
return true ;
}
try
{
// 获取Excel类型并建立其实例
Type objExcelType = Type.GetTypeFromProgID( " Excel.Application " );
if (objExcelType == null )
{
return false ;
}
objApp = Activator.CreateInstance(objExcelType);
if (objApp == null )
{
return false ;
}
// 获取Workbook集
objBooks = objApp.GetType().InvokeMember( " Workbooks " , BindingFlags.GetProperty, null , objApp, null );
// 添加一个新的Workbook
objBook = objBooks.GetType().InvokeMember( " Add " , BindingFlags.InvokeMethod, null , objBooks, null );
// 获取Sheet集
objSheets = objBook.GetType().InvokeMember( " Worksheets " , BindingFlags.GetProperty, null , objBook, null );
// 获取第一个Sheet对象
Parameters = new Object[ 1 ] { 1 };
objSheet = objSheets.GetType().InvokeMember( " Item " , BindingFlags.GetProperty, null , objSheets, Parameters);
try
{
// 写入表头信息
for ( int i = 0 ; i < dataTable.Columns.Count; i ++ )
{
Parameters = new Object[ 2 ] { 1 , i + 1 };
objCells = objSheet.GetType().InvokeMember( " Cells " , BindingFlags.GetProperty, null , objSheet, Parameters);
// 向指定单元格填写内容值
Parameters = new Object[ 1 ] { dataTable.Columns[i].Caption };
objCells.GetType().InvokeMember( " Value " , BindingFlags.SetProperty, null , objCells, Parameters);
}
// 写入表中数据内容
for ( int i = 0 ; i < dataTable.DefaultView.Count; i ++ )
{
for ( int col = 0 ; col < dataTable.Columns.Count; col ++ )
{
Parameters = new Object[ 2 ] { i + 2 , col + 1 };
objCells = objSheet.GetType().InvokeMember( " Cells " , BindingFlags.GetProperty, null , objSheet, Parameters);
// 向指定单元格填写内容值
Parameters = new Object[ 1 ] { dataTable.DefaultView[i][col].ToString() };