Tag: vsto

如何从VSTO项目获取Excel模板path

我正在开发一个VSTO Excel 2010macros启用模板项目,我计划将其与各种其他文件/内容/资源打包并安装(WiX工具集)到目标机器上。 它的目的是,用户将点击一个快捷方式(例如从桌面)到Excel模板,用加载项启动Excel,然后从那里工作。 我在安装目录中也有一些由VSTO Ribbon Button触发的dotx报告。 问题是,如何从VSTO Ribbonbuttonfind安装目录? 由于新的Excel工作簿来自一个Excel模板,如果有像ThisWorkbook.Template.Path这样的东西,那就好了。 编辑 :我知道这个问题有两个部分,第一部分在这里回答,而第二部分需要澄清: 假设我在C:\ templates中有一个模板文件mytemplate.xltm。 然后双击文件打开Excel,默认情况下从文件创build一个“新的工作簿”。 现在我怎么能从“新工作簿”找回path“C:\ templates”? 我想知道哪里的文件mytemplatex.xltm或更好,哪个文件产生“新的工作簿”。 这个问题的答案应该在C#VSTO / Interop中给我“C \ templates \ mytemplate.xltm”。 谢谢。

将excel工作簿中的第一行复制到一个新的excel工作簿中

如何获得Excel工作簿中的第一行并使用.net c#将其保存到新的Excel工作簿? 我不知道列的数量,所以需要整行。 这是我有,但新的工作簿是空白的(没有行复制) Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(file); Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1]; Excel.Range xlRangeHeader = xlWorksheet.get_Range("A1", "A1").EntireRow; Excel.Workbook xlWorkbookNew = xlApp.Workbooks.Add(); Excel._Worksheet xlWorksheetNew = xlWorkbookNew.Sheets[1]; xlWorksheetNew.get_Range("A1", "A1").EntireRow.Value = xlRangeHeader; xlWorkbook.Close(false); xlWorkbookNew.SaveAs(Path.Combine(sDestination, Path.GetFileName(file)), fileFormat); xlWorkbookNew.Close(true);

范围查找方法和列宽

我遇到了一个我一直无法find文档的问题。 我一直在用数据填充电子表格。 然后,我正在search我的工作表中的一个特定的值,我发现其中一些找不到。 我“解决了”我的问题,但是我对Range.Find的行为感到非常惊讶。 发生了什么事情是,当我填充工作表时,有些值显示为######,因为列大小不够宽。 我注意到那些是无法find的价值。 在所有列上运行自动填充后,我可以find每个值。 除了调整列的大小,还有什么我可以做的吗? 编辑更新: 我第一次有这个: find.Find(day.ToShortDateString(), Type.Missing, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, Type.Missing, Type.Missing); 我把它切换到: find.Find(day.ToShortDateString(), Type.Missing, Excel.XlFindLookIn.xlFormulas, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, Type.Missing, Type.Missing); 现在列宽不是问题。 在哪些情况下会使用不同的.XlFindLookIn参数?

只需在Active Workbook上进行Excel计算,寻找解决方法

当您打开多个Excel文件,并且您的VBA / VSTO代码调用Calculatefunction,或打开自动计算时,Excel将痛苦地重新计算所有打开的工作簿 ,而不仅仅是活动的工作簿。 这是一个众所周知且报道良好的问题,这个问题已经存在了好几年了,但是微软似乎对解决这个问题并不感兴趣。 保存前只计算活动工作簿 Microsoft Excel心愿单:工作簿级别计算 可笑的是,在VBA和VSTO中,微软赋予我们以下能力: 重新计算一个特定的Worksheeet 重新计算所有打开的工作簿 …但是没有办法重新计算一个特定的工作簿。 在我工作的金融公司,这是一个很大的问题。 我们的精算师有大,庞大的Excel文件,充满公式,当他们点击一个工作簿上的计算,或者我们在保存文件之前执行计算,然后他们必须等待几分钟,所有其他打开的Excel文件也得到计算。 有两种方法可以解决这个问题。 你可以像这样运行一些VBA: Application.Calculation = xlManual For Each sh In ActiveWorkbook.Worksheets sh.Calculate Next sh 但是这不能保证工作。 您的“工作表1”可能包含指向“工作表2”中的单元格的公式,但“工作表2”中的其他单元格可能依赖于“工作表1”。 因此,计算每个工作表一次可能不足以对您的工作簿执行完整的计算。 或者,您可以在单独的实例中打开每个Excel文件(通过在打开Excel图标时按住ALT键)。 但是,如下所述,您将失去完整的Excel切换function: 不能完全切割Excel实例之间的粘贴 所以,我的问题是…有没有人find解决这个问题的方法 ? 我只想重新计算Active Excel工作簿中的单元格。 我想知道是否可以添加一些VBA或VSTO,在启动Active Workbook上的计算之前将所有非活动工作簿设置为“只读”,从而防止其他工作簿被重新计算。 但这是不可能的。 只能读取“ Workbook.ReadOnly ”,而不能以编程方式设置。 或者可能添加一个处理程序到Worksheet_Calculate事件,它检查正在运行的VBA代码是否属于活动工作簿,如果没有,它会中止尝试计算…? 但是这个事件实际上是在 Worksheet被计算出来之后被踢开的,所以已经太迟了。 我们公司不能成为唯一遭受这个问题的人… 任何build议(除了升级到莲花1-2-3)?

如何让Excel插件读取工作表中的行,直到没有更多的数据?

我已经开始使用C#编写Excel 2003的COM插件。 我正在寻找一个代码示例,展示如何从活动工作表读入单元格数据。 我已经看到,你可以写这样的代码: Excel.Range firstCell = ws.get_Range("A1", Type.Missing); Excel.Range lastCell = ws.get_Range("A10", Type.Missing); Excel.Range worksheetCells = ws.get_Range(firstCell, lastCell); 抓住一系列的细胞。 我可以使用的帮助是如何读取单元格数据,当你不知道有多less行数据。 我可能能够确定数据将从哪里开始,但是将会有未知数量的数据行要读取。 有人能给我提供一个如何从工作表读取行的例子,直到遇到一排空单元格为止? 也没有人知道如何抓住用户select的单元格的范围? 任何帮助将不胜感激。 这似乎是一个强大的开发工具,但我很难find详细的文档,以帮助我学习它:)

如何为Office 2007 .NET 3.5目标环境部署Excel 2010加载项?

在Office 2010 + .Net Framework 4.0的目标计算机上安装Excel 2010加载项是绝对没问题的。 但是,我不确定Excel 2010加载项是否与Excel 2007和.Net 3.5兼容。 任何人都可以告诉我有关为目标环境部署Excel 2010加载项的一些基本概念? 我会很感激。 此外,在安装项目的先决条件中,我目前有.NET 4 client profile , VS2010 tools for office runtime , Windows Installer 3.1检查。 我需要检查其他选项吗? 谢谢 编辑: pipe理将Excel 2010加载项安装到运行Office 2007的目标计算机上。 本教程已经介绍了大部分步骤,但有一些技巧需要注意。 主要项目 一定要在你的主项目中检查你的应用程序的目标框架 安装项目 在registry编辑器中,如果您正在部署自动化加载项(例如HKCR \ CLSID \ {您的自定义类ID} \ Programmable ),则除了上述教程中build议的那些外,还要创build以下新键: 将可编程键设置为AlwaysCreate = True (如果您不创build此键并将其正确设置,UDF将不会出现在自动化服务器列表中) 在启动条件编辑器中,添加Windows Installer Search ,并将其重命名为Search for […]

Excel VSTO加载项:我可以在代码中禁用Excel标题吗?

我正在为Excel(2007+)构buildVisual Studio工作簿加载项组件。 我有一些工作表在我的VSTO修改的工作簿,我想禁用代码中的标题。 (您可以在Excelfunction区>查看>标题checkbox中执行)。 有谁知道如何做到这一点?

在VSTO中的Excel中使用正确的分隔符get_Range

在用C#编写的Excel的VSTO项目中,我需要从单元格的string列表中获取Range对象。 这是一个简化版本的问题: string strRange = "A1:A2,A5"; Excel.Range r = sheet.get_Range(strRange); 但是,由于列表分隔符可以不同于在不同的文化设置逗号我实际上使用这个: listSep = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; string strRange = "A1:A2" + listSep + "A5"; Excel.Range r = sheet.get_Range(strRange); 我的问题是,当用户更改Excel选项>高级(Application.DecimalSeparator)中的“十进制分隔符”以匹配ListSeparator,这将无法正常工作。 用指定Range的string调用get_Range的正确方法是什么? 编辑:稍加修改,以添加我的评论下面的信息。

使用Recordset修改Excel数据透视表并刷新:例外

我在这里处于我的智慧的边缘,并且失去了一整天的时间去做一些不应该那么复杂的事情。 我有一个从Sybase查询返回的logging集。 此logging集用于在Excel中生成数据透视表。 到现在为止还挺好。 我想要更改数据透视表中的值并这样做我使用新值来更新logging集中的某些logging。 我可以在没有任何问题的情况下在RS中进行更新,并在下次迭代时将值保存在RS中。 问题是这些值不会反映在数据透视表中。 我努力了: pivotTable.Refresh(); COMException:PivotTable类的RefreshTable方法失败 pivotTable.PivotCache().Refresh(); ComException:从HRESULTexception:0x800A03EC pivotTable.Update(); 没有例外,但是这些更改不会反映在数据透视表中 我也尝试克隆logging集,并创build一个全新的数据透视表,但虽然Recordset有数据, PivotCache.RecordCount为0 码: var app = ExcelAppHelper.GetExcelApp(); if (app.ActiveCell == null || app.ActiveCell.PivotTable == null) return; PivotTable pivotTable = app.ActiveCell.PivotTable; var rs = (Recordset)pivotTable.PivotCache().Recordset; rs.MoveFirst(); s_lastSelectedPivotTree = new PivotFilterTree(); RecalculateSelectedValues(vmMain); while (!rs.EOF) { if (s_lastSelectedPivotTree.Contains(rs.Fields)) { foreach (var dataFieldName in s_lastSelectedDataFields) […]

如何从DataTable将其他工作表添加到Excel

我正在尝试创build一个有多个工作表的Excel报表。 这些工作表中的每一个都有来自DataTable的来自SQL查询的数据。 初始工作表创build正确,但是,我无法创build第二个工作表。 我明白我在做什么错了,但我只是不知道如何添加一个工作表使用下面的代码没有创build一个新的Excel工作簿的一切。 我正在考虑创build工作簿,然后添加工作表。 但我似乎无法使所有的点击。 这就是我想要的: static void Main(string[] args) { Excel_FromDataTable(testingTable); Excel_FromDataTable(testingTable); } } private static void Excel_FromDataTable(DataTable dt) { var excel = new Microsoft.Office.Interop.Excel.Application(); var workbook = excel.Workbooks.Add(true); int iCol = 0; foreach (DataColumn c in dt.Columns) { iCol++; excel.Cells[1, iCol] = c.ColumnName; } int iRow = 0; foreach (DataRow r in […]