22

たとえば、セルが1つだけの単純なhtmlテーブルがありますが、domノードをコピーしてExcelに貼り付けると、2行として認識されます.Excelに正しい貼り付けデータを取得させる方法.

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

cssスタイルを追加してみました

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

ただし、IEでのみ機能します。

プレーンテキストのコピーはOKではないことに注意してください。セルに色、フォント情報を追加する必要があります。

4

5 に答える 5

22

ご存知の方も多いと思いますが、適切なcontent-typeヘッダーとcontent-dispositionヘッダーを追加するだけで、データ(レポートなど)をExcelファイルとして出力できます。

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

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

クライアントにMSExcelがインストールされている場合、出力HTMLページがWebブラウザではなくクライアントで開かれます。Excelは、すべての書式設定(境界線、フォントなど)とTABLEタグを解釈します。これにより、サーバー側の重いコントロールを使用せずに、適切な書式設定されたワークシートを作成できます。

私がしばらく苦労していた問題は、マルチラインセルにありました。テキストをセルで折り返す必要がありましたが、<br>タグをHTML出力に入れると、Excelはそれを既存のセルの改行ではなく、新しい行として解釈しました。

スタイルシートに追加します。

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

それからそれは魅力のように働きます。お役に立てば幸いです:)

ヒント:ContentTypeとヘッダーを条件付きにして、1つのファイルで代替のHTML/XLSレポートを提供できます。

于 2012-10-16T05:15:10.320 に答える
3

Firefox はmso-data-placementディレクティブを完全に無視しているようです。Firebug スタイル パネルには表示されません。おそらく、それが期待どおりに貼り付けられない理由ですか?

于 2012-10-12T11:25:28.653 に答える
1

たとえば、次のコードでマクロを使用するのはどうですか?

TransformingPaste1(): ただし、これは私のマシンでは失敗します (まだ複数のセル)

  • クリップボードのテキストを取得します
  • を使用して変換されたバージョンを貼り付けますmso-data-placement:same-cell
  • 元のクリップボードのテキストを復元します

TransformingPaste2(): 私のマシンの単一のセルに貼り付け、書式設定などを維持しますが、まだ HTML を貼り付けているため、改行ではなくスペースになります。

  • クリップボードのテキストを取得します
  • を使用して変換されたバージョンを貼り付けますvbCrLf
  • 元のクリップボードのテキストを復元します

TransformingPaste3(): 私のマシンの単一のセルに改行を付けて貼り付けますが、書式設定などが失われます (現在の実装) – リンク付きのメモを参照してください!

  • クリップボードのテキストを取得します
  • 自己定義トークンを使用して変換されたバージョンを貼り付けます
  • 元のクリップボードのテキストを復元します
  • セルを後処理し、トークンを改行に置き換えます – 改善される可能性があります…</li>

正規表現を使用して置換を実行するなど、ニーズに最も適したものに変更しますが、これでうまくいくことを願っています:]

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
于 2012-10-19T17:38:49.607 に答える
0

本当にコピペが必要な場合は、データをコピーする前に Excel シートの「セル プロパティ」を編集することをお勧めします。Excel で列名を右クリックし、セルのプロパティを選択します。データに応じて変更を加えて保存します。これで、データをコピーして、MS-Excel で正しく解釈されることを期待できます。ただし、HTML コンテンツには使用していません。

于 2012-10-18T10:08:31.707 に答える