zoukankan      html  css  js  c++  java
  • C# 操作Excel2003

    前言
        公司最近有操作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[23= "地址";
                ((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
  • 相关阅读:
    在 Borland C++ 及 Visual C++ 环境中使用 STLport (作者:孟岩)
    设置JavaFX-CSS改变TreeView节点图标
    Using MS DataGrid control with ADO
    两个加载fxml文件的方法
    JavaFX中ObservableValue类型
    在 Eclipse 下利用 gradle 构建系统
    JavaFX初探
    深度剖析如何保证缓存与数据库的一致性
    ACID的实现原理
    一颗高度为3的B+树能存多少行数据?
  • 原文地址:https://www.cnblogs.com/over140/p/1018611.html
Copyright © 2011-2022 走看看