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

将HTML表格粘贴到Excel中,如何在单元格中保留换行符,html,excel,copy,paste,Html,Excel,Copy,Paste,我有一个简单的html表格,例如,只有一个单元格,但当我复制dom节点并将其粘贴到excel中时,它将被识别为两行,如何使excel获得正确的粘贴数据 <table><tr><td>1<br>2</td><tr></table> 但它只适用于IE 注意,将纯文本复制出来是不合适的,我需要在单元格上添加颜色、字体信息。看起来Firefox完全忽略了mso数据放置指令;它不会出现在Firebug样式面板中。也许这

我有一个简单的html表格,例如,只有一个单元格,但当我复制dom节点并将其粘贴到excel中时,它将被识别为两行,如何使excel获得正确的粘贴数据

 <table><tr><td>1<br>2</td><tr></table>
但它只适用于IE


注意,将纯文本复制出来是不合适的,我需要在单元格上添加颜色、字体信息。

看起来Firefox完全忽略了mso数据放置指令;它不会出现在Firebug样式面板中。也许这就是它无法按预期粘贴的原因?

很多人可能都知道,只需添加正确的内容类型和内容处置标题,就可以将数据(例如报表)输出为Excel文件:

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

Response.AppendHeader(“content-disposition“, “inline; filename=report.xls“);
如果客户端安装了MS Excel,您的输出HTML页面将在其中打开,而不是在web浏览器中打开。Excel将解释所有的格式化(边框、字体等)和表格标记,这可以生成一个漂亮的格式化工作表,而无需使用重量级服务器端控件

我挣扎了一段时间的问题是多线细胞。我需要在单元格中包装文本,但当我将

标记放入HTML输出时,Excel将其解释为新行,而不是现有单元格中的换行符

添加到样式表中:

br {mso-data-placement:same-cell;}
然后它就像一个符咒。我希望它有用:)


提示:您可以将ContentType和header设置为有条件的,用一个文件提供备用HTML/XLS报告。

如果确实需要进行复制粘贴,最好在复制数据之前编辑excel工作表中的“单元格属性”。在excel中的列名上单击鼠标右键,然后选择“单元格属性”。对数据进行适用的更改并保存。现在,您可以复制数据,并希望在MS Excel中正确解释数据。
不过,我还没有将其用于HTML内容。

如何将宏与以下代码一起使用

transformingpase1()
:但是,这在我的机器上失败(仍然是多个单元格)

  • 获取剪贴板文本
  • 使用
    mso数据放置:同一单元格粘贴转换后的版本
  • 恢复原始剪贴板文本
TransformingPaste2()
:在我的机器上的单个单元格中粘贴,保留格式等,但由于仍在粘贴HTML,因此会产生一个空格而不是换行符

  • 获取剪贴板文本
  • 使用
    vbCrLf
  • 恢复原始剪贴板文本
TransformingPaste3()
:在我的机器上的单个单元格中粘贴,带有换行符,但会丢失格式设置等(当前实现)–请参见带有链接的注释

  • 获取剪贴板文本
  • 使用自定义标记粘贴已转换的版本
  • 恢复原始剪贴板文本
  • post处理单元格,用换行符替换标记–可能会有所改进
修改最适合您需要的内容,例如使用regex执行替换,但我希望这能帮助您:]

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 http://stackoverflow.com/questions/2192730/merge-contents-of-2-excel-cells-keeping-character-format-intact-using-vba
        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
函数GetClipboardText()作为字符串 Dim BufObj作为MSForms.DataObject Set BufObj=New MSForms.DataObject BufObj.GetFromClipboard GetClipboardText=BufObj.GetText 端函数 函数SetClipboardText(ByRef文本作为字符串) Dim BufObj作为MSForms.DataObject Set BufObj=New MSForms.DataObject BufObj.SetText文本 BufObj.PutInClipboard 端函数 函数预处理(ByRef文本作为字符串,ByRef查找作为字符串,ByRef替换作为字符串)作为字符串 预处理=Application.WorksheetFunction.Substitute(文本、查找、替换) 端函数 函数后处理(ByRef查找为字符串,ByRef替换为字符串) 变暗rCell As范围 对于选择中的每个rCell '待办事项:例如,与来自http://stackoverflow.com/questions/2192730/merge-contents-of-2-excel-cells-keeping-character-format-intact-using-vba rCell.Formula=Application.WorksheetFunction.Substitute(rCell.Formula,find,replace) 下一个 端函数 子转换粘贴1() Dim OrigText作为字符串 像线一样模糊 将文本粘贴为字符串 被包裹成细绳 OrigText=GetClipboardText PasteText=预处理(OrigText,“,”br{mso数据放置:同一单元格;}”) SetClipboardText粘贴文本 'Selection.PasteSpecial“Unicode文本” 活动表。粘贴 SetClipboardText或OrigText Application.CutCopyMode=False 端接头 子转换粘贴2() Dim OrigText作为字符串 像线一样模糊 将文本粘贴为字符串 被包裹成细绳 OrigText=GetClipboardText 粘贴文本=预处理(源文本,
,vbCrLf) SetClipboardText粘贴文本 活动表。粘贴 SetClipboardText或OrigText Application.CutCopyMode=False 端接头 子转换粘贴3() Dim OrigText作为字符串 像线一样模糊 将文本粘贴为字符串 被包裹成细绳 OrigText=GetClipboardText Tenteroken=“#mybr#” PasteText=预处理(OrigText,
,Tentoken) SetClipboardText粘贴文本 活动表。粘贴 SetClipboardText或OrigText 后处理 Application.CutCopyMode=False 端接头
我通常会遇到这个问题,因为我必须从网站下载excel文件,这些文件实际上是html文件,包装在带有xls扩展名的表标记中 无论br标记位于单元格中的何处,都会创建一个新行。
因此,我创建了一个小vbscript,用逗号替换br标记,然后在excel中打开该文件。它对我很有用。

嗨,它可以导出而不是粘贴吗?可以使用宏吗?然后可以预处理剪贴板数据和/或后处理粘贴的数据…感谢此解决方案,对于复制粘贴,我这样写:
并且成功了。不幸的是,这似乎是一个仅适用于Windows的解决方案。Excel for Mac 2011 v14.x在遇到一些问题后会忽略
{mso数据放置:同一单元格;}
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 http://stackoverflow.com/questions/2192730/merge-contents-of-2-excel-cells-keeping-character-format-intact-using-vba
        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