需求:
因为Excel中数据量很大,其中包含了几个宏程序从其他数据源读取数据,运行一次宏需要比较长的时间,为了不影响使用,要求每天半夜运行一次Excel中的宏(无参数),Excel存放在共盘上。

解决方案:
Sharepoint上写了一个Timejob,Timejob每天去运行宏。
写Timejob参考http://www.cnblogs.com/batter152/p/4705316.html

在运行时会碰到的问题
ERROR – RETRIEVING THE COM CLASS FACTORY FOR COMPONENT WITH CLSID {00020812-0000-0000-C000-000000000046} FAILED DUE TO THE FOLLOWING ERROR: 80070005 ACCESS IS DENIED. (EXCEPTION FROM HRESULT: 0X80070005 (E_ACCESSDENIED)).
或者报错没有权限,或者报错说
Microsoft Excel cannot access the filee are several possible reasons:• The file name or path does not exist. • The file is being used by another program. • The workbook you are trying to save has the same name as a currently open workbook.

通过做下面两个步骤就可以解决:

1.创建桌面快捷方式
需要手动创建文件夹,把Excel运行快捷方式放到这个文件夹下面
64位系统: C:\Windows\SysWOW64\config\systemprofile\Desktop
32为系统: C:\Windows\System32\config\systemprofile\Desktop

2.修改运用程序的权限
64位系统运行dcomcnfg
32位系统运行mmc -32,然后添加Component services
展开Services –> Computers –> My Computer –> DCOM Config如下图,这个账号是IIS80端口Application Pool的账号

找到Microsoft Excel Application CLSID {00020812-0000-0000-C000-000000000046}
点Security Tab修改,点Identity Tab 修改分别如下

也可以把默认修改一下,右击My Computer

附上C#运行宏程序的代码如下

引用

using Excel = Microsoft.Office.Interop.Excel;
//using Microsoft.Office.Core;

DLL: Microsoft.Office.Interop.Excel

并且设置dll属性Embed Interop Types为False,不然也会报错

1.使用方法

protected void Page_Load(object sender, EventArgs e)
{
try
{
// 返回对象
object objRtn = new object();
// 获得一个ExcelMacroHelper对象
// 执行指定Excel中的宏,执行时显示Excel
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//RunMoc(@"C:\Library\test.xlsm", "ThisWorkbook.getTime", null, out objRtn, false);
string source = @"\\xxxxx\Test\TEST.xlsm";
string destination = @"C:\Library\TEST.xlsm"; //File.Copy(destination,source,true); RunMoc(source, "TEST.xlsm!TEST.test", null, out objRtn, false); });
}
catch (System.Exception ex)
{
lb_error.Text = ex.Message;
}
}

2.运行方法

/// <summary>
/// 执行Excel中的宏
/// </summary>
/// <param name="excelFilePath">Excel文件路径</param>
/// <param name="macroName">宏名称</param>
/// <param name="parameters">宏参数组</param>
/// <param name="rtnValue">宏返回值</param>
/// <param name="isShowExcel">执行时是否显示Excel</param>
public void RunMoc(string excelFilePath,string macroName,object[] parameters,out object rtnValue,bool isShowExcel)
{
// 创建Excel对象示例
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
try
{
// 检查文件是否存在
if (!File.Exists(excelFilePath))
{
throw new System.Exception(excelFilePath + " 文件不存在");
}
#region 调用宏处理
// 准备打开Excel文件时的缺省参数对象
object oMissing = System.Reflection.Missing.Value;
// 根据参数组是否为空,准备参数组对象
object[] paraObjects;
if (parameters == null)
{
paraObjects = new object[] { macroName };
}
else
{
// 宏参数组长度
int paraLength = parameters.Length;
paraObjects = new object[paraLength + 1];
paraObjects[0] = macroName;
for (int i = 0; i < paraLength; i++)
{
paraObjects[i + 1] = parameters[i];
}
} // 判断是否要求执行时Excel可见
if (isShowExcel)
{
// 使创建的对象可见
oExcel.Visible = true;
}
// 创建Workbooks对象
Excel.Workbooks oBooks = oExcel.Workbooks;
// 创建Workbook对象
Excel._Workbook oBook = null;
// 打开指定的Excel文件
oBook = oBooks.Open(
excelFilePath,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing,
oMissing
); // 执行Excel中的宏
rtnValue = this.RunMacro(oExcel, paraObjects); // 保存更改
oBook.Save();
// 退出Workbook
oBook.Close(false, oMissing, oMissing);
#endregion
// 释放Workbook对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
oBook = null;
// 释放Workbooks对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
oBooks = null;
}
catch (Exception ex)
{
throw ex;
}
finally {
// 关闭Excel
oExcel.Quit();
// 释放Excel对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
oExcel = null;
// 调用垃圾回收
GC.Collect();
}
} /// <summary>
/// 执行宏
/// </summary>
/// <param name="oApp">Excel对象</param>
/// <param name="oRunArgs">参数(第一个参数为指定宏名称,后面为指定宏的参数值)</param>
/// <returns>宏返回值</returns>
private object RunMacro(object oApp, object[] oRunArgs)
{
try
{
// 声明一个返回对象
object objRtn;
// 反射方式执行宏
objRtn = oApp.GetType().InvokeMember(
"Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null,
oApp,
oRunArgs
); // 返回值
return objRtn;
}
catch (Exception ex)
{
// 如果有底层异常,抛出底层异常
if (ex.InnerException.Message.ToString().Length > 0)
{
throw ex.InnerException;
}
else
{
throw ex;
}
}
}

3.VBA代码,模块名字是TEST

Sub test()
With ThisWorkbook.Sheets("sheet1")
n = .Cells(, ).End(xlUp).Row +
.Cells(n, ) = Time
.Cells(n, ) = Date
End With
End Sub

  

使用Sharepoint定时运行Excel中宏程序的更多相关文章

  1. vb.net向Excel中写入值

    根据网上例子结合自己的工具环境修改后测试可以通过 我使用的工具:Microsoft Visual Studio 2010,Excel 2007 一.在D盘新建一个temp文件夹用于存放Excel启动时 ...

  2. Windows系统中设置Python程序定时运行方法

    Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索“计划任务”,并且点击打开“计划任务”: 2.点击“创建基 ...

  3. J2EE项目中后台定时运行的程序

    转自:http://www.2cto.com/kf/201311/260676.html 在开发J2EE项目中,有时候需要在后台定时执行一些代码. 比如定时对web数据建立倒排索引.定时发送邮件.定时 ...

  4. Excel中的宏--VBA的简单例子

    第一步:点击录制宏 第二步:填写宏的方法名 第三步:进行一系列的操作之后,关闭宏 第四步:根据自己的需要查看,修改宏 第六步:保存,一般是另存为,后缀名为.xlsm,否则宏语言不能保存. 到此为止恭喜 ...

  5. Quartz+log4net实现控制台程序定时运行,并且记录日志

    c# 控制台程序定时运行,并记录日志. 组件Quartz + log4net Quartz定时运行程序,log4net记录日志. 首先建立控制台程序"QuartzTest" 安装Q ...

  6. .NET遇上Docker - Docker集成Cron定时运行.NETCore(ConsoleApp)程序.md

    配置项目的Docker支持 对于VS中Docker的配置,依旧重复一些废话. 给项目添加Docker支持,VS2015可以直接使用Docker for VS插件,VS2017在安装时选择容器支持.VS ...

  7. Linux定时运行程序脚本

    项目开发中经常需要用将某个脚本定时运行从而避免其运行并不会影响到其他程序.虽说可以在脚本中利用sleep命令来做这一点,Linux自带了crontab命令可以很好的执行这一操作. 比如我们有名为som ...

  8. 在 Excel 中如何使用宏示例删除列表中的重复项

    概要:在 Microsoft Excel 中,可以创建宏来删除列表中的重复项.也可以创建宏来比较两个列表,并删除第二个列表中那些也出现在第一个(主)列表中的项目.如果您想将两个列表合并在一起,或者如果 ...

  9. Excel中添加并使用宏实现批量更新数据

    一.状况描述    当我们需要后台更新大量数据的时候,可以使用该功能.二.解決方案    (1)新建一个Excel文件,并另存为启用宏的Excel工作簿,扩展名为.xlsm.    (2)在Excel ...

随机推荐

  1. jQuery Raion, Select, CheckBox selector function

    Radio jQuery("input[type=checkbox][name='fbCqscsf.cqzdycqk']").not("[value=1]"). ...

  2. webkit内核分析之 Frame

    参考地址:http://blog.csdn.net/dlmu2001/article/details/6164873 1.    描述 Frame类是WebCore内核同应用之间联系的一个重要的类.它 ...

  3. datagrid 动态列

    var options={}; $(function(){ var myNj = 9; //初始化 $("#disgrid").datagrid({ type: 'POST', n ...

  4. [0x00 用Python讲解数据结构与算法] 概览

    自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...

  5. smartjs 0.3 DataManager 发布&介绍

    在0.3版加入了DataManager,基于策略的数据管理模块:是SmartJS中比较重要的一个系列.整个个DataManager模块包括有:dataManager,dataPolicyManager ...

  6. java中反射机制通过字节码文件对象获取字段和函数的方法

    pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...

  7. 左倾堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了左倾堆,本章给出左倾堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 左倾堆的介绍2. 左倾堆的图文解析3. 左倾堆的Java实现(完整 ...

  8. .NET通用开发框架

    在开源中国社区,简单整理了下比较好的.NET通用开发框架.一个好的通用框架大概包括:开源.扩展性好.灵活性好.复用性好.维护性好.易测试.易发布.易部署.快速业务搭建(或业务集成).通用性强.参考资料 ...

  9. 将查询字符串解析转换为泛型List的名值集合.

    ///<summary> ///将查询字符串解析转换为泛型List的名值集合. ///</summary> ///<param name="queryStrin ...

  10. 浅析LRU(K-V)缓存

    LRU(Least Recently Used)算法是缓存技术中的一种常见思想,顾名思义,最近最少使用,也就是说有两个维度来衡量,一个是时间(最近),一个频率(最少).如果需要按优先级来对缓存中的K- ...