我在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) 我希望能够允许用户在Excel的单元格中输入自定义公式,该公式将订阅外部.NET应用程序提供的数据.例如,用户可能会输入...
=getCurrentValue("ABC")
Run Code Online (Sandbox Code Playgroud)
有一个外部.NET(C#)应用程序每分钟确定"ABC"的值.
单元格应该从外部应用程序显示"ABC"的初始值,并在外部应用程序发送新值时更新.
在过去,我认为外部应用程序将是一个DDE服务器,公式将是一个DDE客户端公式,但DDE显然已经死了.用于执行此操作的"正确"技术是什么?
请注意,电子表格需要通过公式提取数据.该信息不会进入固定模板excel文件,而是进入用户输入公式的任何电子表格中.
谢谢,
约翰
我正在使用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将它们呈现为字符串而不是评估公式.
从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?
我在运行Visual Studio 2010,.NET 4.5和Office 2010.我得到的,我尝试运行,我缺少的程序集引用了一些旧代码的警告 Microsoft.Office.Interop.Excel==12.0.0.0和Microsoft.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'.
我想在行/整张表中检测合并的单元格(最好).这是我的代码
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)
似乎工作..请告诉我如何检查工作表/特定范围是否包含合并的单元格.
我正在使用 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) 我已经成功地使用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)
但是,为了整洁,我宁愿将图表作为嵌入式资源.我想你不能拥有一切!
我试图阅读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) 我有一个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.