Вставить таблицу HTML в Excel, как сохранить разрыв строки в ячейке

У меня простая html-таблица, например, только одна ячейка, но когда я копирую dom node и вставляю ее в excel, она будет распознана как две строки. Как заставить Excel получить правильные данные пасты.

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

Я попытался добавить стиль css

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

Но он работает только в IE.

Заметьте, скопируйте обычный текст, это не нормально, мне нужно добавить цвет, информацию о шрифтах на ячейки.

Ответы

Ответ 1

Как известно многим из вас, вы можете выводить данные (например, отчет) в виде файла Excel, просто добавляя правильный заголовок содержимого контента и содержимого:

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

Response.AppendHeader( "content-disposition", "inline; filename = report.xls" );

Если клиент имеет MS Excel, ваша HTML-страница будет открыта в нем вместо веб-браузера. Excel будет интерпретировать все форматы (границы, шрифты и т.д.) И теги TABLE, которые могут привести к хорошему, сформированному листу, без использования суперкомпьютерных элементов на стороне сервера.

Проблема, с которой я боролся в течение некоторого времени, была с многострочными ячейками. Мне нужно было переносить текст в ячейку, но когда я помещал тег <br> в вывод HTML, Excel интерпретировал его как новую строку, а не разрыв строки в существующей ячейке.

добавить в таблицу стилей:

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

Затем он работает как шарм. Надеюсь, это полезно:)

Совет. Вы можете сделать ContentType и заголовок условными, предоставляя альтернативные отчеты HTML/XLS с одним файлом.

Ответ 2

Похоже, Firefox полностью игнорирует директиву mso-data-placement; он не отображается в панели стиля Firebug. Может быть, почему он не будет вставляться, как вы ожидаете?

Ответ 3

Как насчет использования макроса с помощью, например, следующий код?

TransformingPaste1(): однако это не удается на моей машине (все еще несколько ячеек)

  • получает текст буфера обмена
  • вставляет преобразованную версию с помощью mso-data-placement:same-cell
  • восстанавливает исходный текст буфера обмена

TransformingPaste2(): пасты в одной ячейке на моей машине, сохранение форматирования и т.д., но приводит к пробелу, а не к новой строке, потому что вы все еще вставляете HTML

  • получает текст буфера обмена
  • вставляет преобразованную версию с помощью vbCrLf
  • восстанавливает исходный текст буфера обмена

TransformingPaste3(): пасты в отдельной ячейке на моей машине с новой строкой, но теряет форматирование и т.д. (текущая реализация) - см. примечание со ссылкой!

  • получает текст буфера обмена
  • вставляет преобразованную версию с использованием самоопределяемого токена
  • восстанавливает исходный текст буфера обмена
  • постпроцессы ячеек, замена токена на новые строки - могут быть улучшены...

Изменить то, что наилучшим образом соответствует вашим потребностям, например. используя 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

Ответ 4

Если вам действительно нужно сделать копию-вставку, было бы лучше отредактировать свойства "Cell" на листе excel перед копированием данных. Щелкните правой кнопкой мыши имя столбца в excel и выберите свойства ячейки. Внесите изменения в соответствии с вашими данными и сохраните их. Теперь вы можете скопировать свои данные и надеяться, что это правильно интерпретируется в MS-Excel. Однако я не использовал его для содержимого HTML.