【问题标题】:Read an excel table in an outlook mail in vba在 vba 的 Outlook 邮件中读取 Excel 表格
【发布时间】:2012-11-29 18:25:18
【问题描述】:

我正在尝试读取邮件正文中的表格并将其保存在 csv 文件中(我在下面附加了一个代表邮件内容的 html 示例)。我关注了一个相关的帖子:How to read table pasted in outlook message body using vba?,但问题是它通过它的单元格而不是它的行来分隔表格,所以我没有得到 17 行一个标题,而是得到 18 x 5 = 90 个数组元素......我试过了将拆分选项中的分隔符从“vbCrLf”更改为“vbLf”、“vbCr”、Char(10)……但它们都不起作用……任何人都知道为什么拆分不区分空格分隔符从一个新行?这似乎是在邮件正文中读取表格的最简单方法,但如果您有任何其他建议,我也会考虑!

这里是示例链接:sample

谢谢

【问题讨论】:

  • Jim Pena 的出色解决方案着眼于邮件项目的文本正文(属性 .Body)。您正在查看 html 正文(属性 .HtmlBody)。您的消息有正文吗?吉姆答案的任何变化都不会解码您引用的 htm 样本。下一条评论包括表格标题中“术语”一词的整个单元格。我有一个可能(重复可能)有帮助的例程,但首先查看文本正文。
  • Term

  • 嗨,托尼,我发送的 htm 示例实际上代表了我的电子邮件内容,因此我可以通过 .Body 属性成功检索内容。我的问题仍然在于,当拆分我的示例中显示的表格时,它会按单元格拆分而不是按行拆分。我不确定我是否理解您对标题中“术语”一词的看法,请您进一步解释?感谢您的帮助!
  • 如果您查看我的最后一条评论,您会看到它以<td 开头并以</td> 结尾。所有这些文本都是定义表格的一个单元格。如果您查看底线的中间,您将看到Term。这是内容。剩下的就是格式化:边框的宽度和颜色、字体大小、字体系列等。Jim 的例程对没有格式化的电子邮件正文的文本版本进行操作。我的例程在 Html 版本上运行,并去掉所有这些格式,并确定第 3 行的第 4 列包含 Term
  • 我无法在此处发布我的解决方案,因为它有 46,000 个字符长并且堆栈溢出限制为 30,000。但是,如果您有兴趣,我很乐意通过电子邮件将其发送给您。顺便说一句,我还没有为你编写 46,000 个字符的例程。大部分代码是我为自己使用而编写的例程。我为您编写的唯一代码是创建下面的图像。

标签: vba outlook


【解决方案1】:

我的例程在 Sample.htm 上运行良好,如图所示。我将首先解释这张图片,然后给出两个健康警告。该代码超过了 30,000 个字符的堆栈溢出限制,因此我无法包含它。如果这很有趣,请查看我的个人资料,您会在其中找到电子邮件地址。发邮件给我,我会把代码发给你。

图像和参差不齐的数组说明

此图像背后的例程旨在从网页中的表中提取数据并将其写入单个不规则数组。图像中的工作表是通过将参差不齐的数组复制到其中而创建的。我使用象牙色背景来显示哪些单元格位于参差不齐的阵列中。 (注意:参差不齐的数组是其中行具有不同数量的列。)

Sample.htm 包含一个简单的表格。我不会从 Html 的复杂性中猜到这一点。

我的例程会忽略<table></table> 之外的任何内容。在<table></table> 内,它可以识别表格的元素。单元格中的任何空格(<td></td>)都将成为符合 Html 规则的单个空格。 <p> 被两个换行符替换,<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 表的所有五列。尽管colspanrowspan 属性的存在可以从缺少单元格中推断出,但colspan 属性的存在和值不包括在参差不齐的数组中。警告:此例程向调用例程隐藏了 Html 的复杂性。它并没有掩盖表格的复杂性。幸运的是,您的表格很简单,只有一个 colspan 属性。

Html 表的第 2 行 - 参差不齐的数组和工作表的第 3 行 - 有五个空单元格。

剩余的单元格几乎与它们在参差不齐的数组中出现的完全相同。由于 Html 中单元格定义的复杂性,换行符已成为数据中的空格。单元格数据在<p></p> 之间,而LineFeed LineFeed 在数据中。我在调用例程中添加了定制代码以丢弃空格和换行符。

健康警告 1

下面的例程并不完全符合您的要求。该代码在 Excel 工作簿中进行了测试,Sample.htm 与工作簿位于同一文件夹中。您可以创建一个例程以将所需消息的 Html 正文保存为 Html 文件,或者您可以将此代码移动到 Outlook 并将其调整为从 Outlook 写入 Excel。关于这两个选项,都有一些问题和编码的答案。我可以推荐其他答案供您学习,但我认为这个答案足够大。

健康警告 2

以下代码包括:

  • 我为您编写的一个小型定制宏来演示我的日常工作。
  • Dick Kusleika 编写并发布在 Stack Overflow 上的一个例程,我再好不过了。
  • 我为我编写的一些例程。

健康警告是针对我为我写的例程。

我不经常使用这些例程,所以 cmets 会提醒我如何使用它们。它们并非旨在帮助其他人了解他们的工作。

我将Debug.Assert False ' Not tested 放在代码中每条路径的顶部,然后在测试该路径时将这些语句注释掉。如果您请求代码,您将看到我没有测试所有路径。除了一个例外,这些例程适用于我希望解码的网页。一个例外是作者通过将表格嵌套到五个深度来炫耀的网站。不幸的是,他们把<td>s 和</td>s 搞混了,我的代码没有处理无效的 Html。我在运行我的例程之前更正了网页源代码,因为这对我来说是最简单的。当我对更多的网页感兴趣时,我会测试更多的代码,但因为代码是为我准备的,所以我不寻找测试用例。如果代码对您不利,请将 html 文件通过电子邮件发送给我,我会看看我能做什么。

我编写这些例程是因为它们处理 Excel 无法处理的复杂 Html。我建议您在 Sample.htm 上尝试 Excel。真正的 Html 非常简单,所以如果 Excel 可以忽略格式,它也许可以导入这个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2017-12-05
    • 2018-03-25
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多