我在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中:
我也尝试了以下方法:
worksheet.Cells[row, col] = table.Cell(row, col).Range.FormattedText;
但是我得到相同的结果。
我还尝试通过复制和粘贴“仅保留文本”来转换Word文件中的列表,以删除Word的自动格式设置,并手动删除选项卡。产生了这个结果:
尽管我可以获得带有列表编号的文本,但没有得到回车符,换行符或换行符来分隔列表中的项目。
至少,我想保留列表编号和换行符,而不必使用“仅保留文本”手动剪切/粘贴;而且我想避免必须解析列表编号(可能是数字或字母)的文本并插入换行符。
答案 0 :(得分:0)
达到规定的结果涉及多个问题:
Excel在新行或新段落中不使用与Word相同的字符。 (在这种情况下,因为正在生成编号,所以它必须是新段落。)Excel需要ANSI 10。 Word使用的是ANSI13。因此需要进行转换。
自动行编号正在格式化。传递字符串会丢失格式;它只能使用“复制”来携带。否则编号必须转换为纯文本。
另一个问题是单元格内容末尾的“点”,它又是ANSI 13和ANSI 7(单元格结束标记)的组合。这也应该删除。
下面的示例代码将处理所有三个转换。 (注意:这是我从头开始转换的VBA代码,因此请注意小的语法“陷阱”)
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;
}
答案 1 :(得分:0)
在辛迪·梅斯特(Cindy Meister)的帮助下,结合保罗·沃尔斯(Paul Walls)在replacing characters in a C# string的另一个问题中的答案,这就是得出的答案。
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 Output