用C#输出数据到excel的最简单的例子--and--C#如何退出excel的进程!

我安装的是VS2005, Office2003,2009.01.12中午成功运行。ps: 必须保证电脑安装了excel。

首先,在解决方案资源管理器的引用文件夹右键“添加引用”,"COM"-Microsoft Excel 11.0 Object Library,这时回自动生成3个引用: Excel, Microsoft.Office.Core, VBIDE。

   如图:

   用C#输出数据到excel的最简单的例子(By <wbr>kiseigo)

    手工在前面添加using System.Reflection; 因为Missing.Value可能要用到很多次。最好不要添加excel的引用因为会引起混淆。

    代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace ExcelOutput
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void btnExcelOutput_Click(object sender, EventArgs e)
        {
            Excel.Application excel = new Excel.ApplicationClass();

            try
            {
                Excel.Workbook book = excel.Workbooks.Add(Missing.Value); // 添加一个工作簿

                Excel.Worksheet sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表
                sheet.Name = "sheetName1"; // 修改工作表的名字
                sheet.Cells[1, 1] = "333"; // 关键是,不管是Sheets[i]还是Cells[i,j]都是从1开始的,而不是从0开始的!!

                excel.Visible = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                excel.Quit();
                excel = null;
            }
        }
    }
}

 


我花了2天时间老是出异常,原来是因为sheet.Cells[0, 0]不存在!! 下标是从1开始的。

 

在前面,说了如何最简单的打开一个excel,但是,有时候发现,程序退出后,进程中依然有excel。搜索了不少的文章,发现多少都有点问题,伪代码太多,很多根本无法运行的也帖出来。研究了几天之后,大致给出Kill进程的方法和GC.Collect的方法。

GC.Collect的代码是:

 

 

       /// <summary>

        /// 读取xls(用GC的方法,手工设置book为null)

        /// </summary>

        private void ReadXlsGetRangeA1()

        {

            string path = "C:\\abc.xls";

            // 判断文件不存在,返回

            if (!File.Exists(path))

            {

                return;

            }

            Excel.Application excel = new Excel.ApplicationClass(); // 某人

            //Excel.Workbooks workbooks = null; // 不用单独定义也可以

            Excel.Workbook book = null;

            Excel.Worksheet sheet = null;

            Excel.Range range = null;

            object oV = System.Reflection.Missing.Value; // 反复用到

            try

            {

                // 步骤1:打开某人的表xls

                book = excel.Workbooks.Open(path, oV, oV, oV, oV,

                    oV, oV, oV, oV, oV, oV, oV, oV, oV, oV); // 打开一个工作簿

                sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表

                sheet.Name = "Salary详细"; // 修改工作表的名字

                excel.Visible = false;

                // 步骤2:读取数据

                range = sheet.Cells.get_Range("A1", "A1"); //读取第一行第一列的内容

                this.Text = range.Value2.ToString(); // 现在是form的标题

                // 步骤3:保存表格

                book.Save();

                // 步骤4:关闭book

                excel.Workbooks.Close();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                System.Runtime.InteropServices.Marshal.ReleaseComObject(book);

                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);

                System.Runtime.InteropServices.Marshal.ReleaseComObject(range);

                System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

                book = null;

                sheet = null;

                range = null;

                excel = null;

                GC.Collect(); // 前提是:所有的对象都=null后才能调用此函数,然后才会结束“任务管理器”中的excel.exe进程

            }

        }

 


用Kill的方法的代码是:

using System.Runtime.InteropServices; // DllImport用

[DllImport("User32.dll", CharSet = CharSet.Auto)]

public static extern int GetWindowThreadProcessId(IntPtr hwnd, out   int ID); 

 

/// <summary>

        /// 读取xls(用kill的方法)

        /// </summary>

        private void KillReadXlsGetRangeA1()

        {

            string path = "C:\\abc.xls";

            // 判断文件不存在,返回

            if (!File.Exists(path))

            {

                return;

            }

            Excel.Application excel = new Excel.ApplicationClass(); // 某人

            //Excel.Workbooks workbooks = null; // 不用单独定义也可以

            Excel.Workbook book = null;

            Excel.Worksheet sheet = null;

            Excel.Range range = null;

            object oV = System.Reflection.Missing.Value; // 反复用到

            try

            {

                // 步骤1:打开某人的表xls

                book = excel.Workbooks.Open(path, oV, oV, oV, oV,

                    oV, oV, oV, oV, oV, oV, oV, oV, oV, oV); // 打开一个工作簿

                sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表

                sheet.Name = "Salary详细"; // 修改工作表的名字

                excel.Visible = false;

                // 步骤2:读取数据

                range = sheet.Cells.get_Range("A1", "A1"); //读取第一行第一列的内容

                this.Text = range.Value2.ToString(); // 现在是form的标题

                // 步骤3:保存表格

                book.Save();

                // 步骤4:关闭book

                excel.Workbooks.Close();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                excel.Quit();

                //excel = null; // 注意:如果要获得excel的Hwnd,不能设置excel = null。

                IntPtr t = new IntPtr(excel.Hwnd);

                int k = 0;

                GetWindowThreadProcessId(t, out k);

                System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);

                p.Kill();

            }

        }


 

Kill的方法参考了http://www.cppblog.com/colys/archive/2009/02/09/25265.html 的代码

http://wei002.blog.hexun.com/27075681_d.html 显然是错误的,设置了null后无法获得句柄。

 

我们研究一下最简单的例子:

      

/// <summary>

        /// 读取xls(最简洁的方式,什么变量都不用,只是用excel, 程序释放后才会终止excel进程)

        /// </summary>

        private void ReadXlsEasy()

        {

            // 什么变量都不用,只是用excel, 最后excel.Quit() excel = null都无法退出

            // 结论:必须用GC.Collect() 结束;否则,只能等程序释放后进程中的excel才会退出

            Excel.Application excel = new Excel.ApplicationClass(); // 某人

            try

            {

                excel.Visible = false;

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                excel.Quit();

                excel = null;

                //GC.Collect(); // 如果强制对所有代进行垃圾回收,那么不退出程序,excel进程也会终止

            }

        }


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值