我有一个简单的html表格,例如只有一个单元格,但是当我复制dom节点并将其粘贴到excel中时,它将被识别为两行,如何使Excel获得正确的粘贴数据。
<table><tr><td>1<br>2</td><tr></table>
我尝试添加 css 样式
br {mso-data-placement:same-cell;},
但它只适用于IE。
注意,复制纯文本是不行的,我需要在单元格上添加颜色、字体信息。
许多人可能知道,您可以将数据(例如报告)输出为 Excel 文件,只需添加正确的 content-type 和 content-disposition 标题:
Response.ContentType = “application/vnd.ms-excel“;
Response.AppendHeader(“content-disposition“, “inline; filename=report.xls“);
如果客户端安装了 MS Excel,您的输出 HTML 页面将在其中打开,而不是 Web 浏览器。Excel 将解释所有格式(边框、字体等)和 TABLE 标签,这可以生成漂亮的格式化工作表,而无需使用重量级的服务器端控件。
我挣扎了一段时间的问题是多行单元格。我需要在单元格中换行,但是当我将<br>
标签放入 HTML 输出时,Excel 将其解释为新行,而不是现有单元格中的换行符。
添加到样式表中:
br {mso-data-placement:same-cell;}
然后它就像一个魅力。我希望它有用:)
提示:您可以使 ContentType 和 header 有条件,通过一个文件提供备用 HTML/XLS 报告。
看起来 Firefox 完全忽略了mso-data-placement指令;它不会出现在 Firebug 样式面板中。也许这就是为什么它不会像您期望的那样粘贴?
使用带有以下代码的宏怎么样?
• 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 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
我通常会遇到这个问题,因为我必须从一个站点下载 excel 文件,这些文件实际上是用 xls 扩展名包装在 table 标记中的 html 文件,无论 br 标记在单元格中的何处,都会创建一个新行。所以,我创建了一个小 vbscript 用逗号替换 br 标签,然后我在 excel 中打开文件。它对我很有效。
如果您确实需要进行复制粘贴,最好在复制数据之前在 Excel 工作表中编辑“单元格属性”。右键单击excel中的列名,然后选择单元格属性。对您的数据进行适用的更改并保存。现在您可以复制您的数据并希望它在 MS-Excel 中被正确解释。不过,我还没有将它用于 HTML 内容。