Excel COM 自动化,255 个限制
Excel COM Automation, 255 limit
我使用 Excel.Application COM 对象自动生成依赖于 Excel 的文档。
本质上,输入是一个简单的 HTML 字符串,只有跨度、粗体和斜体标签。
我擦除相关单元格的内容,解析这个 HTML 字符串,然后将字符附加到相关单元格,调整字体和字体颜色,如下所示:
offset = Range.Characters().Count
Range.Characters(offset + 1).Insert("Hello");
Range.Characters(offset + 1).Font.Bold = True
它适用于少于 255 个字符的内容,但达到这个数字时,单元格中不会附加任何内容,偏移量始终为 255。
有什么想法吗?如果我打开 excel 并手动将内容写入单元格,则我没有此限制。
这是一个解决方法,它依赖于 Excel 能够打开一个仅包含 HTML 的文件,该文件被格式化为 table:
Sub Tester()
Dim ws As Worksheet
HTMLtoRange ActiveSheet.Range("B2").Value, ActiveSheet.Range("B4")
End Sub
'Take some HTML, write it to a file as a table,
' open the file in Excel, and copy A1 to `c`
Sub HTMLtoRange(HTML As String, c As Range)
Dim fName As String
With CreateObject("scripting.filesystemobject")
fName = .getSpecialFolder(2).Path & "\" & .getTempName() & ".xls"
.opentextfile(fName, 2, True).write _
"<html><table><tr><td>" & HTML & _
"</td></tr></table></html>"
End With
Application.ScreenUpdating = False
With Workbooks.Open(fName)
.Sheets(1).Range("A1").Copy c
.Close False
End With
End Sub
输入输出:
我将总结对我有用的方法:
- 首先,从 HTML 字符串中提取文本并将单元格的值设置为该文本,这是没有标签且未转义的 HTML,如下所示:
Range.Value = html_text
- 根据需要使用 Characters 对象修改格式,Characters.Count 不会截断为 255,现在它将 return 字符串的实际长度,如下所示:
Range.Characters(offset, format_length).Font.Bold = True
这样一来,我就没有在字符中使用 Insert 方法,这似乎是导致问题的原因。尝试使用 HTML 最多 1000 个字符的字符串成功。另请注意,我使用的是来自 Python 而不是 VBA 的 COM (Excel.Application),在后者中,这可能不是一件容易的事。
我使用 Excel.Application COM 对象自动生成依赖于 Excel 的文档。
本质上,输入是一个简单的 HTML 字符串,只有跨度、粗体和斜体标签。
我擦除相关单元格的内容,解析这个 HTML 字符串,然后将字符附加到相关单元格,调整字体和字体颜色,如下所示:
offset = Range.Characters().Count
Range.Characters(offset + 1).Insert("Hello");
Range.Characters(offset + 1).Font.Bold = True
它适用于少于 255 个字符的内容,但达到这个数字时,单元格中不会附加任何内容,偏移量始终为 255。
有什么想法吗?如果我打开 excel 并手动将内容写入单元格,则我没有此限制。
这是一个解决方法,它依赖于 Excel 能够打开一个仅包含 HTML 的文件,该文件被格式化为 table:
Sub Tester()
Dim ws As Worksheet
HTMLtoRange ActiveSheet.Range("B2").Value, ActiveSheet.Range("B4")
End Sub
'Take some HTML, write it to a file as a table,
' open the file in Excel, and copy A1 to `c`
Sub HTMLtoRange(HTML As String, c As Range)
Dim fName As String
With CreateObject("scripting.filesystemobject")
fName = .getSpecialFolder(2).Path & "\" & .getTempName() & ".xls"
.opentextfile(fName, 2, True).write _
"<html><table><tr><td>" & HTML & _
"</td></tr></table></html>"
End With
Application.ScreenUpdating = False
With Workbooks.Open(fName)
.Sheets(1).Range("A1").Copy c
.Close False
End With
End Sub
输入输出:
我将总结对我有用的方法:
- 首先,从 HTML 字符串中提取文本并将单元格的值设置为该文本,这是没有标签且未转义的 HTML,如下所示:
Range.Value = html_text
- 根据需要使用 Characters 对象修改格式,Characters.Count 不会截断为 255,现在它将 return 字符串的实际长度,如下所示:
Range.Characters(offset, format_length).Font.Bold = True
这样一来,我就没有在字符中使用 Insert 方法,这似乎是导致问题的原因。尝试使用 HTML 最多 1000 个字符的字符串成功。另请注意,我使用的是来自 Python 而不是 VBA 的 COM (Excel.Application),在后者中,这可能不是一件容易的事。