标签: excel-interop

如何在C#中访问已打开的Excel文件?

我在Windows资源管理器中双击打开了excel工作簿,但无法在代码中访问它

Excel.Application xlApp = (Application)Marshal.GetActiveObject("Excel.Application");
Excel.Workbooks xlBooks = xlApp.Workbooks;
Run Code Online (Sandbox Code Playgroud)

xlBooks.Count等于0,为什么不引用我打开的工作簿?

编辑

以下是各种场景和发生的情况:

场景1:如果文件尚未打开

  • 代码打开工作簿,我很高兴.

场景2:如果文件最初是从代码打开的,我关闭并重新打开应用程序

  • 代码引用文件就好了xlBooks.Count等于1,我很高兴.

场景3:如果文件最初不是从代码打开,而是通过在资源管理器中双击它

  • 代码打开文件的另一个实例xlBooks.Count等于0,我很愤怒!

这是现在的整个代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

public class ExcelService : IExcelService
{
    const string _filePath = @"C:\Somewhere";
    const string _fileName = @"TestFile.xlsb";
    string _fileNameAndPath = Path.Combine(_filePath, _fileName);

    Application xlApp;
    Workbooks xlBooks;
    Workbook xlBook;
    Worksheet xlSheet;

    public ExcelService()
    {
        try
        {
            xlApp = (Application)Marshal.GetActiveObject("Excel.Application");
            xlBooks = xlApp.Workbooks;

            var numBooks = …
Run Code Online (Sandbox Code Playgroud)

c# excel ms-office office-interop excel-interop

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

通过.NET源代码公式将数据提取到Excel电子表格中的适当技术是什么?

我希望能够允许用户在Excel的单元格中输入自定义公式,该公式将订阅外部.NET应用程序提供的数据.例如,用户可能会输入...

=getCurrentValue("ABC")
Run Code Online (Sandbox Code Playgroud)

有一个外部.NET(C#)应用程序每分钟确定"ABC"的值.

单元格应该从外部应用程序显示"ABC"的初始值,并在外部应用程序发送新值时更新.

在过去,我认为外部应用程序将是一个DDE服务器,公式将是一个DDE客户端公式,但DDE显然已经死了.用于执行此操作的"正确"技术是什么?

请注意,电子表格需要通过公式提取数据.该信息不会进入固定模板excel文件,而是进入用户输入公式的任何电子表格中.

谢谢,

约翰

.net c# excel dde excel-interop

6
推荐指数
1
解决办法
1960
查看次数

使用Excel Interop的公式

我正在使用F#和Excel Interop将数据输出到Excel电子表格.我的第一个方法是单独设置每个单元格:

worksheet.Range(range1).Value2 <- "=sum(a1:a10)"
worksheet.Range(range2).Value2 <- "=min(a1:a10)"
worksheet.Range(range3).Value2 <- "=max(a1:a10)"
(* etc *)
Run Code Online (Sandbox Code Playgroud)

但是,当有大量公式时,这太慢了,所以我切换到了一个数组:

worksheet.Range(range).Value2 <- [| "=sum(a1:a10)"
                                    "=min(a1:a10)"
                                    "=max(a1:a10)" |]
Run Code Online (Sandbox Code Playgroud)

要么

worksheet.Range(range).Formula <- [| "=sum(a1:a10)"
                                     "=min(a1:a10)"
                                     "=max(a1:a10)" |]
Run Code Online (Sandbox Code Playgroud)

但是,现在Excel只在单元格中显示这些字符串,而不是计算公式的值.我也尝试过:

worksheet.Range(range).FormulaArray <- [| "=sum(a1:a10)"
                                          "=min(a1:a10)"
                                          "=max(a1:a10)" |]
Run Code Online (Sandbox Code Playgroud)

但这与每个公式的目标范围相混淆.我不确定那里发生了什么.(而不是将其保留为"a1:a10",Excel根据公式的位置转换目标范围.)

有一个更好的方法吗?

更新:我也尝试使用"= MIN($ G $ 2:$ G $ 5)",但这产生了相同的效果,其中Excel只显示字符串而不评估公式.

对于它的价值,如果我进入单元格,擦除然后重新添加公式中的任何字符,当我点击"输入"时,Excel将对其进行评估.

更新2:我也尝试了以下内容:

worksheet.Range(range).FormulaR1C1 <- [| "=sum(R2C[0]:R4C[0])"
                                          "=average(R2C[0]:R4C[0])"
                                          "=min(R2C[0]:R4C[0])"
                                          "=max(R2C[0]:R4C[0])" |]
Run Code Online (Sandbox Code Playgroud)

但我遇到了同样的问题:Excel将它们呈现为字符串而不是评估公式.

.net f# excel-interop

6
推荐指数
1
解决办法
3414
查看次数

IMessageFilter无法处理0x800AC472(VBA_E_IGNORE)使IMessageFilter的实现无关紧要吗?

msdn看来它似乎IMessageFilter没有处理所有异常,例如,在某些点,办公室应用程序'暂停'它们的对象模型,此时它不能被调用并抛出:0x800AC472 (VBA_E_IGNORE)

为了解决这个问题,你必须把你的呼叫放在一个循环中并等待它成功:

while(true)
{
    try
    {
        office_app.DoSomething();
        break;
    }
    catch(COMException ce)
    {
        LOG(ce.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果每次调用office应用程序的对象模型都需要这个样板代码,那么实现中是否有任何意义IMessageFilter

excel office-interop excel-interop c#-4.0

6
推荐指数
1
解决办法
1300
查看次数

无法添加对microsoft.office.interop.excel的引用

我在运行Visual Studio 2010,.NET 4.5和Office 2010.我得到的,我尝试运行,我缺少的程序集引用了一些旧代码的警告 Microsoft.Office.Interop.Excel==12.0.0.0Microsoft.Office.Interop.Access==12.0.0.0.

搜索后,我找到了这篇文章

我安装了主互操作组件,当我去添加/删除程序时,它们会出现在我的控制面板中.但是,我仍然没有从Visual Studio中的COM或.NET插件的添加引用下拉列表中选择对互操作程序集的引用.我在导航时也没有互操作程序集C: > Windows > assembly > GAC,如上一篇文章所述.

在我的系统中搜索标记为".Interop"的任何内容都不会产生Office.Interop文件.真的很令人沮丧,因为它说组件已经安装好了.

添加对Microsoft.Excel和Microsoft.Access COM插件的简单引用不会删除警告.

更新: 我能够让这个工作.Interop程序集的12.0版本是Office 2007的原生.我运行的是Office 2010,它具有版本14.0的程序集.这些程序集是向后兼容的,但我无法在浏览器中"看到"它们,因为我必须选择我的项目来构建'Any CPU'而不仅仅是'x86'.

.net c# reference visual-studio-2010 excel-interop

6
推荐指数
1
解决办法
6646
查看次数

如何使用MS interop excel检测c#中的合并单元格

我想在行/整张表中检测合并的单元格(最好).这是我的代码

Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel.Workbook workbook = xl.Workbooks.Open(source);
//Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[sheetNumber];
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[objInMemory._sheetName];
xl.ScreenUpdating = false;
ws.Columns.ClearFormats();
ws.Rows.ClearFormats();
int colCount = ws.UsedRange.Columns.Count;
int rowCount = ws.UsedRange.Rows.Count;
int strtRow = ws.UsedRange.Rows[1].Row;
int strtCol = ws.UsedRange.Columns[1].Column;


 Microsoft.Office.Interop.Excel.Range objRange = null;
Run Code Online (Sandbox Code Playgroud)

这段代码都没有

if (ws.Cells.MergeCells)
{

}
Run Code Online (Sandbox Code Playgroud)

也不是这段代码(仅适用于row1)

for (int j = strtCol; j < strtCol + colCount; j++)
{
    objRange = ws.Cells[strtRow, j];

    if (ws.Cells[strtRow, j].MergeCells)
    {
        message = "The Sheet Contains Merged Cells";
        break;
    }  
}
Run Code Online (Sandbox Code Playgroud)

似乎工作..请告诉我如何检查工作表/特定范围是否包含合并的单元格.

c# excel excel-interop

6
推荐指数
2
解决办法
8354
查看次数

检索 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件的 COM 类工厂失败 - 80080005

我正在使用 Interop 打开 Excel 实例来检索一些数据。然而以下行:

Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Run Code Online (Sandbox Code Playgroud)

给出了这个错误:

System.Runtime.InteropServices.COMException
  HResult=0x80080005
  Message=Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
  Source=mscorlib
  StackTrace:
   at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
   at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType)
   at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj)
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, …
Run Code Online (Sandbox Code Playgroud)

c# com-interop excel-interop

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

将图表模板应用于Excel图表

我已经成功地使用WPF在Excel中创建了一个图表.我可以使用以下方法将库存Excel布局应用于图表:

xlChart.ApplyLayout(i);
Run Code Online (Sandbox Code Playgroud)

其中xlChart是我的图表,'i'代表我选择的布局.

但是,我想比这更进一步,并应用我自己的自定义图表类型.我在Excel中创建了一个图表类型,并将其保存为crtx文件.我已将此作为嵌入式资源添加到我的项目中,并尝试将其应用于Excel图表,如下所示:

var file = new Uri("pack://application:,,,/Resources/Templates/line.crtx");
xlChart.ApplyChartTemplate(file.AbsoluteUri);
Run Code Online (Sandbox Code Playgroud)

然而,这失败了

HRESULT_FAIL
Run Code Online (Sandbox Code Playgroud)

我可能没有正确引用模板,所以希望那里的人能够提供帮助!

编辑:

我设法找到了解决方法.我可以将模板复制到输出目录并使用以下方法引用它:

var path = Path.GetFullPath("Resources/Templates/line.crtx");
xlChart.ApplyChartTemplate(path);
Run Code Online (Sandbox Code Playgroud)

但是,为了整洁,我宁愿将图表作为嵌入式资源.我想你不能拥有一切!

c# wpf excel-interop

5
推荐指数
0
解决办法
1344
查看次数

如何在c#中阅读excel表的注释

我试图阅读excel表中的评论,但无法这样做.请帮忙.提前致谢.我的代码如下 -

  Excel.Application appExl;
  Excel.Workbook workbook;
  Excel.Worksheet NwSheet;
  Excel.Range ShtRange;
  appExl = new Excel.Application();
  workbook = appExl.Workbooks.Open(Server.MapPath("~/" + System.Configuration.ConfigurationManager.AppSettings["ExcelFile"] + fileName), Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
  NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
  string obj = NwSheet.Range[0].Comment.Text;    
Run Code Online (Sandbox Code Playgroud)

c# excel excel-interop

5
推荐指数
1
解决办法
5387
查看次数

打开Excel文件时出现异常

我有一个Excel文件,在手动打开时会出错:

excel found unreadable content in *****.xlsx. Do you want to recover the content of this workbook? If you trust this workbook click yes.

如果我单击是,我可以通常的方式打开它,但如果我使用:

Excel.Application oExcelApp;
Excel.Workbook excelWorkbook = oExcelApp.Workbooks.Open(workbookPath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Run Code Online (Sandbox Code Playgroud)

我收到一个COMException:

Exception from HRESULT: 0x800A03EC

如何处理此异常.如何将其打开或显示每次手动打开时显示的错误.

我正在使用MS Office 2010.

c# office-interop excel-interop

5
推荐指数
1
解决办法
917
查看次数