使用Sharepoint定时运行Excel中宏程序
需求:
因为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中宏程序的更多相关文章
- vb.net向Excel中写入值
根据网上例子结合自己的工具环境修改后测试可以通过 我使用的工具:Microsoft Visual Studio 2010,Excel 2007 一.在D盘新建一个temp文件夹用于存放Excel启动时 ...
- Windows系统中设置Python程序定时运行方法
Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索“计划任务”,并且点击打开“计划任务”: 2.点击“创建基 ...
- J2EE项目中后台定时运行的程序
转自:http://www.2cto.com/kf/201311/260676.html 在开发J2EE项目中,有时候需要在后台定时执行一些代码. 比如定时对web数据建立倒排索引.定时发送邮件.定时 ...
- Excel中的宏--VBA的简单例子
第一步:点击录制宏 第二步:填写宏的方法名 第三步:进行一系列的操作之后,关闭宏 第四步:根据自己的需要查看,修改宏 第六步:保存,一般是另存为,后缀名为.xlsm,否则宏语言不能保存. 到此为止恭喜 ...
- Quartz+log4net实现控制台程序定时运行,并且记录日志
c# 控制台程序定时运行,并记录日志. 组件Quartz + log4net Quartz定时运行程序,log4net记录日志. 首先建立控制台程序"QuartzTest" 安装Q ...
- .NET遇上Docker - Docker集成Cron定时运行.NETCore(ConsoleApp)程序.md
配置项目的Docker支持 对于VS中Docker的配置,依旧重复一些废话. 给项目添加Docker支持,VS2015可以直接使用Docker for VS插件,VS2017在安装时选择容器支持.VS ...
- Linux定时运行程序脚本
项目开发中经常需要用将某个脚本定时运行从而避免其运行并不会影响到其他程序.虽说可以在脚本中利用sleep命令来做这一点,Linux自带了crontab命令可以很好的执行这一操作. 比如我们有名为som ...
- 在 Excel 中如何使用宏示例删除列表中的重复项
概要:在 Microsoft Excel 中,可以创建宏来删除列表中的重复项.也可以创建宏来比较两个列表,并删除第二个列表中那些也出现在第一个(主)列表中的项目.如果您想将两个列表合并在一起,或者如果 ...
- Excel中添加并使用宏实现批量更新数据
一.状况描述 当我们需要后台更新大量数据的时候,可以使用该功能.二.解決方案 (1)新建一个Excel文件,并另存为启用宏的Excel工作簿,扩展名为.xlsm. (2)在Excel ...
随机推荐
- SharePoint 2010中重置windows 活动目录(AD)域用户密码的WebPart(免费下载)
由于SharePoint 2013推出不久,并非所有的企业都会升级到SharePoint 2013的,毕竟升级不是打打补丁这么简单,更多的企业还是使用Sharepoint 2010版本的,因此本人自行 ...
- MyBatis知多少(8)关系型数据库
MyBatis的存在就是为了简化对关系数据库的访问.数据库的确非常复杂,要正确地使用它们需要做很多的工作.数据库负责管理数据和修改数据.我们使用数据库而不简简单单地使用一个 平板文件的原因就在于数据库 ...
- The connection to adb is down, and a severe error has occured.(DDMS中没有真机)
最近老是出现真机用着用着就掉线了,在DDMS中看不到,运行项目出现选择运行机器中也没有,360助手连接电脑OK,任务管理器中没有adb.exe,重启eclipse不行,只能每次重启电脑.按照http: ...
- Shader Overview
Unity有三种形式的Shader: (1)Surface Shaders:对光照管线的高层抽象,受光照和影子效果影响的shader,使用Cg/HLSL语言编写:不进行light相关操作的shader ...
- 使用 Responsive Elements 快速构建响应式网站
Responsive Elements 可以使任何元素来适应和应对他们所占据的区域.这是一个轻量的 JavaScript 库,你可以轻松嵌入到你的项目.元素会更具自己的宽度,自动响应和适应空间的增加或 ...
- 为什么NOLOCK查询提示是个不明智的想法
一些人总当NOLOCK查询提示是SQL Server里的加速器,因为它避免了大量的死锁情景.在这篇文章里,我想向你展示下为什么NOLOCK查询提示是个不好的想法. 脏读(Dirty Reads) NO ...
- AutoTransformHandler
public static ObservableCollection<F> Transform<T, F>(List<T> target) where F : ne ...
- Gradle学习系列之七——依赖管理
在本系列的上篇文章中,我们讲到了如何使用java Plugin,在本篇文章中,我们将讲到Gradle的依赖管理. 请通过以下方式下载本系列文章的Github示例代码: git clone https: ...
- P6 EPPM 16 R1 文档和帮助系统
P6 EPPM 16 R1 文档和帮助系统 https://docs.oracle.com/cd/E74894_01/ http://docs.oracle.com/cd/E68202_01/clie ...
- App.Config详解
App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...