用C#输出数据到excel的最简单的例子--and--C#如何退出excel的进程!
2012-11-30 09:40
591 查看
我安装的是VS2005, Office2003,2009.01.12中午成功运行。ps: 必须保证电脑安装了excel。
首先,在解决方案资源管理器的引用文件夹右键“添加引用”,"COM"-Microsoft Excel 11.0 Object Library,这时回自动生成3个引用: Excel, Microsoft.Office.Core, VBIDE。
如图:
手工在前面添加using System.Reflection; 因为Missing.Value可能要用到很多次。最好不要添加excel的引用因为会引起混淆。
代码如下:
我花了2天时间老是出异常,原来是因为sheet.Cells[0, 0]不存在!! 下标是从1开始的。
在前面,说了如何最简单的打开一个excel,但是,有时候发现,程序退出后,进程中依然有excel。搜索了不少的文章,发现多少都有点问题,伪代码太多,很多根本无法运行的也帖出来。研究了几天之后,大致给出Kill进程的方法和GC.Collect的方法。
GC.Collect的代码是:
用Kill的方法的代码是:
Kill的方法参考了http://www.cppblog.com/colys/archive/2009/02/09/25265.html 的代码
而http://wei002.blog.hexun.com/27075681_d.html 显然是错误的,设置了null后无法获得句柄。
我们研究一下最简单的例子:
首先,在解决方案资源管理器的引用文件夹右键“添加引用”,"COM"-Microsoft Excel 11.0 Object Library,这时回自动生成3个引用: Excel, Microsoft.Office.Core, VBIDE。
如图:
手工在前面添加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进程也会终止 } }
相关文章推荐
- 用C#输出数据到excel的最简单的例子(By kiseigo)
- C#导出数据到Excel模板and如何画Excel模板并导出数据,导入excel数据
- C#中导出数据到EXCEL的简单例子
- C# Winform里面输出数据到Excel的问题
- 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据
- 如何将网页数据输出为Excel或Word文件
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 超级简单:如何更快的将数据导入Excel
- (JSP)如何将网页数据输出为Excel或Word文件
- 如何将C#中将TextBox的数据以及从数据库中查询得到的数据导出到Excel中
- PHP如何查询MySQL数据页面并输出内容到页面,并另存为CSV或EXCEL文件
- C#如何连接Oracle数据库,如何把数据绑定到dataGridView,如何把dataGridView数据导出到EXCEL
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格?[转]
- 《JavaWeb---Servlet的简单例子》---响应浏览器的请求,向浏览器输出数据
- 把datagridview的数据输出为Excel,Word的简单应用
- C# Excel数据导入和导出简单方案
- 如何将网页数据输出为Excel或Word文件
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
- 【转载】Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据,作者:Jaiky_杰哥
- 一个php中的数据输出到excel的例子(database:PostgreSQL)