我有一个以编程方式创建的电子表格,其中包含很多评论(最多 40,000 条)。从工作表中删除几列后,评论会调整大小。这显然是excel中的一个错误。( http://answers.microsoft.com/en-us/office/forum/office_2007-excel/excel-comment-boxes-resizing-themselves-andor/3fdf3e72-6ca5-4186-a656-b7b6fd8db781?msgId=d55534a5-4603 -482e-ac97-9ec260124f78 )
理想情况下,我想在删除列后立即自动调整所有评论的大小。
试图避免遍历每个单独的评论,这是我到目前为止所尝试的。
- 设置 AutoShapeDefaults 无效 - 删除列后,注释仍会调整大小。
- XlPlacement 属性。XlMove 和 XLMoveAndSize 无效。
- 无论评论数量如何,Worksheet.Shapes.SelectAll 都会引发 OutOfMemory 异常
我的想法是获取电子表格中所有评论的 ShapeRange 对象并从那里设置大小。
这完美地工作:
public static void ResizeComments()
{
Microsoft.Office.Interop.Excel.Workbook objWorkbook;
objWorkbook = (Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
Worksheet objSheet = (Worksheet)objWorkbook.ActiveSheet;
int[] test = {1,2,3,4,5};
ShapeRange sRange = objSheet.Shapes.Range[test];
sRange.Height = 100;
sRange.Width = 220;
}
更改为此会在 AutoSize 行引发异常“HRESULT 中的异常:0x800A03EC”。
ShapeRange sRange = objSheet.Shapes.Range[test];
sRange.TextFrame.AutoSize = true;
使用我的实际形状索引数组会引发相同的异常,但在Shapes.Range[]处。我在调试时查看了形状变量,它与test相同,除了它是int[249]而不是int[5];
int[] shapes = (int[])shapes.ToArray(typeof(int));
ShapeRange sRange = objSheet.Shapes.Range[shapes];