Как скопировать список из ячейки таблицы Word в ячейку Excel - PullRequest
0 голосов
/ 15 марта 2019

У меня есть следующая тестовая таблица в Word, с одной ячейкой, имеющей многоуровневый список:

enter image description here

Используя приведенный ниже код, я могу скопировать ячейки из таблицы Word в соответствующую ячейку на листе Excel:

foreach (Microsoft.Office.Interop.Word.Table table in objDoc.Tables)
{
   for (int row = 1; row <= table.Rows.Count; row++)
   {
      for (int col = 1; col <= table.Columns.Count; col++)
      {
         string text = table.Cell(row, col).Range.Text;
         worksheet.Cells[row, col] = text;
       }
    }
 }

Однако я получаю следующий результат, когда ячейка Word, содержащая список, не копируется должным образом в Excel:

enter image description here

Я также попробовал следующее:

worksheet.Cells[row, col] = table.Cell(row, col).Range.FormattedText;

Но я получаю те же результаты.

Я также попытался преобразовать список в файле Word, скопировав и вставив с помощью параметра «Сохранить только текст», чтобы удалить автоматическое форматирование Word, и вручную удалить вкладки. Это дало этот результат:

enter image description here

Хотя я могу получить текст с номерами списка, я не получаю возврат каретки, разрыв строки или перевод строки, чтобы отделить элементы списка.

По крайней мере, я хотел бы сохранить нумерацию списка и разрывы строк без необходимости вырезать / вставлять вручную с помощью параметра «Сохранить только текст»; и я хочу избежать необходимости разбирать текст для номеров списка (которые могут быть числами или буквами) и вставлять переводы строк.

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

С помощью Синди Мейстер в сочетании с ответом Пола Уоллса в этом другом вопросе о замене символов в строке C # , вот итоговый ответ.

foreach (Microsoft.Office.Interop.Word.Table table in objDoc.Tables)
{             
    for (int row = 1; row <= table.Rows.Count; row++)
    {
        for (int col = 1; col <= table.Columns.Count; col++)
        {
            // Convert the formatted list number to plain text, then undo the conversion                   
            table.Cell(row, col).Range.ListFormat.ConvertNumbersToText();
            string cellContent = table.Cell(row, col).Range.Text;
            objDoc.Undo(1);

            // remove end-of-cell characters
            cellContent = trimCellText2(cellContent);

            // Replace remaining paragraph marks with the excel newline character     
            char[] linefeeds = new char[] { '\r', '\n' };
            string[] temp1 = cellContent.Split(linefeeds, StringSplitOptions.RemoveEmptyEntries);
            cellContent = String.Join("\n", temp1);

            // Replace tabs from the list format conversion with spaces
            char[] tabs = new char[] { '\t', ' ' };
            string[] temp2 = cellContent.Split(tabs, StringSplitOptions.RemoveEmptyEntries);
            cellContent = String.Join(" ", temp2);

            worksheet.Cells[row, col] = cellContent;
        }
    }
}

private static string trimCellText2(string myString)
{
    int len = myString.Length;
    string charString13 = "" + (char)13;
    string charString7 = "" + (char)7;

    while ((len > 0 && myString.Substring(len - 1) == charString13) || (myString.Substring(len - 1) == charString7))
        myString = myString.Substring(0, Math.Min(len - 1, len));
    return myString;
}

А вот результирующий вывод в Excel: Вывод в Excel

0 голосов
/ 16 марта 2019

Существует несколько проблем, связанных с достижением указанного результата:

  1. В Excel не используются те же символы, что и Word, для новых строк или новых абзацев.(В этом случае это должны быть новые абзацы, так как нумерация генерируется.) Excel хочет ANSI 10;Word использует ANSI 13. Поэтому его необходимо преобразовать.

  2. Автоматическая нумерация строк - это форматирование.Передача строки теряет форматирование;это может только быть передано, используя Копирование.Или нумерация должна быть преобразована в простой текст.

  3. Другая проблема - это «точка» в конце содержимого ячейки, которая снова является ANSI 13 в сочетании с ANSI 7 (конец-клеточный маркер).Это также должно быть удалено.

Следующий бит примера кода заботится обо всех трех преобразованиях.(Примечание: это код VBA, который я преобразовал из головы, поэтому следите за небольшим синтаксисом "gotchas")

    Word.Range rng = table.Cell[rowCounter, colCounter].Range;
    //convert the numbers to plain text, then undo the conversion
    rng.ListFormat.ConvertNumbersToText();
    string cellContent = rng.Text;
    objDoc.Undo(1);
    //remove end-of-cell characters
    cellContent = TrimCellText2(cellContent);
    //replace remaining paragraph marks with the Excel new line character
    cellContent.Replace((char)13, (char)10);
    worksheet.Cells[rowCounter, colCounter].Value = cellContent;

//cut off ANSI 13 + ANSI 7 from the end of the string coming from a 
//Word table cell
private string TrimCellText2(s As String)
{
    int len = s.Length;
    while (len > 0 && s.Substring(len - 1) == (char)13 || s.Substring(len - 1) == (char)7);
        s = s.Substring(0, Math.Min(len-1, len));   
    return s;
}
...