前言

    公司最近有操作excel的需求:店名上传上来的excel都没有地址这一栏,但是有对应的编号,由于有上百个excel文件各个分店要是手工填写的话基本不可能,所以有劳我想办法了:)我倒是知道能操作,但是没有具体实践过.以下是摸索的点滴:


开发环境

    window XP,Microsoft Visual Studio 2005,C#,ASP.NET,Office2003,SQL SERVER2000


推荐/参考文章

    1.强烈推荐Excel VBA文档,如果你安装了office2003的话,安装目录下有个叫VBAXL10.CHM的帮助文档就是了,并且是中文的!!例如,我安装的在D盘,那么这个文件的地址是:D:\Program Files\Microsoft Office\OFFICE11\2052\VBAXL10.CHM

    2.主要参考​​C#向Excel报表中插入图片的2种方法​​,将Excel应用于报表开发系列文章共8篇等文章.


目的,步骤

    1.通过程序打开excel

    2.读取编号列

    3.根据编号在数据库中查询对应的地址并返回数据

    4.把对应的地址插入excel

    5.通过程序保存关闭excel,下一个...


正题

    1.(新建工程等步骤在这里都省略了)添加操作excel的COM组件:

    

    2.主要的方法代码:


    /// <summary>

    /// 修改Excel

    /// </summary>

    /// <param name="Path">读取路径</param>

        /// <param name="newPath">另存路径</param>

    /// <param name="shop_name">店名</param>

    /// <param name="tablename">表名</param>

    public void AlterExcel(string Path,string newPath,string shop_name,string tablename)

    {

        try

        {

            Object miss = System.Reflection.Missing.Value;

            Excel.Application ExcelApp = new Excel.ApplicationClass();

            Excel.Workbooks wbooks = (Excel.Workbooks)ExcelApp.Workbooks;

            Excel.Workbook wbook = wbooks.Open(Path, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss);

            //获得第一个工作薄

            Excel.Worksheet wsheet = (Excel.Worksheet)wbook.Worksheets.get_Item(1);


            ExcelApp.Visible = false;

            ExcelApp.DisplayAlerts = false;


            //取得编号

            ArrayList arr = new ArrayList();

            for (int i = 3, j = wsheet.UsedRange.Rows.Count; i < j; i++)

            {

                Excel.Range rang = (Excel.Range)wsheet.Cells[i, 2];

                if (null != rang.Text && rang.Text.ToString().Length > 0)

                    arr.Add(rang.Text);

                else

                    break;

            }


            //添加新行 Cells[行,列]

            ((Excel.Range)wsheet.Columns.get_Item(3, miss)).Insert(XlInsertShiftDirection.xlShiftToRight, miss);

            //添加区域单元格

            //wsheet.get_Range(wsheet.Cells[2, 3], wsheet.Cells[wsheet.UsedRange.Rows.Count - 3, 3]).Insert(XlInsertShiftDirection.xlShiftToRight, miss);


            //设置标头

            wsheet.Cells[2, 3] = "地址";

            ((Excel.Range)wsheet.Columns.get_Item(3, miss)).ColumnWidth = 25;

            //此处为获得该店的所有地址,这里替换成自己的方法就行

            Hashtable hash = GetShopAddr(shop_name, tablename);


            for (int i = 3, j = i + arr.Count; i < j; i++)

            {

                try

                {

                        //根据编号设置地址

                    wsheet.Cells[i, 3] = hash[Convert.ToInt32(arr[i - 3])];

                }

                catch(Exception)

                {

                    continue;

                }

            }

            //另存为

            wbook.SaveAs(newPath, miss, miss, miss, miss, miss, Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss);

            wbook.Close(false, miss, miss);

            ExcelApp.Quit();


            ReleaseObject(wsheet);

            ReleaseObject(wbook);

            ReleaseObject(wbooks);

            ReleaseObject(ExcelApp);


            GC.Collect();

            GC.WaitForPendingFinalizers();

        }

        catch

        {

            //throw;

        }

        finally

        {

            //结束进程

            //KillExcelProcess();

        }

    }


    /// <summary>

    /// 释放对象

    /// </summary>

    /// <param name="obj"></param>

    private void ReleaseObject(object obj)

    {

        try

        {

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

        }

        catch {}

        finally { obj = null; }

    }


    /// <summary>

    /// 结束Excel进程

    /// </summary>

    public void KillExcelProcess()

    {

        Process[] myProcesses = Process.GetProcessesByName("Excel");

        foreach (Process myProcess in myProcesses)

            myProcess.Kill();

    }

注意:

    a).需要添加命名空间using Microsoft.Office.Interop.Excel;

    b).添加新行处代码两个都行,一个是添加一列一个是添加一个范围的单元格,达到效果是一样的


最后推荐一个网站和一个论坛:

Excel终极伴侣 http://www.chinaobs.com/

MSDN http://msdn.microsoft.com/library/CHS/dv_wrcore/html/wrgrfexcelobjects.asp