使用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 ...
随机推荐
- [转]非OpenVZ下利用谷歌TCP-BBR协议单边加速你的VPS
前段时间谷歌推出了新的 TCP-BBR 开源算法,可以起到单边加速 TCP 连接的效果,也就是不用客户端的配合,用来替代收费的锐速再合适不过,毕竟开源免费.TCP-BBR 的目的是要尽量跑满带宽,并且 ...
- Material Design UI Widgets
Android L 开发者预览支持库提供两个新的Widgets,RecyclerView和CardView.使用这两个Widgets可以显示复杂的Listview和卡片布局,这两个Widgets默认使 ...
- Java获取路径方法&相对路径读取xml文件方法
(1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...
- 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别
网络爬虫的基本操作是抓取网页.首先要了解下URL~~ 在理解URL之前,先了解下URI,这两个概念我曾经混淆过~@_@|| 什么是URI? Web上每种可用的资源,如:html文档.视频,图片等都由一 ...
- 使用TFS+GIT实现分布式项目管理
前言 GIT是近来很流行的一种版本控制系统,是Linux内核之父Linus Torvalds为了管理Linux内核的开发而开发的一种开源的版本控制工具. GIT相比传统的版本控制工具最大的优点是实现了 ...
- Linux sed Examples--转载
原文地址:https://www.systemcodegeeks.com/shell-scripting/bash/linux-sed-examples/?ref=dzone Sed is basic ...
- 免费下载!Twitter Bootstrap V3 矢量界面素材
Bootstrap 3 Vector UI Kit 包含所有矢量格式的 Twitter Bootstrap 3 界面控制元素.Glyphicons 以及额外的一些界面素材,而且基本的图形元素都切好图了 ...
- fork()函数详解
原文链接:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函 ...
- Android 定时器
Andorid定时器封装类 public class TimerUtil { private static final String TAG = "TimerUtil"; priv ...
- JavaScript之旅(二)
JavaScript之旅(二) 二.进阶知识 js的正则表达式 异常处理 调试 变量提升 表单验证 JSON javascript:void(0) JavaScript 代码规范 二.进阶知识 1. ...