标签: winforms-interop

使用Microsoft.Office.Interop.Excel SaveAs Error导出到.xlsx

我正在编写一个模块,用于将DataTable导出到Excel,Microsoft.Office.Interop.Excel但在开始认真之前,我想让基本工作正常工作:打开文件,另存为,关闭.

我已成功打开并保存扩展名为.xls的文件,但使用.xlsx扩展名保存不起作用.它写.xlsx文件,但当我尝试打开它时,我收到以下错误:

Excel无法打开文件'SomeFile.xlsx',因为文件格式无效.验证文件是否已损坏,文件扩展名是否与文件格式匹配.

我用来打开,保存和关闭文件的代码是:

Excel.Application excelApplication = new Excel.Application();
//excelApplication.Visible = true;
//dynamic excelWorkBook = excelApplication.Workbooks.Add();
Excel.Workbook excelWorkBook = excelApplication.Workbooks.Add();
//Excel.Worksheet wkSheetData = excelWorkBook.ActiveSheet;
int rowIndex = 1; int colIndex = 1;
excelApplication.Cells[rowIndex, colIndex] = "TextField";

// This works.
excelWorkBook.SaveAs("C:\\MyExcelTestTest.xls", Excel.XlFileFormat.xlWorkbookNormal,
    System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false,
    Excel.XlSaveAsAccessMode.xlShared, false, false, System.Reflection.Missing.Value,
    System.Reflection.Missing.Value, System.Reflection.Missing.Value);

// This does not!?
excelWorkBook.SaveAs("C:\\MyExcelTestTest.xlsx", Excel.XlFileFormat.xlWorkbookNormal, 
    System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false, 
    Excel.XlSaveAsAccessMode.xlShared, false, false, System.Reflection.Missing.Value, 
    System.Reflection.Missing.Value, System.Reflection.Missing.Value);

excelWorkBook.Close(Missing.Value, Missing.Value, Missing.Value);
Run Code Online (Sandbox Code Playgroud)

我也尝试了文件格式Excel.XlFileFormat.xlExcel12代替,Excel.XlFileFormat.xlWorkbookNormal但这甚至没有写,而是抛出COMException:

来自HRESULT的异常:0x800A03EC

解决这个问题的任何帮助都将非常受欢迎.

编辑:我现在也尝试过: …

c# excel winforms-interop

35
推荐指数
2
解决办法
12万
查看次数

数据导出到MS ACCESS时,"Microsoft.ACE.OLEDB.12.0"提供程序未在本地计算机上注册

我是初学者使用Microsft.ACE.OLEDB 12.0.我创建了一个Winforms应用程序VS 2010.

并创建一个函数,用于将数据网格数据导出到MS Access文件.我使用的是Microsoft Oledb

用于将数据网格数据导出到MS Access文件.但是当我尝试导出时出现此错误

数据到ms访问.

请看下面的图片.

在此输入图像描述

我还在我的应用程序中引用了Microsoft.Office 12.0对象库.

在此输入图像描述

批量构建配置

在此输入图像描述

c# ms-access office-2007 winforms-interop winforms

28
推荐指数
3
解决办法
9万
查看次数

WPF重绘问题

我有重绘WPF控件的问题.

WPF控件作为Windows窗体的ElementHost.Child添加.

当Windows 7进入节电模式并恢复正常时(通过在键盘上移动鼠标或按键),其余的Windows表单控件将重新绘制,但WPF部分不会重新绘制(并且Win 7背景在该地区).

在最小化和最大化应用程序时,WPF部分被重新绘制.

有人对这个问题有任何想法吗?

wpf wpf-controls winforms-interop

16
推荐指数
1
解决办法
2776
查看次数

WinForms到WPF - 我们如何从这里到达那里?

有没有一种实用的方法让我们慢慢将WinForms应用程序演变为WPF,而不会为奇怪的互操作场景创建支持梦魇?

背景资料:

我们有一个庞大的战舰灰色WinForms应用程序,大约60-75个用户的内部组使用.我们开始遇到可以看到在WPF中使用应用程序带来好处的地方,但这还不足以证明大型项目完全重写它的合理性.应用程序中的所有屏幕都是自包含的WinForms用户控件,而WinForms应用程序只是一个处理菜单,打开/关闭表单,提供一些共享帮助方法等的shell ...

到目前为止,我们最好的想法是将shell应用程序转换为WPF,然后在其中托管WinForms用户控件.我们认为我们可以随着时间的推移转换用户控件,将这些更改与具有足够业务价值的计划相结合,以支持额外的工作.我担心互操作性能如何以及它将如何影响性能.我也关注我们如何过渡到应用程序的新外观.让shell应用程序看起来很时髦,然后在其中托管旧的战舰灰色用户控件似乎很奇怪,在WPF中创建shell应用程序并使其看起来就像在WinForms中一样.

如果其中一个Caliburn,Prism或其他类似的框架可以缓解过渡,我们也愿意探索这些选择.

.net wpf client-server winforms-interop winforms

13
推荐指数
1
解决办法
2207
查看次数

如何在c#中运行时连接到Outlook 2010?

我想要做的是向winform客户端添加一个"Email To ..."按钮,该客户端打开一个新的Outlook邮件窗口并附加一个文件,以便用户可以转发它.如果outlook还没有运行,我可以让outlook集成工作得很好.这是一个C#.NET 4.0 winforms应用程序,使用Outlook 14.0互操作库,在Windows 7 64位计算机上运行Outlook 2010 32位.由于其他原因,我已将应用程序编译为x86,因此我怀疑它是32/64位问题.这是我的代码:

// Connect to outlook and create a new mail item
var app = new Outlook.Application();
var ns = app.GetNamespace("MAPI");
var mailItem = (Outlook.MailItem)ns.Application.CreateItem(Outlook.OlItemType.olMailItem);

// create the mail item and attach the file
mailItem.To = "";
mailItem.Subject = "Emailing: " + Path.GetFileName(_currentFilePath);
mailItem.Attachments.Add(_currentFilePath, Outlook.OlAttachmentType.olEmbeddeditem);

// show the email dialog window
mailItem.Display(true);
Run Code Online (Sandbox Code Playgroud)

如果outlook没有运行,它可以完美运行.一旦打开,我在第一行尝试创建Outlook.Application对象时收到以下错误:

由于以下错误,检索具有CLSID {0006F03A-0000-0000-C000-000000000046}的组件的COM类工厂失败:80080005服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE)).

任何想法会导致什么?这是某种版本的冲突吗?

email-integration ms-office office-interop outlook-object-model winforms-interop

12
推荐指数
2
解决办法
7158
查看次数

Windows窗体中的主机IDeskBand

我正在尝试从我自己的WinForm中的Windows任务栏显示地址工具栏.我可以得到地址toobar({01E04581-4EEE-11d0-BFE9-00AA005B4383})的CLSID ,我可以得到IDeskBand它的引用.但是......那又怎样?

Guid bandCLSID = new Guid("{01E04581-4EEE-11d0-BFE9-00AA005B4383}");
Type bandType = Type.GetTypeFromCLSID(bandCLSID);
IDeskBand deskband = (IDeskBand)Activator.CreateInstance(bandType);
Run Code Online (Sandbox Code Playgroud)

我试过托管它AxHost,但地址工具栏不是ActiveX控件.我试过打电话

(deskband as IOleObjectWithSite).SetSite(various interfaces);
Run Code Online (Sandbox Code Playgroud)

要么

(deskband as IDockingWindow).ShowDW(true);
Run Code Online (Sandbox Code Playgroud)

以及各种其他接口和他们的方法,但我做的任何事情似乎都没有让我到处.如果我真的能看到工具栏出现在任何地方,我会高兴的.但我似乎无法弥合IDeskBand引用和将其插入我的Windows窗体之间的差距.

有没有人试过这个,并且比我更进一步?

.net c# interop winforms-interop winforms

12
推荐指数
1
解决办法
906
查看次数

打开WPF用户控件winform窗口缩小父winform窗口

我有这样的WPF用户控件......

namespace WpfApplication1
{
    public partial class MyControl : UserControl
    {
    ......
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个win表单来包含这个WPF用户控件...

namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{

    public Form1()
    {

        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ElementHost ctrlHost = new ElementHost();
        ctrlHost.Dock = DockStyle.Fill;
        WpfApplication1.MyControl win = new WpfApplication1.MyControl();
        ctrlHost.Child = win;
        this.Controls.Add(ctrlHost);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我还有一个父按钮,有一个按钮.单击该按钮将打开包含ElementHost的Form1.

namespace WindowsFormsApplication4
{
    public partial class Parent : Form
    {
        public Parent()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        { …
Run Code Online (Sandbox Code Playgroud)

wpf winforms-interop winforms

12
推荐指数
1
解决办法
1522
查看次数

WPF用户控件中的键盘输入不会发送到WinForms容器

我们有一个WinForms应用程序,我们正在逐步转换为WPF.此时应用程序的主窗体是一个Form(WinForm),它包含一个用WPF构建的垂直侧边栏.侧栏托管在ElementHost控件中.

在主窗体中,KeyPreview设置为true,我们重写OnKeyDown()以处理应用程序范围的键盘快捷方式.当侧边栏具有焦点时,键盘事件不会发送到OnKeyDown.

解决这个问题的正确方法是什么?

wpf winforms-interop winforms

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

Microsoft Office互操作性能问题

我尝试将datagridview数据导出到我的C#4.0 Windows应用程序中的excel文件.

我们使用了Microsoft.Office.Interop.Excel dll版本12.0.0.0.它运作良好,一切

很好.但是,当我尝试导出超过1000个datagridview记录时,它需要太长时间

时间.我怎样才能提高性能.

请参阅下面的Excel帮助程序代码.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core;
using System.Runtime.InteropServices; // For COMException
using System.Reflection; // For Missing.Value and BindingFlags
using System.Diagnostics; // to ensure EXCEL process is really killed

namespace Export.Excel
{

    #region InstanceFields

    //Instance Fields
    //public delegate void ProgressHandler(object sender, ProgressEventArgs e);
    //public event ProgressHandler prg;
    private System.Data.DataView dv;
    private Style styleRows;
    private Style styleColumnHeadings;
    private Microsoft.Office.Interop.Excel.Application EXL;
    private Workbook workbook;
    private Sheets sheets;
    private …
Run Code Online (Sandbox Code Playgroud)

c# excel office-2007 winforms-interop winforms

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

从WPF WindowsFormHost设置"AcceptButton"

我有一个winforms usercontrol,在WPF控件中有多个按钮.

我的usercontrol以前托管在Windows窗体中,我能够这样做

this.ParentForm.AcceptButton = this.btnSearch;
Run Code Online (Sandbox Code Playgroud)

我正在尝试建立如何在usercontrol上执行类似操作,因为它在WindowsFormHost中.ParentForm属性为null.

理想情况下,我希望实现两件事.

  1. AcceptButton行为(输入按键触发按钮)
  2. AcceptButton格式 - 即winforms按钮具有应用的接受按钮的备用格式.

非常感谢,克里斯

c# wpf winforms-interop winforms

9
推荐指数
2
解决办法
5218
查看次数