浇铸

博客园 首页 新随笔 联系 订阅 管理

最近因为朋友需要做到一个从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("写入成功");

posted on 2010-05-14 21:32  浇铸  阅读(1259)  评论(0编辑  收藏  举报