我很清楚微软的支持基础文章说它不支持自动化办公产品UI.似乎Windows Server 2008 x64和Excel 2007强制执行给定的语句.
我在NT服务(本地系统帐户)OnStart方法中运行以下代码.当它在控制台应用程序中运行相同的代码时,它所做的只是Excel自动化.
提供的代码有两部分.第一部分启动Excel,创建一个新的工作簿并将其保存到给定的文件名.第二部分启动Excel的新实例并打开给定文件.打开操作以此异常结束:
服务无法启动.System.Runtime.InteropServices.COMException(0x800A03EC):Microsoft Office Excel无法访问文件'c:\ temp\test.xls'.有几个可能的原因:
•文件名或路径不存在.•该文件正由另一个程序使用.?您尝试保存的工作簿与当前打开的工作簿具有相同的名称.
为什么自动excel能够启动并将文件写入磁盘但是当它被要求"只是"打开现有文件时失败?
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
// launch excel and create/save a new work book
Microsoft.Office.Interop.Excel.ApplicationClass excel = new       Microsoft.Office.Interop.Excel.ApplicationClass();
excel.UserLibraryPath, excel.Interactive));
//            
string filename = "c:\\temp\\test.xls";
if(System.IO.File.Exists(filename)) System.IO.File.Delete(filename);
//
excel.Workbooks.Add(System.Reflection.Missing.Value);
excel.Save(filename);
excel.Quit();
excel = null;
// lauch new instance of excel and open saved file
excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
    Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open(filename,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                true,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                false,
                false,
                System.Reflection.Missing.Value, …我有一个完美的工作函数来查找和替换word文档中的文本变量.
HRESULT CMSWord::FindReplace( CString szVar, CString szText, bool bOnlyOnce/*=false*/ )
{
    if(m_pWApp==NULL || m_pActiveDocument==NULL) return E_FAIL;
    IDispatch *pDocApp;
    {  
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, L"Application", 0);
        pDocApp= result.pdispVal;
    }
    IDispatch *pSelection;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
        pSelection=result.pdispVal;
    }
    IDispatch *pFind;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"Find", 0);
        pFind=result.pdispVal;
    }
    OLEMethod(DISPATCH_METHOD, NULL, pFind, L"ClearFormatting",0);
    szText.Replace(_T("\r\n"), _T("\v")); 
    COleVariant sVariable(szVar);
    COleVariant sReplaceText(szText);
    COleVariant replace((long)2);
    COleVariant varBoolTrue;
    varBoolTrue.boolVal = true;
    COleVariant varBoolFalse;
    varBoolFalse.boolVal = false;
    COleVariant wdContinue((long)1); …我有一个Windows服务,通过Microsoft.Office.Interop.Excel.Application对象打开Excel电子表格.
Application xlApp = new Application();
Workbook workbook = xlApp.Workbooks.Open(fileName, 2, false);
...
...
workbook.Close();
xlApp.Quit();
我想杀死完成工作簿使用后剩余的EXCEL.exe进程.
我试过以下但没有成功......
// This returns a processId of 0
IntPtr processId;
GetWindowThreadProcessId(new IntPtr(xlApp.Hwnd), out processId);
Process p = Process.GetProcessById(processId.ToInt32());   
p.Kill();
任何人都有任何关于如何通过Windows服务这样做的想法?
我想运行一个宏,让我们从WorkSheet02上的WorkSheet01中调用它.
使用Microsoft.Office.Interop.Excel命名空间我打开了一个WorkSheet01.
public void Main_CodedStep()
    {
        // Object for missing (or optional) arguments.
        object oMissing = System.Reflection.Missing.Value;
        // Create an instance of Microsoft Excel
        Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
        // Make it visible
        oExcel.Visible = true;
        // Open Worksheet01.xlsm
        Excel.Workbooks oBooks = oExcel.Workbooks;
        Excel._Workbook oBook = null;
        oBook = oBooks.Open("C:\\Users\\Admin\\Documents\\Worksheet01.xlsm", oMissing, oMissing,
            oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, 
            oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
    }
然后我使用自动脚本来提取报告.此报告是通过IE的下载提示而不是Interop打开的.
当我尝试通过C#运行宏时出现了问题(我创建了另一个新的Excel.ApplicationClass();只有这样才编译,我相信这是我的失误之一.)
public void FirstMacro_CodedStep()
    {
        // Create an instance of Microsoft Excel …我编写了一个Delphi程序,它将单个.XLS文件的几个不同电子表格中的数据提取并合并到一个文本文件中,以便以后处理.这是一个Delphi 7 控制台程序.
最相关的代码段的摘录将向您展示,显然,我的程序表现得非常好,或者至少与它需要的程序一样多.
uses ...  ActiveX, ComObj ... ;
procedure Fatal(s:string);
  ...
  Halt(1);
var ExcelApp:Variant; (* global var *)
begin (* main program block *)
  coInitialize(nil);
  ExcelApp:=CreateOleObject('Excel.Application');
  try
    ExcelApp.Visible:=False;
    ExcelApp.WorkBooks.Open(ExcelFileName);
  ...
    XLSSheet := ExcelApp.Worksheets[ExcelSheetName];
  ...
    try
      XLSRange := XLSSheet.Range[ExcelRangeName];
    except
      Fatal('Range "'+ExcelRangeName+'" not found');
    end;
    if VarIsNull(XLSRange) then Fatal('Range '+ExcelRangeName+' not found');
    for row:=XLSRange.Row to XLSRange.Rows[XLSRange.Rows.Count].Row do
      for col:=XLSRange.Column to XLSRange.Columns[XLSRange.Columns.Count].Column do
        CellValue:=XLSSheet.Cells[Row,Col].Value;
        ...
        if CellValue<>'' then ...
        ...
    ExcelApp.Workbooks.Close;
    ...
  finally
    ExcelApp.Quit;
    coUninitialize;
  end;   
end.
有时,当程序退出时,XLS保持锁定状态.查看任务管理器,我看到在客户端程序运行时启动的Excel.exe进程仍在运行,eventhoug客户端程序已退出并成功卸载.
你碰巧知道这种行为的常见嫌疑人是什么?知道在哪里寻找总是在客户端执行时卸载excel?
我需要自动创建演示文稿(OpenOffice或Powerpoint).演示文稿应该将给定目录中每个演示文稿的前两张幻灯片放在一起,然后将它们组合成一个演示文稿.我很困惑我应该采取什么方法来解决这个问题.任何指针将不胜感激.
我可以看到很多非常相似的线程,但似乎没有什么能给我一个应该是非常基本的解决方案.
从我的winforms应用程序中,我需要关闭一个word文档的运行实例(从应用程序本身打开).当我从应用程序中打开word文档时,我会在列表中跟踪它.现在我该如何关闭同一个doc?
这是我尝试过的:
private bool CloseWord(string osPath) //here I pass the fully qualified path of the file
{
    try
    {
        Word.Application app = (Word.Application)Marshal.GetActiveObject("Word.Application");
        if (app == null)
            return true;
        foreach (Word.Document d in app.Documents)
        {
            if (d.FullName.ToLower() == osPath.ToLower())
            {
               d.What? //How to close here?
               return true;
            }
        }
        return true;
    }
    catch
    {
        return true;
    }
}
我得到了很多文档对象的方法,但只有一个.Close()关闭哪个有这样的参数:ref object SaveChanges, ref object OriginalFormat, ref object RouteDocument我不明白.
什么是理想的方式?谢谢..
编辑:
我无法关闭整个Word应用程序(WinWord),因为用户可能打开了其他word文件.
我需要终止单词实例(类似的东西Process.Kill())而不提示用户保存或不保存等.
我试图通过Windows服务自动化Office InfoPath 2010的多个并行实例.我知道不支持从服务自动化Office,但这是我的客户的要求.
我可以以并行方式自动化其他Office应用程序,但InfoPath的行为则不同.
我发现只要创建了一个INFOPATH.EXE进程的实例,无论进行多少并行调用CreateObject("InfoPath.Application").与此相反,可以通过类似的机制创建WINWORD.EXE的多个实例CreateObject("Word.Application")
要重现此问题,可以使用简单的控制台应用程序.
static void Main(string[] args) {
    // Create two instances of word in parallel
    ThreadPool.QueueUserWorkItem(Word1);
    ThreadPool.QueueUserWorkItem(Word2);
    System.Threading.Thread.Sleep(5000);
    // Attempt to create two instances of infopath in parallel
    ThreadPool.QueueUserWorkItem(InfoPath1);
    ThreadPool.QueueUserWorkItem(InfoPath2);
}
static void Word1(object context) {
    OfficeInterop.WordTest word = new OfficeInterop.WordTest();
    word.Test();
}
static void Word2(object context) {
    OfficeInterop.WordTest word = new OfficeInterop.WordTest();
    word.Test();
}
static void InfoPath1(object context) {
    OfficeInterop.InfoPathTest infoPath = new OfficeInterop.InfoPathTest();
    infoPath.Test();
}
static void InfoPath2(object context) {
    OfficeInterop.InfoPathTest …c# infopath windows-services office-automation office-interop
我想使用Word自动化(早期绑定)拼写/语法检查TDBRichEdit组件的内容,同时在此过程中保留源的RTF格式.显而易见的方法是使用剪贴板,如下所示:
它的工作原理,但我认为这是糟糕的编程,因为它与剪贴板内容混淆(这可能很烦人).
我刚刚偶然发现了Range对象的FormattedText属性,它允许通过将其分配给范围对象而不是通过剪贴板传递来复制和粘贴RTF格式的文本(包括段落格式).它被宣布为
property FormattedText:读取范围Get_FormattedText写入Set_FormattedText;
在WordXP.pas中,我不知道如何为它分配TDBRichEdit的内容.是否可以使用这家酒店?我也尝试过流式传输到word文档,但无济于事.
如何在不使用剪贴板的情况下将TDBRichEdit组件(DBRchEdit.Lines)的内容分配给Word文档(并在拼写/语法检查后将其恢复)?
努力从 C# 应用程序.NET 6打开 Office 文件。请注意,使用 .NET 框架可以正常工作。
官方 MS nuget 包Microsoft.Office.Interop.Word似乎仅支持 Office 2016。添加 Microsoft Word 16.0 对象库 COM 引用似乎也没有添加支持。
using Microsoft.Office.Interop.Word;
private void button2_Click(object sender, EventArgs e)
{
    var ap = new Microsoft.Office.Interop.Word.Application();
    Document document = ap.Documents.Open(@"C:\Users\name\Desktop\test.docx");
    ap.Visible = true;
}
单击此按钮时,会引发以下异常:
System.IO.FileNotFoundException:“无法加载文件或程序集“office,版本= 15.0.0.0,文化=中性,PublicKeyToken = 71e9bce111e9429c”。该系统找不到指定的文件。'
难道现在的365版本真的不支持了吗?
我已经确认我已经Microsoft.Office.Interop.Word在C:\Windows\assembly\GAC_MSIL.
c# ×4
excel ×3
com ×2
delphi ×2
ms-word ×2
.net-6.0 ×1
automation ×1
c#-2.0 ×1
delphi-2009 ×1
excel-2007 ×1
infopath ×1
mfc ×1
ole ×1
powerpoint ×1
vba ×1
visual-c++ ×1