c# 不采用引用的方式操作Excel

 添加命名空间:  using System.Reflection;

用反射的方式可以无需提前引用office组件,即使你没有安装office,只安装了wps这段代码仍然能用

这里讨论的是使用.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() };
                    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;
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值