【发布时间】:2026-01-28 23:50:01
【问题描述】:
我是 C#-Topic (PHP-Background) 的新手,我的 Word-Plugin 经常遇到同样的问题。任务是,如果行数达到某个断点,则将表拆分为两部分。为了解决这个问题,我只是拆分了表,在表 2 中添加了完全相同的标题,创建了一个包含两列的不可见表(它们需要平行),将这 2 个拆分表粘贴到第 1,1 和 1,2 列中。这适用于单个表,但如果有两个或更多,它只会崩溃而没有任何异常。我唯一知道的是,应用程序崩溃了,就在填充新表的第一个标题之前。可能是 2 个或更多表的性能问题?
图片中的任务
+------------+------------+
| Headline 1 | Headline 2 |
+------------+------------+
| Col 1,1 | Col 1,2 |
| Col 2,1 | Col 2,2 |
| Col 3,1 | Col 3,2 |
+------------+------------+
到
+------------+------------+ +------------+------------+
| Headline 1 | Headline 2 | | Headline 1 | Headline 2 |
+------------+------------+ +------------+------------+
| Col 1,1 | Col 1,2 | | Col 3,1 | Col 3,2 |
| Col 2,1 | Col 2,2 | +------------+------------+
+------------+------------+
这是我的代码
private long createInvisibleTable() {
long timestamp = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
doc.Paragraphs.SpaceAfter = 0;
Word.Table newTable = doc.Tables.Add(Globals.ThisAddIn.Application.Selection.Range, 1, 2);
newTable.AllowAutoFit = true;
newTable.Descr = timestamp.ToString();
newTable.Cell(1, 1).Range.Text = "1. Tabelle hier einfügen";
newTable.Cell(1, 2).Range.Text = "2. Tabelle hier einfügen";
return timestamp;
}
private Word.Table getInvisibleTable(long hash) {
Word.Tables docTables = Globals.ThisAddIn.Application.ActiveDocument.Tables;
foreach (Word.Table thisTable in docTables) {
if (thisTable.Tables.Count > 0) {
this.getInvisibleTable(hash);
} else if (thisTable.Descr == hash.ToString()) {
return thisTable;
}
}
return null;
}
private void splitTables(Word.Tables tablesRec)
{
foreach (Word.Table table in tablesRec)
{
if (table.Tables.Count > 0)
{
this.splitTables(table.Tables);
}
else
{
int schwellenwert = this.splitTableSchwellenwert;
double breakPoint = schwellenwert;
int counter = 0;
if (table.Rows.Count > schwellenwert)
{
try
{
breakPoint = 2 + (int)Math.Ceiling((decimal)(table.Rows.Count - 1) / 2);
Word.Table tableSplit = table.Split(breakPoint);
tableSplit.Range.Select();
Globals.ThisAddIn.Application.Selection.Collapse();
Globals.ThisAddIn.Application.Selection.InsertRowsAbove();
foreach (Word.Cell sourceTableCell in table.Rows[1].Cells)
{
counter++;
tableSplit.Cell(1, counter).Range.Text = sourceTableCell.Range.Text;
}
table.Select();
Globals.ThisAddIn.Application.Selection.Cut();
long tableHash = this.createInvisibleTable();
Word.Table thisTable = this.getInvisibleTable(tableHash);
thisTable.Cell(1, 1).Select();
Globals.ThisAddIn.Application.Selection.PasteAsNestedTable();
tableSplit.Select();
Globals.ThisAddIn.Application.Selection.Cut();
thisTable.Cell(1, 2).Select();
Globals.ThisAddIn.Application.Selection.PasteSpecial();
}
catch (Exception e)
{
Debug.WriteLine("Source: \n" + e.Source);
Debug.WriteLine("\n\nMessage: \n" + e.Message);
Debug.WriteLine("\n\nStacktrace: " + e.StackTrace);
}
}
}
}
}
【问题讨论】:
-
究竟是哪一行代码触发了崩溃?如果您在崩溃之前结束代码执行,那么文档中的 SELECTION 到底在哪里?您是否能够手动执行代码中导致崩溃的操作?我的直觉是您创建的表已损坏,或者您尝试插入新表的位置不是有效位置。您的代码缺少有用的 cmets,例如,我不清楚 getInvisibleTable(tableHash);应该可以工作...