标签: office-interop

C#默认情况下,使用1张创建Excel工作簿

我正在尝试使用C#COM互操作创建一个Excel文件,但它似乎默认创建了3张而不是空或只有一张.创建它需要什么空或只需一个:

Excel.Application xl = null;
Excel._Workbook wb = null;

// Create a new instance of Excel from scratch
xl = new Excel.Application();
xl.Visible = true;     
wb = (Excel._Workbook)(xl.Workbooks.Add(Missing.Value));

wb.SaveAs(@"C:\a.xls", Excel.XlFileFormat.xlWorkbookNormal,
 null, null, false, false, Excel.XlSaveAsAccessMode.xlShared,
 false, false, null, null, null);
Run Code Online (Sandbox Code Playgroud)

c# excel office-interop

11
推荐指数
1
解决办法
4万
查看次数

HTMLBody拒绝输出我指定的字体大小,总是以不同的大小结束

我正在尝试使用我的C#应用​​程序生成表单电子邮件.我应该在星期五的一个小时内完成这个......但是Outlook非常不听话.

似乎无论我在MailItem的HTMLBody中指定字体大小的方式,它的大小都略有不同.Font face总是按照指定出现,但大小永远不对.

email.HTMLBody = "<p style='font-size:11px;font-family:Calibri;'>girl look at that body</p>";
email.HTMLBody = "<style> body { font-family:'Calibri'; font-size:11px; } </style> <body>girl look at that body</body>";
email.HTMLBody = "<html><header><style> body { font-family:'Calibri'; font-size:11px; } </style></header> <body>girl look at that body</body></html>";
email.HTMLBody = "<span style='font-size:11px;font-family:calibri;'>girl look at that body</span>";
Run Code Online (Sandbox Code Playgroud)

生成8.5大小的字体.

email.HTMLBody = "<html><body><font face='Calibri' size='11px'>girl look at that body</font></body></html>";
email.HTMLBody = "<font face='Calibri' size='11px'>girl look at that body</font>";
Run Code Online (Sandbox Code Playgroud)

产生12号字体.

所以,似乎是通过CSS指定11px(或11pt,也尝试过)字体让我获得8.5px,并且通过字体标签获得12px.

我已经做了一些进一步玩弄这个,基本上,字体标签产生12pt字体,无论如何.所以这是一个死路一条,但我知道字体标签无论如何都被弃用了.CSS标签会给我不同的尺寸,但很少我要求的.它总是关闭,而不是一致的数量.

代码中的font-size =电子邮件中的font-size:

  • 12 = 9
  • 13 = 10
  • 14 …

css c# outlook font-size office-interop

11
推荐指数
2
解决办法
7564
查看次数

通过反射调用此[int index]

我尝试将基于反射的后期绑定库实现到Microsoft Office.Offce COM对象的属性和方法按以下方式调用:

Type type = Type.GetTypeFromProgID("Word.Application");
object comObject = Activator.CreateInstance(type);
type.InvokeMember(<METHOD NAME>, <BINDING FLAGS>, null, comObject, new object[] { <PARAMS>});
Run Code Online (Sandbox Code Playgroud)

InvokeMember是唯一可能的方法,因为Type.GetMethod/GetProperty与COM对象不能正常工作.

可以使用InvokeMember调用方法和属性,但现在我必须解决以下问题:

office-interop包装器中的方法:

Excel.Workbooks wb = excel.Workbooks;
Excel.Workbook firstWb = wb[0];
Run Code Online (Sandbox Code Playgroud)

分别

foreach(Excel.Workbook w in excel.Workbooks)
  // doSmth. 
Run Code Online (Sandbox Code Playgroud)

如何通过反射调用Excel.Workbooks的this [int index]运算符?

c# reflection office-interop

11
推荐指数
1
解决办法
3240
查看次数

在C#中的Excel [2007]中添加超链接 - 在Excel中自带

任何人都可以告诉我如何使用.NET中的Office Interop(c#)将Excel(2007或更高版本)中的超链接从一个工作表中的单元格添加到另一个工作表中的单元格

例如:从Sheet1 Cell A1到Sheet2 Cell B10的超链接

c# excel office-interop excel-interop

10
推荐指数
1
解决办法
2万
查看次数

在C#中访问PowerPoint图表

我在C#项目中遇到了问题.事实上,我创建了一个PowerPoint加载项,我想在幻灯片上生成图表.

我创建了一张幻灯片:

using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Interop.Graph;

Microsoft.Office.Interop.Graph.Chart objChart;
objChart = (Microsoft.Office.Interop.Graph.Chart)objShape.OLEFormat.Object;`
Run Code Online (Sandbox Code Playgroud)

图表是在幻灯片上创建的,但我无法访问要更新或插入的数据.

我尝试使用如下的数据表:

//DataSheet test = objChart.Application.DataSheet;
//test.Cells.Clear()
Run Code Online (Sandbox Code Playgroud)

这删除了图表的数据,但我无法弄清楚如何将值重新插入到图表数据中.

c# charts powerpoint office-interop

10
推荐指数
1
解决办法
5931
查看次数

禁用在Microsoft Office interop FileSaveAs方法中覆盖现有文件提示

我正在使用Ms Office Interop程序集来创建MS Project文件.要保存创建的文件,我使用的是FileSaveAs方法,它会提示一条消息,说明是否要替换现有文件.我想压缩消息,我没有在FileSaveAs方法中找到任何参数用于此目的.有什么想法吗?我使用C#作为我的编程语言.

c# interop ms-project office-interop

10
推荐指数
1
解决办法
7301
查看次数

microsoft.interop.excel格式化单元格

我正在使用C#中的microsoft.interop.excel库构建报告.

我有这样的事情:

 Range rangeTarget;
 .
 .
 .
 rangeTarget = worksheet.get_Range("C" + row, "N" + row);
Run Code Online (Sandbox Code Playgroud)

我希望范围显示其值作为整数,即没有小数位.我尝试过rangeTarge.AutoFormat,但不知道如何使用它.

有任何想法吗 ?

谢谢.

c# excel formatting office-interop excel-interop

10
推荐指数
2
解决办法
3万
查看次数

"您不能编辑此选项,因为它受到保护." 但仅限Office 2013以来?

几年来,我们已经在我们的应用程序中快速运行了这几行代码(以及Office,2003,2007和2010等多个版本).目的是在Word文档中执行一种邮件合并,用数据库中的名称,地址等替换字段占位符:

    Dim w As Word.Application
    Dim d As Microsoft.Office.Interop.Word.Document = Nothing
Run Code Online (Sandbox Code Playgroud)

...

    Dim f As Microsoft.Office.Interop.Word.Field
    For Each f In d.Fields
        f.Select()
        If fieldName = w.Selection.Text Then
            f.Result.Text = value
        End If
    Next
Run Code Online (Sandbox Code Playgroud)

但是,运行Office 2013的用户在该行上报告此错误f.Result.Text = value:

System.Runtime.InteropServices.COMException(0x800A17EC):您不能编辑此选择,因为它受到保护.

因此,这仅在用户运行Office 2013时才会发生,并且此错误的联机帮助很少.

文档的任何部分都不受保护,用户可以直接在Word中编辑文档而不会出现任何问题.

.net office-interop word-2013

10
推荐指数
1
解决办法
1万
查看次数

在VSTO Word插件中为多个文档创建和管理自定义任务窗格

我正在使用Visual Studio 2008中的VSTO开发Word 2007-2010插件.在我的插件中,我需要为每个打开的word文档创建一个自定义任务窗格.基本上,我需要为每个文档创建一个任务窗格,在文档窗口中显示正确的任务窗格,在文档关闭时执行某些操作,然后删除任务窗格及其所有引用.

这是我到目前为止所做的:

任务窗格创建

我为每个新的,打开的或现有的加载文档创建一个自定义任务窗格,如下所示:

((ApplicationEvents4_Event) Application).NewDocument += CreateTaskPaneWrapper;
Application.DocumentOpen += CreateTaskPaneWrapper;
foreach (Document document in Application.Documents)
{
    CreateTaskPaneWrapper(document);
}
Run Code Online (Sandbox Code Playgroud)

在CreateTaskPaneWrapper方法中,如果文档的任务窗格已存在,则检查Dictionary <Document,TaskPaneWrapper>.我这样做是因为如果我尝试打开已打开的文档,则会触发open事件.如果它不存在,我创建一个新的TaskPaneWrapper类.在其构造函数中,我创建了一个新的任务窗格,并将其添加到CustomTaskPanes集合中

Globals.ThisAddIn.CustomTaskPanes.Add(taskPane, "Title");
Run Code Online (Sandbox Code Playgroud)

根据MSDN,这将任务窗格与当前活动窗口相关联.

任务窗格关闭

Document.Close和Application.DocumentBeforeClose事件都不适合我,因为它们在用户发出关闭文档的确认之前触发.所以我在TaskPaneWrapper类中使用Microsoft.Office.Tools.Word.Document.Shutdown事件,如下所示:

_vstoDocument = document.GetVstoObject();
_vstoDocument.Shutdown += OnShutdown;

private void OnShutdown(object sender, EventArgs eventArgs)
{
    Globals.ThisAddIn.CustomTaskPanes.Remove(_taskPane);
    //additional shutdown logic
}
Run Code Online (Sandbox Code Playgroud)

所有这些似乎都很好用,创建了任务窗格,绑定到相应的窗口,并成功删除.但是,我仍有一个问题 - 当我启动Word时,会打开一个空白文档.如果我然后打开现有文档而不更改空白文档,则删除空白文档及其窗口,而不会触发Document.Close,Application.DocumentBeforeClose和Microsoft.Office.Tools.Word.Document.Shutdown事件.因为未调用OnShutdown并且未删除空白文档的任务窗格,所以下一个文档窗口包含两个任务窗格 - 非常新的任务窗格,以及第一个(孤立的)任务窗格.如何删除此孤立的任务窗格?访问已删除的文档或窗口引用会抛出COMException("对象已被删除").我暂时使用这个黑客:

//A property in my TaskPaneWrapper class
public bool IsWindowAlive()
{
    try
    {
        var window = _vstoDocument.ActiveWindow;
        return true;
    }
    catch (COMException)
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

在CreateTaskPaneWrapper方法中,我检查此属性是否包含所有现有包装器,并关闭属性为false的那些包装器.当然,捕捉异常有点贵,而且这个解决方案非常糟糕,所以我想知道,有更好的解决方案吗? …

vsto add-in ms-word office-interop customtaskpane

10
推荐指数
3
解决办法
6033
查看次数

如何将C#类公开给文档级外接程序中的VBA模块?

这是一个假设的情况.

我想知道是否可以在文档级外接程序中将C#类公开给VBA.

这是一个SSCCE:

在VS PRO 2012中,我启动了一个新项目,选择Office - > Excel 2010 Workbook.(确保选择.Net framework ver 4)

我已经DateTimePicker向Sheet1 添加了一个控件.

我可以在C#解决方案中设置/获取.Value属性DateTimePicker而不会出现问题.

在调试时:在VBA中,.Value属性不会公开.(试过.OLEFormat.Object.Value)

在此输入图像描述

并非所有属性都可以暴露给VBA,因为ActiveX控件DateTimePicker被包装,MSForms因此Excel可以识别它(兼容性).

我需要能够从VBA获取包装控件的实际值,但我不确定如何去做(无论是否可能)......

我知道控件本身支持事件,但这不是我想要的路径.我希望能够从控件中获取静态/当前值.


这是我希望能够做到的:

  • 在我的C#解决方案中添加一个类

  • 暴露它,所以它可以从VBA中恢复过来 Dim obj as new MyExposedClass

  • 然后在C#中显示MyExposedClass商店参考DateTimePicker(所有可用的属性)

  • 然后我可以定义一个GetValue(string controlName)从C#POV返回值的函数


所以我发现这个解决方案 +(这个)似乎与应用程序级外接程序一起使用,但它不适用于文档级外接程序.

当我调试我的解决方案并打开VBA的对象浏览器时,我可以看到引用被自动添加到Microsoft Visual Studio 2008 Tools …

c# vba vsto add-in office-interop

10
推荐指数
1
解决办法
2031
查看次数