回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>使用<a href="http://starship.python.net/crew/theller/comtypes/" rel="nofollow noreferrer">^{<cd1>}</a>来驱动Python,似乎有一些魔术正在幕后发生,它们没有将元组和列表转换为<code>VARIANT</code>类型:</p>
<pre><code># RANGE(“C14:D21”) has values
# Setting the Value on the Range with a Variant should work, but
# list or tuple is not getting converted properly it seems
>>>from comtypes.client import CreateObject
>>>xl = CreateObject("Excel.application")
>>>xl.Workbooks.Open(r'C:\temp\my_file.xlsx')
>>>xl.Visible = True
>>>vals=tuple([(x,y) for x,y in zip('abcdefgh',xrange(8))])
# creates:
#(('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6), ('h', 7))
>>>sheet = xl.Workbooks[1].Sheets["Sheet1"]
>>>sheet.Range["C14","D21"].Value()
(('foo',1),('foo',2),('foo',3),('foo',4),('foo',6),('foo',6),('foo',7),('foo',8))
>>>sheet.Range["C14","D21"].Value[()] = vals
# no error, this blanks out the cells in the Range
</code></pre>
<p>根据<code>comtypes</code><a href="http://starship.python.net/crew/theller/comtypes/" rel="nofollow noreferrer">docs</a>:</p>
<blockquote>
<p>When you pass simple sequences (lists or tuples) as <code>VARIANT</code>
parameters, the COM server
will receive a <code>VARIANT</code> containing a <code>SAFEARRAY</code> of <code>VARIANT</code>s with the
typecode <code>VT_ARRAY</code> | <code>VT_VARIANT</code>.</p>
</blockquote>
<p>这似乎与<a href="http://msdn.microsoft.com/en-us/library/aa139976%28office.10%29.aspx" rel="nofollow noreferrer">what MSDN says</a>有关将数组传递到范围值的内联。我还发现<a href="http://blogs.msdn.com/eric_carter/archive/2004/05/04/126190.aspx" rel="nofollow noreferrer">this page</a>在C中显示了类似的内容。有人能告诉我我做错了什么吗?</p>
<p><strong>编辑</strong></p>
<p>我想出了一个更简单的例子,其执行方式与此相同(在这方面,它不起作用):</p>
<pre><code>>>>from comtypes.client import CreateObject
>>>xl = CreateObject("Excel.application")
>>>xl.Workbooks.Add()
>>>sheet = xl.Workbooks[1].Sheets["Sheet1"]
# at this point, I manually typed into the range A1:B3
>>> sheet.Range("A1","B3").Value()
((u'AAA', 1.0), (u'BBB', 2.0), (u'CCC', 3.0))
>>>sheet.Range("A1","B3").Value[()] = [(x,y) for x,y in zip('xyz',xrange(3))]
# Using a generator expression, per @Mike's comment
# However, this still blanks out my range :(
</code></pre>