zoukankan      html  css  js  c++  java
  • [转]C#调用Excel VBA宏

    附上一段原创常用代码 计算列标题字符串
    Function CalcColumn(ByVal c As Integer) As String
        Dim temp As String
        Dim x As Integer
        If c > 0 And c <= 256 Then
            x = (c - 1)  26
            If x > 0 Then
                temp = CStr(Chr(Asc("A") + x - 1))
            End If
            x = c - (c  26) * 26
            x = IIf(x = 0, 26, x)
            temp = temp + CStr(Chr(Asc("A") + x Mod 27 - 1))
        End If
        CalcColumn = temp
    End Function
     1         public static int ToIndex(string columnName)
     2         {
     3             if (!Regex.IsMatch(columnName.ToUpper(), @"[A-Z]+")) { throw new Exception("invalid parameter"); }
     4             int index = 0;
     5             char[] chars = columnName.ToUpper().ToCharArray();
     6             for (int i = 0; i < chars.Length; i++)
     7             {
     8                 index += ((int)chars[i] - (int)'A' + 1) * (int)Math.Pow(26, chars.Length - i - 1);
     9             }
    10             return index - 1;
    11         }
    12 
    13         public static string ToName(int index)
    14         {
    15             if (index < 0) { throw new Exception("invalid parameter"); }
    16             List<string> chars = new List<string>();
    17             do
    18             {
    19                 if (chars.Count > 0) index--;
    20                 chars.Insert(0, ((char)(index % 26 + (int)'A')).ToString());
    21                 index = (int)((index - index % 26) / 26);
    22             } while (index > 0);
    23             return String.Join(string.Empty, chars.ToArray());
    24         }
    25 
    26         private void button1_Click(object sender, EventArgs e)
    27         {
    28             // 数字转字母列
    29             //this.textBox2.Text = ToName(Convert.ToInt16(this.textBox1.Text.ToString().Trim()));
    30             this.textBox2.Text = ToName(Convert.ToInt16(this.textBox1.Text.ToString().Trim()) - 1);
    31         }
    32 
    33         private void button2_Click(object sender, EventArgs e)
    34         {
    35             // 字母转数字列
    36             //this.textBox2.Text = (ToIndex(this.textBox1.Text.Trim())).ToString();
    37             this.textBox2.Text = (ToIndex(this.textBox1.Text.Trim()) + 1).ToString();
    38         }

    根据列数计算列标题字母

    http://support.microsoft.com/kb/306683/zh-cn

      1 using System;
      2 using System.IO;
      3 //using Microsoft.Office.Core;
      4 using Excel = Microsoft.Office.Interop.Excel;
      5 using System.Reflection;
      6 
      7 namespace DoVBAMacro
      8 {
      9     ///
     10     /// 执行Excel VBA宏帮助类
     11     ///
     12     public class ExcelMacroHelper
     13     {
     14         ///
     15         /// 执行Excel中的宏
     16         ///
     17         /// Excel文件路径
     18         /// 宏名称
     19         /// 宏参数组
     20         /// 宏返回值
     21         /// 执行时是否显示 Excel
     22         public void RunExcelMacro(
     23                                    string excelFilePath,
     24                                    string macroName,
     25                                    object[] parameters,
     26                                    out object rtnValue,
     27                                    bool isShowExcel
     28                                    )
     29         {
     30             try
     31             {
     32                 #region 检查入参
     33 
     34                 // 检查文件是否存在
     35                 if (!File.Exists(excelFilePath))
     36                 {
     37                     throw new System.Exception(excelFilePath + " 文件不存在 ");
     38                 }
     39 
     40                 // 检查是否输 入宏名称
     41                 if (string.IsNullOrEmpty(macroName))
     42                 {
     43                     throw new System.Exception("请输 入宏的名称");
     44                 }
     45 
     46                 #endregion
     47 
     48                 #region 调用宏处理
     49 
     50                 // 准备打开Excel文件时的缺省参数对象
     51                 object oMissing = Missing.Value;
     52 
     53                 // 根 据参数组是否为空,准备参数组对象
     54                 object[] paraObjects;
     55 
     56                 if (parameters == null)
     57                 {
     58                     paraObjects = new object[] { macroName };
     59                 }
     60                 else
     61                 {
     62                     // 宏参数组长度
     63                     int paraLength = parameters.Length;
     64 
     65                     paraObjects = new object[paraLength + 1];
     66 
     67                     paraObjects[0] = macroName;
     68                     for (int i = 0; i < paraLength; i++)
     69                     {
     70                         paraObjects[i + 1] = parameters[i];
     71                     }
     72                 }
     73 
     74                 // 创建Excel对象示例
     75                 Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
     76 
     77                 // 判断是否要求执行时Excel可见
     78                 if (isShowExcel)
     79                 {
     80                     // 使创建的对 象可见
     81                     oExcel.Visible = true;
     82                 }
     83 
     84                 // 创建Workbooks对象
     85                 Excel.Workbooks oBooks = oExcel.Workbooks;
     86 
     87                 // 创 建Workbook对象
     88                 Excel._Workbook oBook = null;
     89 
     90                 // 打开指定的Excel文件
     91                 oBook = oBooks.Open(
     92                                            excelFilePath,
     93                                            oMissing,
     94                                            oMissing,
     95                                            oMissing,
     96                                            oMissing,
     97                                            oMissing,
     98                                            oMissing,
     99                                            oMissing,
    100                                            oMissing,
    101                                            oMissing,
    102                                            oMissing,
    103                                            oMissing,
    104                                            oMissing,
    105                                            oMissing,
    106                                            oMissing
    107                          );
    108 
    109                 // 执行Excel中的宏
    110                 rtnValue = this.RunMacro(oExcel, paraObjects);
    111 
    112                 // 保存更改
    113                 oBook.Save();
    114 
    115                 // 退出Workbook
    116                 oBook.Close(false, oMissing, oMissing);
    117 
    118                 #endregion
    119 
    120                 #region 释放对象
    121 
    122                 // 释放Workbook对象 
    123                 System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
    124                 oBook = null;
    125 
    126                 // 释放Workbooks对象
    127                 System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
    128                 oBooks = null;
    129 
    130                 // 关闭Excel
    131                 oExcel.Quit();
    132 
    133                 // 释放Excel对象
    134                 System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
    135                 oExcel = null;
    136 
    137                 // 调用垃圾回收
    138                 GC.Collect();
    139 
    140                 #endregion
    141             }
    142             catch (Exception ex)
    143             {
    144                 throw ex;
    145             }
    146         }
    147 
    148         ///
    149         /// 执行宏
    150         ///
    151 
    152         /// Excel对象
    153         /// 参数(第一个参数为指定宏名称,后面为指定宏的参数值) 
    154         /// 宏返回值
    155         private object RunMacro(object oApp, object[] oRunArgs)
    156         {
    157             try
    158             {
    159                 // 声明一个返回对象
    160                 object objRtn;
    161 
    162                 // 反射方式执行宏
    163                 objRtn = oApp.GetType().InvokeMember(
    164                                                    "Run",
    165                                                    BindingFlags.Default | BindingFlags.InvokeMethod,
    166                                                    null,
    167                                                    oApp,
    168                                                    oRunArgs
    169                                                     );
    170 
    171                 // 返回值
    172                 return objRtn;
    173             }
    174             catch (Exception ex)
    175             {
    176                 // 如果有底层异常,抛出底层异 常
    177                 if (ex.InnerException.Message.ToString().Length > 0)
    178                 {
    179                     throw ex.InnerException;
    180                 }
    181                 else
    182                 {
    183                     throw ex;
    184                 }
    185             }
    186         }
    187     }
    188 }
    189 
    190 ////示例三个VBA宏方法:
    191 //Sub getTime()
    192 
    193 //Sheet1.Cells(1, 1) = Now
    194 
    195 //End Sub
    196 
    197 
    198 //Sub getTime2(title As String)
    199 
    200 //Sheet1.Cells(2, 1) = title & " : " & Now
    201 
    202 //End Sub
    203 
    204 //Function getTime3(title As String) As String
    205 
    206 //getTime3 = title & " : " & Now
    207 
    208 //End Function
    209 
    210 ////对应 的三个使用方法
    211 //不带参数的宏调用(兼演示执行过程显示Excel文件)
    212 //带 参数的宏调用(兼演示执行过程不显示Excel文件)
    213 //有返回值的宏调用
    214 //private void btnExe_Click(object sender, EventArgs e)
    215 //{
    216 //try
    217 //{
    218 //// 返回对象
    219 //object objRtn = new object();
    220 
    221 //// 获得一个ExcelMacroHelper对象
    222 //ExcelMacroHelper excelMacroHelper = new ExcelMacroHelper();
    223 
    224 //// 执行指定Excel中的宏,执行时显示Excel
    225 //excelMacroHelper.RunExcelMacro(
    226 //@"E:csharp_studyDoVBAMacro	est.xls",
    227 //"getTime2",
    228 //new Object[] { "现在时刻" },
    229 //out objRtn,
    230 //true
    231 //);
    232 
    233 //// 执行指定Excel中的宏,执行时不显示Excel
    234 //excelMacroHelper.RunExcelMacro(
    235 //@"E:csharp_studyDoVBAMacro	est.xls",
    236 //"getTime2",
    237 //new Object[] { "现在时刻" },
    238 //out objRtn,
    239 //false
    240 //);
    241 
    242 //// 执行指定Excel中的宏,执行时显示Excel,有返回值
    243 //excelMacroHelper.RunExcelMacro(
    244 //@"E:csharp_studyDoVBAMacro	est.xls",
    245 //"getTime3",
    246 //new Object[] { "现在时刻" },
    247 //out objRtn,
    248 //true
    249 //);
    250 
    251 //MessageBox.Show((string)objRtn);
    252 
    253 //}
    254 //catch(System.Exception ex)
    255 //{
    256 //MessageBox.Show(ex.Message);
    257 //}
    258 //}
  • 相关阅读:
    mysql的配置和安装
    ubuntu开机后无法进入桌面
    python的学习笔记(1)之json序列化的使用(2)
    python的学习笔记(1)之json序列化的使用(1)
    python的学习笔记(0)之循环的使用1
    java基础面试题10--String--统计大串中小串出现的次数
    13 ftp软件安装过程
    12 软件安装的两种方式
    rpm方式安装MySQL5.1.73
    java基础面试题9--数组高级-二分查找
  • 原文地址:https://www.cnblogs.com/z5337/p/3809323.html
Copyright © 2011-2022 走看看