如图所示,我的例程在Sample.htm上运行良好。我将首先解释这张图片,然后给出两个健康警告。该代码超过了 30,000 个字符的堆栈溢出限制,因此我无法包含它。如果这很有趣,请查看我的个人资料,您会在其中找到电子邮件地址。给我发电子邮件,我会把代码发给你。
图像和参差不齐的数组的解释
此图像背后的例程旨在从网页中的表中提取数据并将其写入单个参差不齐的数组。图像中的工作表是通过将参差不齐的数组复制到其中而创建的。我使用象牙色背景来显示哪些单元格位于参差不齐的阵列中。(注意:参差不齐的数组是其中行具有不同数量的列的数组。)
Sample.htm包含一个简单的表格。我不会从 Html 的复杂性中猜到这一点。
我的例行程序忽略<table>
了</table>
. 在<table>
它内部</table>
识别表格的元素。<td>
单元格 ( to )中的任何空格都会</td>
变成符合 Html 规则的单个空格。A<p>
替换为两个换行符,a 替换为<br>
一个换行符。除表格元素外的任何标签都将被丢弃,因此:Normal <b>bold</b> <i>italic</i>
变为Normal bold italic
. 属性被忽略。完成了一个<table>
到</table>
,例程寻找另一个。该例程处理嵌套表。字符实体(例如“&”)被转换为等效的 unicode 字符(例如“&”)。该例程不处理表定义中的错误;一切都必须正确嵌套,没有省略结束标签。
不规则数组的第 1 行是Sample.htm中第一个(仅在本例中)表的标题。它的内容是:
1 20 5 0 0 2
1 表示这是一级表。嵌套在该表的单元格中的表将是二级。嵌套在二级表中的表将是三级,依此类推。
有 20 行,每行最多 5 列。第一个零表示没有标题部分。第二个零表示没有页脚部分。这两个意味着第一个(并且仅在这种情况下)主体部分从不规则数组的第 2 行开始。如果有多个正文部分,则在 2 之后会有其他行号。
不规则数组的下 20 行是表的数据行,每行最多包含 5 列。
在第 2 行中,只有 A 列是象牙色。Html 表的那一行只包含一个单元格。该单元格有一个colspan
属性,因此该单元格跨越 Html 表的所有五列。属性的存在和值colspan
不包括在参差不齐的数组中,尽管可以从缺少单元格中推断出acolspan
或属性的存在。rowspan
警告:此例程向调用例程隐藏了 Html 的复杂性。它并没有掩盖表格的复杂性。幸运的是,您的表格很简单,只有一个colspan
属性。
Html 表的第 2 行 - 参差不齐的数组和工作表的第 3 行 - 有五个空单元格。
其余的单元格几乎与它们在参差不齐的阵列中出现的完全相同。由于 Html 中单元格定义的复杂性,换行符已成为数据中的空格。单元格数据位于数据<p>
内。我已将定制代码添加到调用例程中以丢弃空格和换行符。</p>
LineFeed LineFeed
健康警告 1
下面的例程并不完全符合您的要求。该代码在 Excel 工作簿中进行了测试,Sample.htm 与工作簿位于同一文件夹中。您可以创建一个例程以将所需消息的 Html 正文保存为 Html 文件,或者您可以将此代码移动到 Outlook 并将其调整为从 Outlook 写入 Excel。关于这两个选项,都有一些问题和编码的答案。我可以推荐其他答案供您学习,但我认为这个答案足够大。
健康警告 2
下面的代码包括:
- 我为您编写的一个小型定制宏来演示我的例程。
- 一个由 Dick Kusleika 编写并在 Stack Overflow 上发表的例程,我再好不过了。
- 我为我写的一些套路。
健康警告是针对我为我编写的例程。
我不经常使用这些例程,所以评论是为了提醒我如何使用它们。它们并非旨在帮助其他人了解他们的工作。
我将Debug.Assert False ' Not tested
代码放在每条路径的顶部,然后在测试该路径时将这些语句注释掉。如果您请求代码,您将看到我没有测试所有路径。除了一个例外,这些例程适用于我希望解码的网页。一个例外是作者通过将表格嵌套到五个深度来炫耀的网站。不幸的是,他们把他们<td>
的 s 和</td>
s 搞混了,我的代码没有处理无效的 Html。我在运行我的例程之前更正了网页源代码,因为这对我来说是最简单的。当我对更多的网页感兴趣时,我会测试更多的代码,但因为代码是给我的,所以我不寻找测试用例。如果代码对您不利,请将 html 文件通过电子邮件发送给我,我会看看我能做什么。
我编写这些例程是因为它们处理 Excel 无法处理的复杂 Html。我建议您在Sample.htm上尝试 Excel 。真正的 Html 非常简单,因此如果 Excel 可以忽略格式,它可能能够导入此文件。