我创建了一个带有宏的pptm文件,可以打开某些pptx模板.然后我创建了一个新选项卡,其中包含用于打开文件的按钮 我将我创建的宏附加到这些按钮上.只要我的pptm文件打开,所有工作都很棒.但是在我将其保存为ppam文件并将其作为加载项安装后,它将不再有效.似乎宏没有出现,按钮仍然试图通过pptx名称引用宏.
有谁知道创建自定义选项卡以启动预定义模板的简单方法?或者像Word一样默认加载宏?或者解决我上面的情况?我看到的唯一选择是加载项,它只会显示在加载项选项卡下.
我正在使用C#为Office 2007创建一个插件.只要用户在"收件箱"窗格中单击电子邮件列表中的电子邮件,此插件就会负责在新窗格中显示电子邮件标头信息.现在,我不确定当用户选择电子邮件并阅读该电子邮件标题信息时,如何在"收件箱"窗格中显示鼠标单击事件.任何有用的指针?
我正在尝试本地化我的Office加载项,我已经阅读了许多有关如何执行此操作的文档和教程,但是他们都教过如何基于当前Windows语言(不一定是哪种Office语言界面)进行本地化。包正在使用中。
因此,我最终遇到了这样的情况,我的Windows语言是法语,我没有任何办公语言界面包,因此Office中的所有菜单都是英语,除了我的外接程序是法语。看起来有些奇怪,所以我想知道是否有一种方法可以根据当前使用的办公语言界面包进行本地化。
最近我写了一个outlook加载项,它有一个ribbon.xml文件,用于额外的功能区,上下文菜单等.我还添加了一个额外的面板停靠在我的窗口右侧.
现在我开始研究如何为Visio创建加载项.ribbon.xml实际上是相同的,所以这根本不是问题.但是,在打开Visio文档时,我似乎无法找到任何方法来添加自定义面板.
到目前为止,我在Visio中知道是否打开/创建/更改了文档:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
MessageBox.Show("Visio Add-In V1");
Globals.ThisAddIn.Application.DocumentChanged += new Visio.EApplication_DocumentChangedEventHandler(docChanged);
Globals.ThisAddIn.Application.DocumentOpened += new Visio.EApplication_DocumentOpenedEventHandler(docChanged);
Globals.ThisAddIn.Application.DocumentCreated += new Visio.EApplication_DocumentCreatedEventHandler(docChanged);
}
private void docChanged(Visio.Document doc)
{
MessageBox.Show("Document loaded");
}
Run Code Online (Sandbox Code Playgroud)
在outlook中我会这样做来添加一个自定义面板(简化):
MyPanel ctrl = new MyPanel();
Microsoft.Office.Tools.CustomTaskPane ctp = Globals.ThisAddIn.CustomTaskPanes.Add(ctrl, title);
ctp.Visible = true;
ctp.Width = 300;
ctp.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionRight;
Run Code Online (Sandbox Code Playgroud)
现在,我将如何在Visio 2013加载项中执行此操作?
编辑:
不幸的是,这让我认为这是不可能的:http: //msdn.microsoft.com/en-us/library/vstudio/bf08984t.aspx
EDIT2:
以下答案应该有效:Visio VSTO中是否有可用的任务窗格?
但是,我似乎找不到在主窗口上获得停靠面板的方法.这是我尝试过的:
Globals.ThisAddIn.Application.Windows.Add("testpanel", VisWindowStates.visWSDockedLeft, VisWinTypes.visStencilAddon, null, null, null, 300);
Run Code Online (Sandbox Code Playgroud)
这会将窗口添加为新图纸...
EDIT3:
Visio抛出一个COM异常,说我的窗口类型无效.
Application.Windows.Add("testpanel", VisWindowStates.visWSDockedRight, VisWinTypes.visAnchorBarAddon, null, …Run Code Online (Sandbox Code Playgroud) iOS上的Microsoft Office应用程序可以从云服务打开文档,例如OneDrive,Dropbox,iCloud,SharePoint等:
在Windows桌面版Microsoft Office中,您可以使用注册表项将自己的选项添加到此列表中.
在iOS的情况下,我可以将我的选项添加到云服务列表吗?我想我需要开发MS Office加载项才能做到这一点,但它应该是什么类型的加载项?
我开发了一个工作正常的Outlook Web加载项.这是一个Taskpane,可以在约会的撰写模式中使用,它可以收集事件的数据,添加一些数据并将其全部发送到某个API.
我现在要做的是将经过身份验证的用户订阅到Outlook Rest API,以便在删除事件时收到通知.
订阅调用应该如下所示:
POST https://outlook.office.com/api/v2.0/me/subscriptions HTTP/1.1
Content-Type: application/json
{
@odata.type:"#Microsoft.OutlookServices.PushSubscription",
Resource: "https://outlook.office.com/api/v2.0/me/events",
NotificationURL: "https://myNotifAPI.azurewebsites.net/api/send/myNotifyClient",
ChangeType: "Deleted",
ClientState: "blabla"
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要在发布到订阅URL时提供有效的身份验证承载令牌,因此我尝试在我的加载项中调用此方法:
_mailbox = Office.context.mailbox;
_mailbox.getUserIdentityTokenAsync(getUserIdentityTokenCallback);
Run Code Online (Sandbox Code Playgroud)
在函数中getUserIdentityTokenAsync,我调用一个WebApi Controller来验证我的令牌并将其发送回加载项:
AppIdentityToken token = (AppIdentityToken)AuthToken.Parse(rawToken);
token.Validate(new Uri(request.AudienceUrl));
return token;
Run Code Online (Sandbox Code Playgroud)
我试图使用该令牌发布到https://outlook.office.com/api/v2.0/me/subscriptions(使用Postman),但我得到了401说:
reason="The audience claim value is invalid '<MyAddInURL>'.";error_category="invalid_resource"
Run Code Online (Sandbox Code Playgroud)
它是在特定情况下使用的正确令牌还是我需要另一个?任何建议将不胜感激!
- 编辑 -
正如@ benoit-patra所建议的那样,我尝试使用getCallbackTokenAsync而不是使用令牌,getUserIdentityTokenAsync但是当我打电话时,https://outlook.office.com/api/v2.0/me/subscriptions我确实收到了403:
"error": {
"code": "ErrorAccessDenied",
"message": "The api you are trying to access does not support item scoped OAuth."
} …Run Code Online (Sandbox Code Playgroud) office-addins outlook-addin outlook-restapi office-js outlook-web-addins
我正在开发/测试Excel加载项。我使用此处概述的“共享文件夹目录”过程将其添加到了桌面版本:
我为新的功能区命令更新了清单XML,但没有更新Excel。我无法更新/删除/重新安装从“共享文件夹”安装的加载项。我尝试删除外接程序目录,然后在“信任中心设置”中重新添加它,但这没有用。
我正在为Outlook实现一个加载项,加载项获取一个附件并将其发送到我的服务器进行处理.它在https://outlook.office.com上运行完美,但无法运行Outlook 2016 for Mac.
这是我试图访问的API:
var getMessageUrl =Office.context.mailbox.restUrl + '/v2.0/me/messages/' +
{messageID} + "/attachments/" + {attachmentID};
var attachmentID = Office.context.mailbox.item.attachments[0].id;
var messageID = getItemRestId();
$.ajax({
url: getMessageUrl,
dataType: 'json',
headers: {
'Authorization': 'Bearer ' + outlookToken
}
}).done(function 1(response) {
//upload the blob to my server
}).fail(function (error) {
//call authorise to get a new token
});
function getItemRestId() {
if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS') {
// itemId is already REST-formatted
return Office.context.mailbox.item.itemId;
} else {
// Convert to …Run Code Online (Sandbox Code Playgroud) javascript office-addins office-js outlook-web-addins outlook-for-mac
环境:Mac 10.12.6,Word 2016(16.11.1),@ microsoft/office-js"^ 1.1.4"
我想知道在如何使用CustomXMLParts方面有任何指导方针或最佳实践,以便最大限度地提高读/写性能,或者是否有一种"理想"方式来为同一目的在XML部件中建模数据.
我正在编写一个加载项,我需要在可见文档之外保留一些数据,但是在docx文件中.
例如,我存储了一张发票清单(可能是100-200张发票),每张发票都有典型的结构化数据(名称,ID,日期,工作项列表)和自由式备注部分,最多可包含5个-10kb的文字,说明等
我拿这些发票,在Word文档中渲染其中一些,然后在任务窗格中对其余数据进行一些可视化分析 - 用户可以将注释写入(并保存)回自定义XML部件(到该发票中)他们正在看).
现在......这里我有点困惑......我不确定将每张发票作为单独的CustomXMLPart存储在文件中是否更好(例如每张发票1个XML文件),或者是否最好存储所有发票在单个大型CustomXMLPart中,或者如果存在中间地点(例如,每个XML部分有10个发票).如上所述,用例是回读所有发票,然后偶尔更新10-20%的发票中的数据.
现在,我正在为每个XML部分存储1个发票,当我加载我的插件并进行批量读取以将所有内容都存入内存时,每个发票需要250-500平方英寸才能将它们并行读取(所以,250-500ms*100-200发票).顺序地,它需要更长的时间(2-3倍长).使用performance.now()使用挂钟计时进行测试.
这似乎很长一段时间,所以我不知道我是否做错了 - 或者这只是从这些文件中打开和提取数据所需的时间?
// Sequential example - excluding error handling and type-safety
// Parallel equivalent is essentially a Promise.all with a .map
// Approx 50ms
let result = await this.xmlPartsHelper.getByNamespaceAsync(...);
for (const item of result.value) {
// Approx 150-200ms
result = await this.xmlPartsHelper.getByIdAsync(item.id);
// Approx 150-200ms
result = await this.xmlPartsHelper.getXmlAsync(result.value);
// Approx 5ms
const invoice = this.mapper.reverseMap(result.value);
invoices.push(invoice)
}
Run Code Online (Sandbox Code Playgroud)
我使用Promises手动包装Office-JS回调,但我已经使用async/await,然后是/ catch和office-js回调测试了这个示例 - 结果大致相同.
public getByNamespaceAsync(namespace: string): Promise<Office.AsyncResult> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MouseKeyboardActivityMonitor Nugget收听Word AddIn中的键盘输入。当我注册KeyboardHookListener时,我可以接收除Word以外的每个程序上的每个键盘输入。
这可能是某些Word内部保护的原因,还是我缺少了什么?
我有Windows 7 64位和Word 2016 32位。
k_keyListener = new KeyboardHookListener(new GlobalHooker());
k_keyListener.Enabled = true;
k_keyListener.KeyDown += new System.Windows.Forms.KeyEventHandler(hook_OnKeyDown);
public void hook_OnKeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
log.Info("Pressed key: " + e.KeyCode.ToString());
}
Run Code Online (Sandbox Code Playgroud) office-addins ×10
c# ×4
ms-office ×4
office-js ×4
.net ×1
cloud ×1
excel ×1
excel-addins ×1
ios ×1
javascript ×1
localization ×1
ms-word ×1
officedev ×1
outlook ×1
outlook-2007 ×1
powerpoint ×1
vba ×1
visio ×1
vsto ×1