将HTML表格粘贴到Excel中,如何在单元格中保留换行符
我有一个简单的html表格,例如,只有一个单元格,但当我复制dom节点并将其粘贴到excel中时,它将被识别为两行,如何使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样式面板中。也许这
<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处理单元格,用换行符替换标记–可能会有所改进
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