不采用引用的方式操作Excel

  这里讨论的是使用.NET操作Excel从面生成Excel文档,比如导出数据或从Excel中读取数据。

  我们一般采用的是在项目里添加Excel的Com引用,这样会把所需的类型信息导入到当前程序集中便于使用Excel的相关对象。这种方式类型明确,易于操作,很容易上手。可是这种方式有着一个非常明显的问题,就是Excel版本的问题。因为我们引用Excel的Com组件信息的时候使用的是本机的已安装的Excel,当把项目换到其它机子上的时候或部署到其它的用户机上的时候,可能目标机的Excel跟本就不和程序里引用的版本相兼容,这样要么程序报错,要么操作无效。直接影响了使用。

  为了解决这个版本上的不一致问题,我们可以采用非引用Com的方式来使用或操作Excel,或叫后期绑定,相对来说引用的方式就叫前期绑定。下面的代码示例表示对一个DataTabl导出到Excel的操作。通过传入必要的参数信息,代码能够把一个DataTable对象的内容导入到一个Excel文件中,并可无限制的由Excel应用程序打开。为了方便查找或能帮到有相关问题的网友,特把代码粘到这里以共享:

关闭释放的代码参考,每一个对象都应该调用,比如:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);

///   <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() };
                    objCells.GetType().InvokeMember(
" Value " , BindingFlags.SetProperty,  null , objCells, Parameters);
                }
            }
        }
        
catch  (Exception operExce)
        {
            errorInfo 
=  operExce.Message;
            
return   false ;
        }
        
finally
        {
            
// 不提示保存
            Parameters  =   new  Object[ 1 ] {  false  };
            objApp.GetType().InvokeMember(
" DisplayAlerts " , BindingFlags.SetProperty,  null , objApp, Parameters);

            
// 保存文件并退出
            Parameters  =   new  Object[ 1 ] { fileName };
            objBook.GetType().InvokeMember(
" SaveAs " , BindingFlags.InvokeMethod,  null , objBook, Parameters);
            objApp.GetType().InvokeMember(
" Quit " , BindingFlags.InvokeMethod,  null , objApp,  null );
         }
        
return   true ;
    }
    
catch  (Exception appExce)
    {
        errorInfo 
=  appExce.Message;
        
return   false ;
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值