如何在python中为OneNote COM API构造类型常量?

时间:2015-10-21 14:54:24

标签: python com ms-office onenote

我想通过python win32com模块使用 import win32com from bs4 import BeautifulSoup oneNoteApp = win32com.client.Dispatch('OneNote.Application') pageID = '{603BD3F0-4DAB-4E5B-8E28-28CA0F2B0C83}{1}{B0}' # from GetHierarchy content = oneNoteApp.GetPageContent(pageID) soup = BeautifulSoup(content, 'xml') # ... modify xml (changes are valid and tested using MATLAB) oneNoteApp.UpdatePageContent(soup) # problem is here COM方法documentation。到目前为止,我可以做的事情包括获取层次结构,获取页面内容等。我甚至可以有效地操作XML来准备更改(使用MATLAB COM接口测试)。

这是我想要做的最小例子:

UpdatePageContent

现在这最后一行很棘手。根据COM文档,win32com的所有其他参数都是可选的。但是 C:\...\Temp\gen_py\3.4\0EA692EE-BB50-4E3C-AEF0-356D91732725x0x1x0.py in UpdatePageContent(self, bstrPageChangesXmlIn, dateExpectedLastModified, xsSchema, force) 240 _prop_map_get_ = { 241 "COMAddIns": (104, 2, (9, 0), (), "COMAddIns", None), --> 242 "Dummy1": (102, 2, (11, 0), (), "Dummy1", None), 243 "LanguageSettings": (105, 2, (9, 0), (), "LanguageSettings", None), 244 # Method 'Windows' returns object of type 'Windows' ValueError: astimezone() cannot be applied to a naive datetime 自动生成的绑定似乎存在错误。在示例中调用我得到像

这样的错误
ExpectedDateLastModified

所以oneNoteApp.UpdatePageContent(content, 0)默认参数似乎被打破了。传递像pywintypes.TimeType这样的显式零会产生另一个错误。

我到目前为止尝试过的其他事情是构建一个DateTime.minValue我自己,其值与.net运行时的astimezone()常量相同,但是缺少时区信息(pywintypes.TimeType误差)。

我尝试了几种方法来添加时区信息,包括在datetime构造函数中传递它并使用日期时间(它似乎不会被生成的COM绑定自动转换)。

另一种方法是使用显式时间戳,从xml解析它们,但那些使用<script type="text/javascript"> function burgersub(){ if(document.getElementById("burg").value - 1 < 0) return; else document.getElementById("burg").value--; } function burgeradd(){ var quantity = document.getElementById("quantity").value++; quantity++; var price = document.getElementById("price").value; alert(quantity); if (price) { document.getElementById("burg").value = price * quantity; } } </script> p><button class="btn btn-default" onclick="burgeradd()">+</button><button class="btn btn-default" onclick="burgersub()">-</button></p> <input readonly="yes" class="form-control" id="quantity" placeholder="Quantity"> <input readonly="yes" class="form-control" id="burg" placeholder="Amount"> <input class="form-control" id="price" placeholder="Price"> 模块有问题的毫秒。

如何构造有效的时间类型零以传递给COM接口?在MATLAB中,我可以传递一个文字0。

编辑:我知道这个git repo及相关代码和网上的几篇博文。代码也使用文字0调用onenote COM,但是我无法使软件包甚至加载COM接口。

编辑2:我运行了onepy并且遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

这个问题在此期间已经过时了,但是我想展示一个有效的解决方案,我在试图找到类似的东西时发现了这个解决方案。问题是您需要一个时区感知日期才能在其上调用astimezone(),这就是API出于某种原因所做的事情。要创建时区感知日期,您必须先将其本地化。例如,您可以按如下方式修改代码:

import datetime
import pytz

...
date = pytz.utc.localize(datetime.datetime(year = 1899, month = 12, day = 30))
oneNoteApp.UpdatePageContent(soup, date)

实际问题是提交一个合适的日期传递给UpdatePageContent()。我的答案中的奇怪选择是详细here