从Excel中的某个范围中获取值时,以"批量"(作为2D数组)获取值比循环遍历每个行和列更有效.例如:
Dim range = Globals.Table.Range("A1:E5")
Dim values(,) As Object = range.Value
Run Code Online (Sandbox Code Playgroud)
对于25个单元格而言,它没有太大的区别,但它确实有10,000行乘20列.到现在为止还挺好.
我的问题是:有没有人找到一种方法对其他属性进行同样的"批量"提取?例如,我想找到哪种细胞以某种方式着色.我很乐意做类似"range.Interior.Color"的事情,但只返回一个值,而不是一个值数组.所以我最终循环,这可能慢100或甚至1000倍.对于大型桌子,这真的是一个杀手.
PS:看起来像.Formula就像.Value:我可以一次取多个.但是我还没有把颜色变成好玩的颜色.
我感谢您的帮助!
有没有一种方法可以强制进行超属性检查,而不仅仅是对内联对象文字进行检查,而是从变量派生?
例如,假设我有一个接口和一个函数
interface Animal {
speciesName: string
legCount: number,
}
function serializeBasicAnimalData(a: Animal) {
// something
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话
serializeBasicAnimalData({
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
})
Run Code Online (Sandbox Code Playgroud)
我会得到一个错误-对于我的情况,这就是我想要的。我只希望函数接受通用的动物描述,而无需额外的细节。
另一方面,如果我首先为其创建变量,则不会收到错误消息:
var weirdAnimal = {
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
};
serializeBasicAnimalData(weirdAnimal);
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否有一种方法可以强制TypeScript对函数参数应用“多余的属性检查”,而不管它是内联对象还是先前已分配给变量的对象?
看起来将列表的枚举器传递给函数"byval"与传递"byref"完全不同.基本上,常规的"byval"传递不会改变调用者的"enumerator.Current值",即使该函数使枚举器前进.我想知道是否有人知道为什么会这样?枚举器是一个整数的原语,没有对象引用,因此对它的更改不会反映在调用者中吗?
以下是示例代码:
这个函数是byval,并且陷入无限循环,吐出"1"消息框,因为枚举器的"当前"从未超过5:
Public Sub listItemsUsingByValFunction()
Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
Dim enumerator = list.GetEnumerator()
enumerator.MoveNext()
While enumerator.Current <= 5
listFirstItemByVal(enumerator)
End While
End Sub
Private Sub listFirstItemByVal(ByVal enumerator As List(Of Integer).Enumerator)
MsgBox(enumerator.Current)
enumerator.MoveNext()
End Sub
Run Code Online (Sandbox Code Playgroud)
另一方面,这可以像人们期望的那样工作:
Public Sub listItemsUsingByRefFunction()
Dim list As New List(Of Integer)(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
Dim enumerator = list.GetEnumerator()
enumerator.MoveNext()
While enumerator.Current <= 5
listFirstItemByRef(enumerator)
End …Run Code Online (Sandbox Code Playgroud) 我确信有聪明的人可以让任何东西在 Azure 函数上运行,但是使用它来运行 Office 加载项有意义吗?我读到它非常适合运行小段代码,这就是我当前在 Azure 上作为 Web 应用程序运行的加载项。
我正在使用 JavaScript API 开发 Excel 加载项以在 Excel Office 365 中构建加载项。对于 Excel 表,如何将整个列的格式设置为默认情况下仅包含字符串。[我需要数字在特定列的所有单元格中显示为 012 而不是 12。]
我正在开发外接程序,但是遇到错误。
一堆东西被打印到控制台上,其中一些是:

这意味着什么?如何启用该设置?
在哪里可以找到office.js的稳定TypeScript定义?我正在开发一个O365应用程序作为MailApp,在我的项目中我使用的是打字稿.
我很喜欢https://www.napacloudapp.com/External/O365/Office.Common.d.ts 但是没有找到任何文档和路线图来进一步更新.
我为单词创建了一个任务窗格插件,该插件运行搜索并以列表形式向用户显示有关结果的信息。当用户单击列表中的某个项目时,我想选择字词范围以向用户显示该项目的位置。然后,该插件将允许用户在范围上执行其他任务,例如更改字体颜色。
我可以使用以下功能运行搜索并获取显示范围:
function runSearch(textToFind) {
var items = [];
return Word.run(function(context) {
var options = Word.SearchOptions.newObject(context);
options.matchWildCards = false;
var rangesFind = context.document.body.search(textToFind, options);
context.load(rangesFind, 'text, font, style');
return context.sync().then(function() {
for (var i = 0; i < rangesFind.items.length; i++) {
items.push(rangesFind.items[i]);
context.trackedObjects.add(rangesFind.items[i]);
}
return context.sync();
});
})
.then(function() {
return items;
});
};
Run Code Online (Sandbox Code Playgroud)
但是,我在选择用户点击范围时遇到困难。我试过使用range上下文:
function selectRange(range){
range.select();
return range.context.sync();
}
Run Code Online (Sandbox Code Playgroud)
或在新的Word.run上下文中使用范围:
function selectRange(range){
return Word.run(function(context) {
context.load(range);
return context.sync().then(function(){
range.select();
return context.sync();
});
});
}
Run Code Online (Sandbox Code Playgroud)
我遇到了一种潜在的方法,该方法涉及为每个搜索结果创建一个内容控件,然后selectRange在新的上下文中重新加载该函数中的所有内容控件,并找到匹配的控件,但是当我已经有了范围时,这似乎效率很低。
在不同的Word.run上下文中重用范围的最佳方法是什么?
我正在使用AngularJS处理PowerPoint-AddIn.要获取用户语言,我使用Office.context.displayLanguage,它仅在Office.initialize -Callback中可用.我通过Angular-Factory获得了我的语言字符串.当我将Office.initialize -Callback放入我的Angular Controller中时,它会破坏Controller-Functionality,并且我的页面上的按钮不再有效.我究竟做错了什么?
myApp.controller('angularHomeController', ['$scope', 'lang', function ($scope, lang) {
$scope.lang = lang.getLocaleStrings("en-US");
Office.initialize = function (reason) {
$scope.lang = lang.getLocaleStrings(Office.context.displayLanguage);
}
}]);
Run Code Online (Sandbox Code Playgroud)
我将语言默认设置为英语,但我希望在初始化文档时更改它并且我可以访问displayLanguage.我的应用程序工作正常,直到我将Office.initialize -Callback放在我的控制器内.我应该以某种方式注入Office对象吗?我没有收到任何错误消息.
我喜欢类型安全,这就是我喜欢打字稿的原因.
但是,我发现在最终必须明确声明额外变量以获得我需要的类型安全性的情况.
更新的例子:
假设我想在一个字符串数组上调用".join",我真的想确保它是一个字符串数组(而不是像对象那样最终输出为[object Object]):
如果我只是在这里执行此代码,它不会阻止我意外地传入一个对象somethingElse:
如果我为urlParts它创建一个数组并键入它string[],我可以防止这个问题:
const baseUrl = "https://stackoverflow.com/"
const somethingElse = { not: "a string" };
const urlParts: string[] = [baseUrl, somethingElse];
window.location.replace(urlParts.join("\n"))
Run Code Online (Sandbox Code Playgroud)
但是,如果没有创建一个urlParts我希望避免的单独变量,似乎没有办法让我这样做.例如,通过以下之一:
window.location.replace(([baseUrl, somethingElse] as string[]).join("\n"))
window.location.replace((<string[]>[baseUrl, somethingElse]).join("\n"))
Run Code Online (Sandbox Code Playgroud)
我发现避免创建变量的唯一方法是将结果内联为一个自执行的匿名强类型函数 - 但这似乎是一个荒谬的解决方法:
window.location.replace(((): string[] => [baseUrl, somethingElse])().join("\n"))
Run Code Online (Sandbox Code Playgroud)
这是一个TypeScript错误/差距吗?或者我错过了什么?
我问几位同事,看他们是否有任何想法,但我们无法弄清楚如何获得更严格的类型.
谢谢!
office-js ×6
typescript ×3
excel ×2
office365 ×2
.net ×1
angularjs ×1
azure ×1
enumerator ×1
javascript ×1
ms-office ×1
ms-word ×1
powerpoint ×1
scriptlab ×1
vb.net ×1
vsto ×1