1. 问题背景
在尝试使用 Aspose.Words 库执行 COM 互操作时,遇到了一个关键问题:无法设置颜色。理论上,可以通过向 DocumentBuilder.Font.Color 赋值来设置颜色,但尝试时却出现了 OLE 错误 0x80131509。
以下代码示例演示了这个问题:
from win32com.client import Dispatch
Doc = Dispatch("Aspose.Words.Document")
Builder = Dispatch("Aspose.Words.DocumentBuilder")
Builder.Document = Doc
print Builder.Font.Size
print Builder.Font.Color
执行这段代码后,输出结果为:
12.0
Traceback (most recent call last):
File "aaa.py", line 6, in <module>
print Builder.Font.Color
File "D:\Python26\lib\site-packages\win32com\client\dynamic.py", line 501, in __getattr__
ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
pywintypes.com_error: (-2146233079, 'OLE error 0x80131509', None, None)
```python
尝试使用像 Font.Color = 0xff0000 这样的方式设置颜色也会出现同样的错误消息。
然而,以下代码在 C# 中可以正常工作:
```python
using Aspose.Words;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Font.Color = System.Drawing.Color.Blue;
builder.Write("aaa");
doc.Save("c:\\1.doc");
}
}
}
```python
这表明问题很可能出在 COM 互操作上。
## 2. 解决方案
要解决这个问题,可以使用以下两种方法之一:
* **方法一:使用 Aspose.Words .NET 库**
这种方法是使用 Aspose.Words 的 .NET 库,这是一种用于 .NET 平台的 Word 处理库。它提供了与 COM 互操作类似的功能,但可以避免 COM 互操作中出现的问题。
要使用 Aspose.Words .NET 库设置颜色,可以按照以下步骤操作:
1. 创建一个 Document 对象。
2. 创建一个 DocumentBuilder 对象,并将其与 Document 对象关联。
3. 设置 DocumentBuilder.Font.Color 属性。
4. 将文档保存到文件中。
以下代码示例演示了如何使用 Aspose.Words .NET 库设置颜色:
```python
using Aspose.Words;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Font.Color = System.Drawing.Color.Blue;
builder.Write("aaa");
doc.Save("c:\\1.doc");
}
}
}
-
方法二:使用 System.Drawing.ColorConverter
这种方法是使用 System.Drawing.ColorConverter 类,它可以将字符串或十六进制值转换为 System.Drawing.Color 对象。然后,可以使用此 System.Drawing.Color 对象来设置 DocumentBuilder.Font.Color 属性。
以下代码示例演示了如何使用 System.Drawing.ColorConverter 类设置颜色:
from win32com.client import Dispatch
Doc = Dispatch("Aspose.Words.Document")
Builder = Dispatch("Aspose.Words.DocumentBuilder")
Builder.Document = Doc
print Builder.Font.Size
Converter = ColorConverter()
Color = Converter.ConvertFromString("Blue")
Builder.Font.Color = Color
print Builder.Font.Color
执行这段代码后,输出结果为:
12.0
16776960
这表明通过 System.Drawing.ColorConverter 类设置颜色成功了。