C#举办Visio二次开发的宽广难题处理

1. Visio属性值的转换难题
   
做过Visio开发的人领略,Visio中的属性值也就是Cell.Formula的值一般包蕴两对双引号的(如””XX””),
倘若要将质量的值转换正常的字符串值,那么须求去除双引号。因而从Visio的Cell的Formula值中收获的字符串必要通过上面方法处理一下:

图片 1        public static string FormulaStringToString(string formula)
图片 2图片 3        图片 4{
图片 5            const string OneQuote = “\””;
图片 6            const string TwoQuotes = “\”\””;
图片 7            string convertedFormula = “”;
图片 8
图片 9            try
图片 10图片 11            图片 12{
图片 13                convertedFormula = formula;
图片 14                if (convertedFormula.StartsWith(OneQuote) && convertedFormula.EndsWith(OneQuote))
图片 15图片 16                图片 17{
图片 18                    convertedFormula = convertedFormula.Substring(1, (convertedFormula.Length – 2));
图片 19                    convertedFormula = convertedFormula.Replace(TwoQuotes, OneQuote);
图片 20                }
图片 21            }
图片 22            catch (Exception err)
图片 23图片 24            图片 25{
图片 26                convertedFormula = “”;
图片 27            }
图片 28
图片 29            return convertedFormula;
图片 30        }

借使是写入到Visio的Cell的Formula中,那么要经过反进度,如下所示:

图片 31       public static string StringToFormulaForString(string input)
图片 32图片 33        图片 34{
图片 35            const string quote = “\””;
图片 36            string result = “”;
图片 37
图片 38            if (input == null)
图片 39图片 40            图片 41{
图片 42                return null;
图片 43            }
图片 44
图片 45            result = input.Replace(quote, (quote + quote));
图片 46            result = quote + result + quote;
图片 47
图片 48            return result;
图片 49        }

2、获取指定形状指定Cell的值。除了艺术1,还有上边一种办法可以得到Cell的Value值。那种格局比使用Formula获取字符串的措施要好,是因为在Visio2007中下拉列表“资产归属”.对应的Cell的Value可能是INDEX(0,Prop.资产归属.Format),可是一旦利用上面的格局就足以健康获取到它实际的值了。
     

图片 50        public static string GetShapeCellValue(Shape shapeTarget, string strCellType)
图片 51图片 52        图片 53{
图片 54        const string CUST_PROP_PREFIX = “Prop.”;
图片 55            string shapeCellValue = string.Empty;
图片 56
图片 57            if (shapeTarget.get_CellExistsU(CUST_PROP_PREFIX + strCellType, (short)VisExistsFlags.visExistsAnywhere) != 0)
图片 58图片 59            图片 60{
图片 61                shapeCellValue = FormulaStringToString(shapeTarget.get_CellsU(CUST_PROP_PREFIX + strCellType).get_ResultStr(VisUnitCodes.visNoCast));
图片 62            }
图片 63
图片 64            return shapeCellValue;
图片 65        }

3、给指定的Shape赋值。措施2是读取,当然还索要写入到指定Shape,指定Cell的值

图片 66        public static bool SetShapeCellValue(Shape shapeTarget, string strCellType, string cellValue)
图片 67图片 68        图片 69{
图片 70         const string CUST_PROP_PREFIX = “Prop.”;
图片 71            bool breturn = false;
图片 72            if (shapeTarget.get_CellExistsU(CUST_PROP_PREFIX + strCellType, (short)VisExistsFlags.visExistsAnywhere) != 0)
图片 73图片 74            图片 75{
图片 76                shapeTarget.get_CellsU(CUST_PROP_PREFIX + strCellType + “.Value”).Formula = StringToFormulaForString(cellValue);
图片 77            }
图片 78            return true;
图片 79        }

4、判断形状某个属性是不是留存。奇迹在做一些操作前,必要判定某个属性是还是不是留存,以防访问指定的Cell不设有而抛出尤其。

图片 80        public static bool ShapeCellExist(Shape shapeTarget, string strCellType)
图片 81图片 82        图片 83{
图片 84        const string CUST_PROP_PREFIX = “Prop.”;
图片 85            bool breturn = false; 
图片 86            if (shapeTarget.get_CellExistsU(CUST_PROP_PREFIX + strCellType, (short)VisExistsFlags.visExistsAnywhere) != 0)
图片 87图片 88            图片 89{
图片 90                breturn = true;
图片 91            }
图片 92
图片 93            return breturn;
图片 94        }

5、取当前操作属性所在的行。Cell的行号有时候非凡主要,因而有必不可少提供一个函数获取对应Cell在ShapeData中的行号。

图片 95        public static int GetCustomPropRow(Shape shapeTarget, string propName)
图片 96图片 97        图片 98{
图片 99        const string CUST_PROP_PREFIX = “Prop.”;
图片 100            int intCustomRow = -1;
图片 101            if (shapeTarget.get_CellExistsU(CUST_PROP_PREFIX + propName, (short)VisExistsFlags.visExistsAnywhere) != 0)
图片 102图片 103            图片 104{
图片 105                intCustomRow = shapeTarget.get_CellsRowIndexU(CUST_PROP_PREFIX + propName);
图片 106            }
图片 107
图片 108            return intCustomRow;

6、判断Visio图纸上是还是不是有形状图元存在。若果图纸上尚未形状图元,你举办操作的时候可能会抛出“请求被剥夺”的足够,由此得以操作前先判断有设施在图片上为妙。

图片 109        public static bool HasShapeInWindow(Window window)
图片 110图片 111        图片 112{
图片 113            bool result = false;
图片 114            try
图片 115图片 116            图片 117{
图片 118                window.SelectAll();
图片 119                result = (window.Selection.Count > 0);
图片 120                window.DeselectAll();
图片 121            }
图片 122            catch
图片 123图片 124            图片 125{ ;}
图片 126
图片 127            return result;
图片 128        }

7、其余的局地功能设置

图片 129        //Visio2007的模样窗口中去除搜索形状功效
图片 130            VisApplication.Settings.ShowShapeSearchPane = false;
图片 131
图片 132图片 133            Visio2003的ShowShapeSearchPane达成格局#region Visio2003的ShowShapeSearchPane完成形式
图片 134            //Window searchWindow = wndVisio.Windows.get_ItemFromID(Convert.ToInt16(VisWinTypes.visWinIDShapeSearch));
图片 135            //if (searchWindow != null)
图片 136            //{
图片 137            //    searchWindow.Visible = false;
图片 138            //} 
图片 139            #endregion
图片 140
图片 141        //屏蔽Visio2007中的动态连接的意义(默许有)
图片 142            VisApplication.Settings.EnableAutoConnect = false;  
图片 143            VisApplication.Settings.StencilBackgroundColor = 10070188;

8、Name和NameU属性的异样
   Visio中许多性质都有一个同名+U的特性名称,一般意况下最好使用这几个称谓如NameU,因而这么些是一个唯一的名字,有时候你会意识Name相同,但他们就是分化,因为他们的NameU名称不雷同的。

9、境遇不晓得的操作仍旧性质,多用Visio文档的宏记录功用,然后对VBA代码举行解析和调节。

相关文章