将HTML表格粘贴到Excel中,如何保留单元格中的换行符

24

我有一个简单的HTML表格,例如只有一个单元格,但当我复制DOM节点并粘贴到Excel中时,它会被识别为两行,如何使Excel获取正确的粘贴数据。

 <table><tr><td>1<br>2</td><tr></table>

我尝试添加 CSS 样式

br {mso-data-placement:same-cell;},

但它只在IE中起作用。

注意,直接复制纯文本是不可以的,我需要在单元格中添加颜色、字体等信息。


嗨,可以导出而不是粘贴吗? - BrOSs
使用宏可以吗?这样就可以预处理剪贴板数据和/或后处理粘贴的数据... - mousio
5个回答

23

正如许多人可能已经知道的那样,你可以通过添加正确的内容类型和内容分发头信息,将数据(如报告)输出为Excel文件:

Response.ContentType = “application/vnd.ms-excel“;

Response.AppendHeader(“content-disposition“, “inline; filename=report.xls“);
如果客户端已经安装了MS Excel,你的输出HTML页面将会在Excel中打开,而不是在Web浏览器中。Excel将解释所有的格式(边框、字体等)和表格标签,这将导致一个漂亮的、格式化好的工作表,而无需使用服务器端控件。
我遇到的问题是关于多行单元格的。我需要在单元格中换行,但是当我将
标签放入HTML输出时,Excel会将其解释为新的行,而不是现有单元格中的换行符。
在样式表中添加:
br {mso-data-placement:same-cell;}

那么它就像一个魔法般地运作。希望它有用 :)

提示:您可以使ContentType和header条件化,提供一个文件的HTML / XLS备选报告。


4
感谢您提供的解决方案。对于复制粘贴,我将其写成这样:<br style="mso-data-placement:same-cell;"/> 然后它就起作用了。 - Loïc bcn
1
很不幸,这似乎只是一个适用于Windows系统的解决方案。Excel for Mac 2011 v14.x忽略了{mso-data-placement:same-cell;} - cropredy
在使用样式表方法和 Chrome 处理时遇到了一些问题,但最终我通过在 <br style="mso-data-placement:same-cell;"/> 中添加代码并从 Internet Explorer 复制输出结果的方式成功实现了复制粘贴功能。 - krubo
有没有解决方案可以在 Mac 上运行这个(Excel for Mac 2011 v14.x 等)? - Mark W

3
似乎Firefox完全忽略了“mso-data-placement”指令;它在Firebug样式面板中并没有出现。也许这就是为什么它无法按照您的期望进行粘贴的原因?

1
我通常面临这个问题,因为我需要从一个网站下载Excel文件,实际上它们是用xls扩展名包装在table标签中的html文件。 无论单元格中是否有br标记,都会创建一行新行。 因此,我创建了一个小的vbscript,将br标记替换为逗号,然后我在Excel中打开该文件。 这对我很有效。

1

使用以下代码的宏怎么样?

TransformingPaste1(): 然而,在我的机器上失败了(仍然是多个单元格)

  • 获取剪贴板文本
  • 使用mso-data-placement:same-cell粘贴转换后的版本
  • 恢复原始剪贴板文本

TransformingPaste2(): 在我的机器上在单个单元格中粘贴,保留格式等,但由于仍在粘贴HTML,结果是空格而不是换行符

  • 获取剪贴板文本
  • 使用vbCrLf粘贴转换后的版本
  • 恢复原始剪贴板文本

TransformingPaste3(): 在我的机器上在单个单元格中粘贴,带有换行符,但丢失格式等(当前实现)-请参见链接的注释!

  • 获取剪贴板文本
  • 使用自定义标记粘贴转换后的版本
  • 恢复原始剪贴板文本
  • 后处理单元格,用换行符替换标记-可能会改进...

根据您的需求进行修改,例如使用正则表达式进行替换,但我希望这能帮助您迈出第一步:]

Function GetClipboardText() As String
    Dim BufObj As MSForms.DataObject
    Set BufObj = New MSForms.DataObject
    BufObj.GetFromClipboard
    GetClipboardText = BufObj.GetText
End Function

Function SetClipboardText(ByRef text As String)
    Dim BufObj As MSForms.DataObject
    Set BufObj = New MSForms.DataObject
    BufObj.SetText text
    BufObj.PutInClipboard
End Function

Function PreProcess(ByRef text As String, ByRef find As String, ByRef replace As String) As String
    PreProcess = Application.WorksheetFunction.Substitute(text, find, replace)
End Function

Function PostProcess(ByRef find As String, ByRef replace As String)
    Dim rCell As range
    For Each rCell In Selection
        'TODO: e.g. combine with answers from https://dev59.com/8UvSa4cB1Zd3GeqPg70K
        rCell.Formula = Application.WorksheetFunction.Substitute(rCell.Formula, find, replace)
    Next
End Function

Sub TransformingPaste1()
    Dim OrigText As String
    Dim TempToken As String
    Dim PasteText As String
    Dim sSelAdd As String
    OrigText = GetClipboardText
    PasteText = PreProcess(OrigText, "<html>", "<html><style>br{mso-data-placement:same-cell;}</style>")
    SetClipboardText PasteText
    'Selection.PasteSpecial "Unicode Text"
    ActiveSheet.Paste
    SetClipboardText OrigText
    Application.CutCopyMode = False
End Sub

Sub TransformingPaste2()
    Dim OrigText As String
    Dim TempToken As String
    Dim PasteText As String
    Dim sSelAdd As String
    OrigText = GetClipboardText
    PasteText = PreProcess(OrigText, "<br>", vbCrLf)
    SetClipboardText PasteText
    ActiveSheet.Paste
    SetClipboardText OrigText
    Application.CutCopyMode = False
End Sub

Sub TransformingPaste3()
    Dim OrigText As String
    Dim TempToken As String
    Dim PasteText As String
    Dim sSelAdd As String
    OrigText = GetClipboardText
    TempToken = "#mybr#"
    PasteText = PreProcess(OrigText, "<br>", TempToken)
    SetClipboardText PasteText
    ActiveSheet.Paste
    SetClipboardText OrigText
    PostProcess TempToken, vbLf
    Application.CutCopyMode = False
End Sub

0

如果你真的需要复制粘贴,最好在复制数据之前编辑Excel表格中的“单元格属性”。在Excel中右键单击列名并选择单元格属性。根据您的数据适用情况进行更改并保存。现在,您可以复制您的数据,并希望它在MS-Excel中被正确解释。

我还没有在HTML内容中使用过它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接