最近因为朋友需要做到一个从DataGridView中导入导出数据至Excel的功能,向我求解,就做了一个小案例,用以演示常规的通过程序向本地Excel文件写入读出的功能.
在这过程中,出现了一些问题,尝试了多种网上朋友们的资料中介绍的方法.有过问题,有解决了的,也有没有解决的.在这里,将案例操作过程写下来,并附上源文件.希望对需要学习的朋友有帮助.
首先,根据OO思想,我们在操作Excel时候需要明白你要操作的这个对象是什么样的.这样才能更好的理解和进行程序设计.
使用Excel对象进行操作的.所以需要引用程序文件:
Microsoft.Office.Interop.Excel.
版本是:12.0.0.0,运行库版本v1.1.4322
我机器上装的是ProfessionalPlus 2010Beta,一般安装office之后就会自动将程序集集成到Visual Studio2008的项目安装目录
Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12下.
在操作过程中我们需要用到的几个类.
首先是:
Excel.Application Class
Microsoft.Office.Interop.Excel.Application
Microsoft.Office.Interop.Excel.ApplicationClass(继承自Microsoft.Office.Interop.Excel.Application)
这个类实例代表当前操作的Excel
Microsoft.Office.Interop.Excel.ApplicationClass appc = new ApplicationClass();
当本地Excel程序文件受损或意外无法启动时实例将为null.
WorkBook Class
Microsoft.Office.Interop.Excel.WorkBook
这个类实例代表着当前操作的Excel文档.
Microsoft.Office.Interop.Excel.Workbook wb =appc.Application.Workbooks.Open(strFileName, missing, false, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing);
它的构造函数参数多达15个,当然,我们创建时候大多是无需使用到.即用缺失值填补:object missing = System.Reflection.Missing.Value;
同样可以这样创建:
Workbook wb = appc.Workbooks.Add(true);
WorkSheet Class
Microsoft.Office.Interop.Excel.Sheet
Sheet,顾名思义,即是文档中的页,类实例代表当前操作的文档页
Microsoft.Office.Interop.Excel.Worksheet ws =(Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);
Worksheet ws = wb.Sheets[1] as Worksheet;
构造实例的方式同样有多种.
Range Class
Microsoft.Office.Interop.Excel.Range
操作范围,页中某一区域.
我写的这个案例主要是操作文档第一页中的内容,即用到最多的就是这个.
未免大家有些模糊,我先向大家介绍下将会用到的一个对象
二维数组.
object[,]
即我们通常所使用的表.
object[,] objData = new object[n,m];
这样就创建了一个用以存储n*m个object对象的二维数组对象.
也可以说是n行m列的表格.
而Range对象,则代表着Excel页整个表格的某一区域.
我们得到区域对象的方法
Range rng = ws.get_Range(appc.Cells[1, 1], appc.Cells[1,5]);
这样即得到了当前页中的第一行的第一到第五个单元格
然后是Range对象的Merge方法,合并区域中的单元格
rng.Merge(true);
范围中的值
rng.Value2
2我想即是二维的意思.
最后则是保存方法
wb.SaveAs(savePath,
missing, missing, missing,
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
missing, missing, missing, missing, missing);
保存当前文档.
我第一次做这样的案例,网上的资料参照占据了代码的绝大部分.
程序设计是一件需要大量思考的事情,因为程序充满了各种可能性.
更多的需要去理解你所做的事情,你要做的事情,你需要使用的一些事物,需要考虑的一些情况,这些都是不可复制的.但是又都是有共通性的.
所谓理解的越多,需要记忆的就越少.
在这里贴出程序代码:
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
//要求格式
// 盘点表名称
// 数据库网格表
//部门领导签字: 盘点人签字:
object missing = System.Reflection.Missing.Value;
int colCount = 10;
string[,] objData = new string[1, 1];
Microsoft.Office.Interop.Excel.Application appc = new Microsoft.Office.Interop.Excel.ApplicationClass();
if (appc == null)
{
MessageBox.Show("无法启动Excel");
return;
}
Workbook wb = appc.Workbooks.Add(true);
Worksheet ws = wb.Sheets[1] as Worksheet;
Range rng = ws.get_Range(appc.Cells[1, 1], appc.Cells[1, colCount]); //取得单元格,从第一行第一格,到第一行第colCount格
rng.Merge(true); //合并范围中的单元
//设置标题,操作活动的单元格,即合并的单元格
appc.ActiveCell.FormulaR1C1 = "盘点表名称";
appc.ActiveCell.Font.Size = 25;
appc.ActiveCell.Font.Bold = true;
appc.ActiveCell.HorizontalAlignment = Constants.xlCenter; //居中
rng = ws.get_Range(appc.Cells[2, 1], appc.Cells[2, colCount]);
rng.Merge(true);
objData[0, 0] = "数据库网格表";
rng.Value2 = objData;
rng.Font.Size = 20;
rng = ws.get_Range(appc.Cells[3, 1], appc.Cells[3, colCount / 2]);
rng.Merge(true);
objData[0, 0] = "部门领导签字:";
rng.Value2 = objData;
rng = ws.get_Range(appc.Cells[3, colCount / 2 + 1], appc.Cells[3, colCount]);
rng.Merge(true);
objData[0, 0] = "盘点人签字:";
rng.Value2 = objData;
//保存
wb.SaveAs(savePath,
missing, missing, missing,
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
missing, missing, missing, missing, missing);
MessageBox.Show("写入成功");