将一个HTML表格粘贴到Excel中,如何保持单元格中的换行符
我有一个简单的html表,例如,只有一个单元格,但是当我复制DOM节点,并将其粘贴到Excel中,它将被识别为两行,如何让Excel获取正确的粘贴数据。
<table><tr><td>1<br>2</td><tr></table>
我试图添加CSS样式
br {mso-data-placement:same-cell;},
但它只适用于IE。
注意,复制纯文本不行,我需要在单元格中添加颜色,字体信息。
您可能知道很多人,只要添加正确的content-type和content-disposition标头,就可以将数据(例如报告)作为Excel文件输出:
Response.ContentType =“application / vnd.ms-excel”;
Response.AppendHeader(“content-disposition”,“inline; filename = report.xls”);
如果客户端安装了MS Excel,您的输出HTML页面将被打开,而不是Web浏览器。 Excel将解释所有格式(边框,字体等)和TABLE标签,这可以产生一个很好的,格式化的工作表,而不使用重量级的服务器端控件。
我一直在挣扎的问题是多线电池。 我需要在单元格中包装文本,但是当将标记放入HTML输出时,Excel会将其解释为新行,而不是现有单元格中的换行符。
添加到样式表中:
br {mso-data-placement:same-cell;}
那么它就像一个魅力。 我希望它有用:)
提示:您可以使ContentType和标题有条件地提供替代HTML / XLS报告和一个文件。
看起来Firefox完全忽略了mso-data-placement指令; 它不会出现在Firebug样式面板中。 也许这就是为什么它不会像你期望的粘贴?
如何使用例如以下代码的macros?
• TransformingPaste1()
:但是,这在我的机器上仍然失败(仍然是多个单元格)
- 获取剪贴板文本
- 使用
mso-data-placement:same-cell
粘贴转换的版本 - 恢复原来的剪贴板文本
• TransformingPaste2()
:粘贴在我的机器上的单个单元格中,保持格式化等,但结果是空格而不是换行符,因为您仍在粘贴HTML
- 获取剪贴板文本
- 使用
vbCrLf
粘贴转换后的版本 - 恢复原来的剪贴板文本
TransformingPaste3()
:粘贴在我的机器上的单个单元格中,换行符,但失去格式化等(当前实现) – 请参阅链接注释!
- 获取剪贴板文本
- 使用自定义标记来粘贴转换的版本
- 恢复原来的剪贴板文本
- 后处理单元格,用换行符replace令牌 – 可能会改进…
修改为最适合您的需求,例如使用正则expression式来执行replace,但是我希望这可以让您顺其自然:]
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: eg 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表格中编辑“单元属性”。 右键单击Excel中的列名称,然后select单元格属性。 根据您的数据进行适当的更改并保存。 现在您可以复制您的数据,并希望在MS-Excel中正确解释它。 不过,我还没有使用它的HTML内容。