拆分两个表时 VSTO Word 插件崩溃
VSTO Word plugin crashes while splitting two tables
我是 C# 主题 (PHP-Background) 的新手,我的 Word-Plugin 经常遇到同样的问题。任务是,如果行数达到某个断点,则将 table 分成两部分。为了解决这个问题,我只是拆分了 table,将完全相同的标题添加到 table 2,创建了一个不可见的 table 两列(它们需要平行),粘贴了这两个拆分tables 在第 1,1 和 1,2 列中。这适用于单个 table,但如果有两个或更多,它只会崩溃而不会出现任何异常。我唯一知道的是,应用程序崩溃了,就在填充新 Table 中的第一个标题之前。也许 Performance-Problem 有 2 个或更多 tables?
图片中的任务
+------------+------------+
| 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);
}
}
}
}
}
问题是递归函数getInvisibleTable
。需要循环遍历所有的表,但是这个函数只等待一个long
,所以不可能循环得更深。解决方案如下所示:
private Word.Table getInvisibleTable(long hash , Word.Tables tablesRec) {
Word.Tables docTables = Globals.ThisAddIn.Application.ActiveDocument.Tables;
foreach (Word.Table thisTable in docTables) {
if (thisTable.Tables.Count > 0) {
this.getInvisibleTable(hash, thisTable.Tables);
} else if (thisTable.Descr == hash.ToString()) {
return thisTable;
}
}
return null;
}
我期待着让这个功能更容易使用。 (例如声明可选参数)
我是 C# 主题 (PHP-Background) 的新手,我的 Word-Plugin 经常遇到同样的问题。任务是,如果行数达到某个断点,则将 table 分成两部分。为了解决这个问题,我只是拆分了 table,将完全相同的标题添加到 table 2,创建了一个不可见的 table 两列(它们需要平行),粘贴了这两个拆分tables 在第 1,1 和 1,2 列中。这适用于单个 table,但如果有两个或更多,它只会崩溃而不会出现任何异常。我唯一知道的是,应用程序崩溃了,就在填充新 Table 中的第一个标题之前。也许 Performance-Problem 有 2 个或更多 tables?
图片中的任务
+------------+------------+
| 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);
}
}
}
}
}
问题是递归函数getInvisibleTable
。需要循环遍历所有的表,但是这个函数只等待一个long
,所以不可能循环得更深。解决方案如下所示:
private Word.Table getInvisibleTable(long hash , Word.Tables tablesRec) {
Word.Tables docTables = Globals.ThisAddIn.Application.ActiveDocument.Tables;
foreach (Word.Table thisTable in docTables) {
if (thisTable.Tables.Count > 0) {
this.getInvisibleTable(hash, thisTable.Tables);
} else if (thisTable.Descr == hash.ToString()) {
return thisTable;
}
}
return null;
}
我期待着让这个功能更容易使用。 (例如声明可选参数)