Arunkumar Murugesan Ответов: 1

Разрыв строки удален после вставки данных в excel C#


Всем Привет,

У меня есть WPF datagrid. Кроме того, у меня есть метод копирования значений сетки.

После копирования значений из сетки разрыв строки удаляется из содержимого столбца после вставки в excel.


С уважением,
Arunkumar Murugesan

Что я уже пробовал:

The below code I'm using for set the grid values as clipboard data.

<pre><pre>if (SelectedRows != null && SelectedRows.Count > 0)
            {
                string Values = "<TABLE><TBODY>";
                string Headers = "";
                if (string.IsNullOrEmpty(Headers))
                {
                    Values += "<TR>";

                    foreach (DataColumn column in DynamicBindingTable.Columns)
                    {
                        Values += "<TD>" + column.ColumnName + "</TD>";
                    }
                    Values += "</TR>";
                }
                for (int i = 0; i < CopiedRows.Count; i++)
                {
                    Values += "<TR>";
                    for (int j = 0; j < CopiedRows[i].ItemArray.Length; j++)
                    {
                        object dynamicValues = CopiedRows[i][j].ToString();
                        Type columnType = DynamicBindingTable.Columns[j].DataType;
                        if (dynamicValues != null)
                        {
                            Values += "<TD>" + dynamicValues.ToString() + "</TD>";
                        }
                    }
                    Values += "</TR>";
                }
                Values += "</TBODY></TABLE>";
                Clipboard.SetData(DataFormats.UnicodeText, (object)Values);
            }


Значения устанавливаются в данные буфера обмена. Но после вставки значений в excel разрывы строк были удалены в содержимом.

Например, в сетке одно значение столбца как,

Dear Customer,
In case you require specific free time deal at destination to be listed. 

Failure to receive confirmation by comp

Free time is considered invalid.

We regret to inform you that we do not have available content.


Но после вставки в excel он показывает, как показано ниже(один текст)

Dear Customer,In case you require specific free time deal at destination to be listed. Failure to receive confirmation by comp.Free time is considered invalid


Не могли бы вы помочь мне решить эту проблему?

Maciej Los

То, что вы делаете, - это не экспорт в формат Excel, а формат html. В этом случае вы должны определить, где находится линия разрыва, а затем вставить <br/> в том месте.

0x01AA

И скорее всего, чтобы добавить некоторую информацию о стиле, например <br style="mso-data-placement:same-cell;"/>

Maciej Los

:большой палец вверх:

0x01AA

Спасибо и извини что я украл сейчас у тебя ответ :-)

Maciej Los

:Д Ваше здоровье!

Arunkumar Murugesan

Эй Мацей Лос и 0x01AA,

Поблагодарить у так много. это прекрасно работает. Отличный...

Maciej Los

- Рад слышать. Пожалуйста, в следующий раз используйте виджет [Reply] для информирования пользователя о вашем ответе (справа от Ника/логина).

0x01AA

Приятно слышать, что это работает. Следующее, что будет экранировать текст, означает, что делать в случае, если "<br>" находится в исходном тексте. ОК, кажется, очень легко, мы можем сделать это с помощью &lt;br&gt; и аналогично, если у вас действительно есть "&lt;br&gt;" в тексте. См.также Edit2 в обновленном решении 1.

Arunkumar Murugesan

Отметил все ваши очки Maciej Los и 0x01AA.

Большое вам спасибо за вашу быструю помощь.

Arunkumar Murugesan

Привет Мацей и 0x01AA,

Еще одно сомнение в формате HTML,

Одно значение столбца подготовлено как "<vslname><vslvoyage>" в формате HTML. После вставки в excel он должен быть вставлен как "<vslname><vslvoyage>" Но она была приклеена как пустая.

Как мы могли бы решить эту проблему?

1 Ответов

Рейтинг:
12

0x01AA

Как Мачей упомянуто в комментарии на вопрос, нужно заменить linenbreaks (символ перевода строки респ перевозки строк) с

<br>

Но дело не только в простоте <br> вы должны добавить. Чтобы сообщить Excel, чтобы сохранить его в той же ячейке, вам нужно заменить разрывы строк на
<br style='mso-data-placement: same-cell'>
Например:
<td>Jan<br style='mso-data-placement: same-cell'>uary</td>

Надеюсь, это поможет.

[Edit1]
Наконец, лучший вариант с "встроенным" стилем
<style>
  br {mso-data-placement:same-cell;}
</style>
<table>
  <tr>
    <th>Col 1</th>
    <th>Col 2</th>
  </tr>
  <tr>
    <td>Line1 <br>Line 2</td>
    <td>data for col 2</td>
  </tr>
</table>

[Edit2]
Чтобы разрешить иметь <br> а также что-то вроде &lt;br&gt; В исходном тексте, вам нужно закодировать исходный текст с помощью HtmlEncode. Подробнее о компании HtmlEncode вы найдете, например, здесь WebUtility.Метод HtmlEncode (System.Net) | Microsoft Docs[^]

[Править 3]
И еще кое-что. В случае, если есть вероятность, что в вашей сетке находится много данных, вы должны подумать об использовании StringBuilder вместо того, чтобы объединять строки.

Я помню тест, который я сделал раньше, примерно 10 лет назад.
Конкатенация 50'000 раз строки из 10 символов в цикле заняла 25 секунд, в то время как в StringBuilder это заняло "0 секунд" (измеряется с помощью Environement.TickCount).


Maciej Los

5ed!

0x01AA

Спасибо Мацей

Patrice T

+5

0x01AA

Спасибо Патрис