Tag: 互操作

如何使用Excel导出function部署我的应用程序?

我已经做了一个使用Excel参考( Microsoft.Office.Interop.Excel, Version=12.0.0.0 )以.xls格式导出文件的ASP.Net应用程序。 如果托pipe服务器安装了MS Office,它工作正常。 我的问题是,我想部署我的应用程序,而不必在托pipe服务器上安装完整的MS Office。 我想只复制我的bin文件夹中的一些Dll来解决依赖关系。 当我在没有预安装MS Office的服务器上部署应用程序时,出现此错误。 错误:无法加载文件或程序集“Office,Version = 12.0.0.0,Culture = neutral,PublicKeyToken = 71e9bce111e9429c”或其某个依赖项。 该系统找不到指定的文件。 有没有人遇到这个问题,并find一些解决办法? 谢谢

C#线程和内存泄漏

我正在编写一个通过Interop打开Microsoft Excel的应用程序。 我遇到的问题是如果应用程序本身locking或内存泄漏,我的应用程序被阻止,将不会继续线程。 我有一个父线程查看目录,并在每个文件的循环中写入 转换( “src.xls”, “src.pdf”,NULL); 有时候,例如,如果我们给excel文件types,它不能打开它将locking。 这将locking我的线程,迫使我不得不杀死进程。 public static class ExcelConverter { public static bool Convert(string srcFile, string destinationFile, object[] parameters) { bool bStatus = false; Workbook excelWorkBook = null; Excel.Application application = null; try { application = new Excel.Application(); object missingParam = Type.Missing; excelWorkBook = application.Workbooks.Open(srcFile); if (excelWorkBook != null) { excelWorkBook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, […]

不能隐式地将types“对象”转换为“Microsoft.Office.Interop.Excel.Range”

错误CS0266:无法将types“对象”隐式转换为“Microsoft.Office.Interop.Excel.Range”。 存在明确的转换(您是否缺less演员?) 请帮助:) Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; Excel.Range range; xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open("C:\\Base.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(3); range= xlWorkSheet.UsedRange.Columns[1,Type.Missing];

隐藏Excel 2013,同时以编程方式更改工作簿

Excel 2013的一个非常好的新function是,它不能强迫在一个应用程序中显示多个Excel工作簿。 这似乎是我的问题的原因: 如果我使用c#编程打开Excel工作簿,并且Excel 2013以新的应用程序窗口开始。 我可以用代码工作簿没有问题,但我想隐藏应用程序。 运用 Excel.Application excelApp = new Excel.Application(); …… excelApp.Workbooks.Open(…); excelApp.Visible = false; 显示后隐藏应用程序窗口。 有没有办法停止显示在Excel 2010或更早版本的应用程序?

在C#中从后台线程更新Excel 2003中的checkbox有时会失败

我在C#中创build了一个实现用户定义函数的加载项。 这些UDF立即返回,但它们控制后台asynchronous过程。 这些程序的状态需要被监视并呈现给Excel。 我select使用checkbox显示状态。 后台线程然后更新链接到特定后台程序的checkbox。 我使用try / catch块将调用包装到Excel模型中,并在延迟后重试调用,以防Excel未准备好引发exception。 这个机制也能正常工作。 问题是有时,即使修改checkbox的代码运行成功,checkbox本身也不会在Excel中修改。 我已经对我正在更改的checkbox属性进行了完整性检查,可以看到它们在日志中没有更改: checkBox.Value = false; checkBox.Interior.Color = 0x00DDDDDD; // light grey in AABBGGRR format checkBox.Caption = "Off"; // this sometimes prints the values the checkbox had before the above line LogDebug( "Color: " + checkBox.Interior.Color + " Value:" + checkBox.Value + " caption:" + checkBox.Caption ); […]

使用Interop后释放Excel

我已经阅读了很多post寻找我的答案,但都是类似于这样的: 读取excel文件在vb.net叶excel进程悬挂 我的问题是,我不退出应用程序… 这个想法是这样的: 如果用户有Excel打开,如果他有我感兴趣的文件打开…获取该Excel实例,做任何我想做的事情… 但是我完成后不要closures他的文件…我希望他继续工作,问题是当他closuresExcel时…进程继续运行…并正在运行…和用户使用XbuttonclosuresExcel后运行… 这是我如何做到这一点 这篇文章是用来知道他是否打开Excel,并且在我检查我感兴趣的文件名。 Try oApp = GetObject(, "Excel.Application") libroAbierto = True For Each libro As Microsoft.Office.Interop.Excel.Workbook In oApp.Workbooks If libro.Name = EquipoASeccionIdSeccion.Text & ".xlsm" Then Exit Try End If Next libroAbierto = False Catch ex As Exception oApp = New Microsoft.Office.Interop.Excel.Application End Try 这里是我的代码…如果他没有打开Excel,我创build一个新的实例,打开文件和其他一切。 我的代码以这个结尾: If Not libroAbierto Then libroSeccion.Close(SaveChanges:=True) […]

Excel互操作中奇怪的偶发InvalidCastException

我正在开发一个相当全面的Excel加载项,应用了很多操作。 拿一个工作簿,以新名称保存,应用操作(添加名称,更改公式等)。 一般来说,它工作正常,但不时.net几乎任何我的CType抛出一个InvalidCastException。 当我确认错误并在完全相同的Excel工作簿上再次运行代码(不退出Excel)时,不会发生错误。 发生InvalidCastException的可能是所有尝试中的40%,否则加载成功。 最近,我不得不从C#转换到VB.Net。 我一直使用CType,比如Dim interior = CType(cl.Interior, Excel.Interior) (其中一个失败语句)。 该错误不会发生在同一地方,但在我的程序,也转换范围时,也For Each r As Excel.Range In largerRange以及当我使用Object在For Each和CType到Excel.Range。 在后一种情况下,我获取范围内的对象,但CType到Excel.Range失败。 那么有什么方法可以在这个时候检查对象呢? 我真的不知道为什么外接程序一次失败,另一个完成没有错误,即使没有重新加载Excel(或任何其他参与的DLL)。 任何帮助将不胜感激! PS:VS2010,.Net 3.5SP1,Excel 2007,Imports Excel = Microsoft.Office.Interop.Excel

使用C#在Excel中使用预定的签名者,电子邮件等创build签名行

我正在使用Excel为我公司的会计部门自动生成表单。 我需要每个表单都有一个Excel签名行对象,其中包含预定的签名者信息(姓名,职务,电子邮件),并准备好签名。 到目前为止,我已经创build了签名行 xlApp.ActiveWorkbook.Signatures.AddSignatureLine(); 其中xlApp是我的Excel应用程序。 当我运行代码时,它会生成签名框,但popup窗口询问预定的签名者的名称,标题和电子邮件。 我试过使用 SendKeys.Send(name + "{TAB}Peon{TAB}" + email + "{TAB}{TAB}{TAB}{TAB}~"); 手动input信息,因为我找不到任何方法来创build接受此信息的签名行。 然而,代码挂起,直到popup窗口closures,永远不会到填写我需要的信息的行。 我想在Excel中压制警报和popup窗口,但是我找不到在哪里编辑签名行对象的属性。 任何想法如何实现我的目标? 谢谢,如果你能帮助!

在服务器上发布excel interop不起作用

在当地工作很好, Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Application excel = null; Workbook wb = null; excel = new Application(); excel.Visible = false; excel.DisplayAlerts = false; excel.AlertBeforeOverwriting = false; wb = excel.Workbooks.Open(Server.MapPath(fileName), Type.Missing, false, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); wb.Save(); wb.Close(false, null, null); excel.Quit(); 在服务器Windows 7 Ultimate x64上发布后,我得到了这个问题: Microsoft Office Excel […]

Excel Interop Range.Value = arr 当arr 包含date小于1900-01-01时与0x800A03EC崩溃

我理解的基本问题是,Excel表示1900-01-01为1的值。但是,在Excel中可以手动input1900以前的值。 // this converts the DataTable to an Object[,] DataTable table = … Object[,] arr = DataTableUtils.toObjectArray(table, false); Range r00 = r0.get_Resize(arr.GetLength(0), arr.GetLength(1)); r00.Value = arr; // <– this will crash if … 如果arr [,]在1899-12-31之前包含DateTime对象,则会导致0x800A03ECexception。 奇怪的是,1899-12-31很好,Excel增加了一天的价值。 最初我用1900-01-01replace了1900年前的date,但在输出文件中,它们是1900-01-02! 目前,我正在使用解决方法来replace错误的DateTime值。 但是,如果有人有更好的解决scheme,请让我知道。