相关疑难解决方法(0)

如何使用Microsoft.Office.Interop.Word创建.docx文档?

如何使用List中的Microsoft.Office.Interop.Word创建.docx文档?或者最好的方法是添加docx.dll?

http://www.c-sharpcorner.com/UploadFile/scottlysle/using-the-docx-dll-to-programmatically-create-word-documents/

更新.可能是我的第一个问题是痘痘不正确.Microsoft.Office.Interop.Word和DocX.dll有什么区别?在这两种情况下,我是否需要使用Microsft Word来创建和打开.docx文档?

c# ms-word docx .net-4.0

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

通过C#启动的PowerPoint不会退出

嘿,我是从C#WinForms应用程序自动化PowerPoint和Excel; 我所做的是从PowerPoint中读取幻灯片并将其保存在Excel中,然后退出这两个应用程序.Excel已成功退出,但PowerPoints未退出.问题是,当我第一次转换它不退出时,但当我再次转换时它确实.

这是我的代码

try
{
    PowerPoint.Application ppApp;
    PowerPoint.Presentation ppPres;
    List<Company> companies = new List<Company>();

    ppApp = new PowerPoint.Application();
    ppApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
    ppApp.WindowState = Microsoft.Office.Interop.PowerPoint.PpWindowState.ppWindowMinimized;

    ppPres = ppApp.Presentations.Open(fileTxtBox.Text,
                                      Microsoft.Office.Core.MsoTriState.msoFalse,
                                      Microsoft.Office.Core.MsoTriState.msoFalse,
                                      Microsoft.Office.Core.MsoTriState.msoTrue);

    int slides = ppPres.Slides.Count;

    for (int slide = 1; slide <= slides; slide++)
    {
        int rows = 1;
        PowerPoint.Cell cell;
        int shape = 1;

        for (; shape < ppPres.Slides[slide].Shapes.Count; shape++)
        {
            if (ppPres.Slides[slide].Shapes[shape].HasTable == Microsoft.Office.Core.MsoTriState.msoTrue)
            {
                cell = ppPres.Slides[slide].Shapes[shape].Table.Cell(1, 1);

                if (cell.Shape.TextFrame.TextRange.Text.Trim().ToLower().Contains("realized"))
                {
                    rows = ppPres.Slides[slide].Shapes[shape].Table.Rows.Count;
                    break;
                }
            }
        } …
Run Code Online (Sandbox Code Playgroud)

c# com powerpoint

9
推荐指数
1
解决办法
9337
查看次数

C#.Net4:正确处理(动态)COM对象

我需要从我的.Net4应用程序自动化办公文档(Word和Excel).

由于我无法真正强迫我的用户使用特定的Office版本,因此我不使用互操作程序集或tlbimp,因此我的项目不包含任何其他引用,如果未安装Office,整个应用程序也将失败(功能刚赢了)不可用).

相反,我问系统哪个COM服务器可以处理"Word.Application"或"Excel.Application":

dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
app.Foo();
Run Code Online (Sandbox Code Playgroud)

我担心如何在完成后正确处理"app"对象,因为现在我有两个内部管理系统需要担心(COM引用计数和.Net引用跟踪).理想情况下,我应该能够将动态app对象包装到一次性包装器类中,并确保在处理包装器时底层COM对象未被引用.

编辑:此外,我想知道当我完成它时如何正确地使COM对象"活着",因为Word是在一个单独的过程中.我应该能够实例化Word应用程序,自动化它,然后释放我的所有引用,但Word应用程序应该保持打开状态.

.net c# com com-interop

9
推荐指数
1
解决办法
6089
查看次数

在Windows服务中从C#杀死EXCEL.exe进程

我有一个Windows服务,通过Microsoft.Office.Interop.Excel.Application对象打开Excel电子表格.

Application xlApp = new Application();
Workbook workbook = xlApp.Workbooks.Open(fileName, 2, false);
...
...
workbook.Close();
xlApp.Quit();
Run Code Online (Sandbox Code Playgroud)

我想杀死完成工作簿使用后剩余的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();
Run Code Online (Sandbox Code Playgroud)

任何人都有任何关于如何通过Windows服务这样做的想法?

excel windows-services office-automation office-interop

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

C#interop:在将新工作表添加到现有文件后,excel进程不会退出

可能重复:
如何在C#中正确清理Excel互操作对象

我在这里阅读了许多关于管理COM引用的其他线程,同时使用.Net-Excel互操作来确保Excel进程在退出时正确退出,到目前为止,这些技术已经运行良好,但我最近遇到了一个将新工作表添加到现有工作簿文件时出现问题.

下面的代码留下了僵尸Excel进程.

如果我将工作表添加到新创建的工作簿文件,它将退出正常.如果我运行除.Add()行之外的代码,它会退出.(我正在读取的现有文件是由注释掉的代码创建的空文件)

有任何想法吗?

//using Excel = Microsoft.Office.Interop.Excel;
//using System.Runtime.InteropServices;
public static void AddTest()
{
  string filename = @"C:\addtest.xls";
  object m = Type.Missing;
  Excel.Application excelapp = new Excel.Application();
  if (excelapp == null) throw new Exception("Can't start Excel");
  Excel.Workbooks wbs = excelapp.Workbooks;

  //if I create a new file and then add a worksheet,
  //it will exit normally (i.e. if you uncomment the next two lines
  //and comment out the .Open() line below):
  //Excel.Workbook wb = wbs.Add(Excel.XlWBATemplate.xlWBATWorksheet);
  //wb.SaveAs(filename, …
Run Code Online (Sandbox Code Playgroud)

c# com excel interop pia

8
推荐指数
2
解决办法
3万
查看次数

在我的析构函数中释放Excel对象

我正在使用Microsoft.Interropt.Excel DLL编写Excel类.我完成了所有功能,但我的析构函数中有错误.我想将所有更改保存到我的文件中,并且我想要释放所有源代码.我希望所有这些都在我的析构函数中.但在我的析构函数中,Excel.ApplicationClass,Workbook和Worksheet对象由异常填充,其中包含消息"已与其基础RCW分离的COM对象无法使用".所以我不能保存任何东西,什么都不关闭因为ı无法访问工作簿或工作表对象.

我不能在Destructor中访问类私有成员吗?

.net excel destructor release finalizer

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

我什么时候需要调用ReleaseComObject?

在Microsoft Office AddIn中,我们在事件中传递COM对象.举一个特定的情况,当Word打开一个文档时,我们被调用并传递一个Document对象.那么我们什么时候需要调用Marshal.ReleaseComObject()?

  1. 如果我们访问Document对象,我们需要调用它吗?或者我们可以假设Word已经访问过它并将其清理干净吗?
  2. 如果我们访问Document.Name,它给我们一个字符串.由于字符串不是COM对象,我们不需要清理它 - 正确吗?
  3. 但是如果我们访问任何返回包装COM对象的类的成员(这是由成员方法/函数返回的任何类),我们确实需要调用release - 对吗?

如果我们错过了发布会怎么样?我们持有的任何COM对象在不确定的时间内包含在我们的类中,并且实现了IDisposable.我们完成后调用Dispose().但是处理这个问题的一些代码很复杂,我猜我们偶尔会遇到一个不调用Dispose的情况.

我们最好有一个终结器,然后为这些对象的每个实例增加开销(很多!)?或者我们最好使用少量从未发布的Word COM对象?

谢谢 - 戴夫

.net com office-interop

8
推荐指数
1
解决办法
1903
查看次数

如何从创建的"Excel.Application"对象中获取进程ID?

如何从正在运行的对象中获取进程ID?

Dim xlApp As Object  = CreateObject("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

我需要使用后期绑定,因为我无法保证我将获得哪个版本,因此使用Microsoft.Office.Interop.Excel将无法正常工作.

'do some work with xlApp

xlApp.Quit
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = nothing
Run Code Online (Sandbox Code Playgroud)

此时Excel仍在后台运行.我熟悉使用变量的所有建议并释放它们然后使用:System.Runtime.InteropServices.Marshal.ReleaseComObject(o).这不能可靠地工作.我正在做的工作非常复杂.我使用多个文件用于每个循环等.无法在Excel中释放所有资源.我需要一个更好的选择.

我想Process.Kill在Excel 上使用,但我不知道如何从xlApp对象获取进程.我不想杀死所有Excel进程,因为用户可能打开了工作簿.

我尝试使用Dim xProc As Process = Process.Start(ExcelPath)然后使用xProc.Kill()有时工作除了使用XLApp = GetObject("Book1").ApplicationXLApp = GetObject("", "Excel.Application")如果用户已经打开Excel窗口使用正确的Excel对象有点棘手.我需要一个更好的选择.

我不能使用GetActiveObjectBindToMoniker获取Excel对象,因为它们仅在使用早期绑定时才能工作.例如Microsoft.Office.Interop.Excel

如何从正在运行的对象中获取进程ID?

编辑:其实我真的不想对如何让Excel很好地退出进行重新考虑.许多其他问题都解决了这个问题 在这里这里我只想杀死它; 干净,准确,直接.我想要杀死我开始的确切过程而不是其他过程.

vb.net excel

8
推荐指数
2
解决办法
3万
查看次数

Excel流程未关闭

我有这个C#程序永远不会关闭Excel进程.基本上,它查找字符串在Excel中的范围中出现的实例数.我尝试了各种各样的东西,但它没有用.有一个Form调用此方法,但这不应该更改进程未关闭的原因.我看看Hans Passant的建议,但都没有.

编辑:我尝试了提到的东西,它仍然不会关闭.这是我更新的代码.编辑:尝试整个Process.Kill(),它的工作原理,但它似乎是一个应该工作的东西的黑客攻击.

public class CompareHelper
{
    // Define Variables
    Excel.Application excelApp = null;
    Excel.Workbooks wkbks = null;
    Excel.Workbook wkbk = null;
    Excel.Worksheet wksht = null;
    Dictionary<String, int> map = new Dictionary<String, int>();

    // Compare columns
    public void GetCounts(string startrow, string endrow, string columnsin, System.Windows.Forms.TextBox results, string excelFile)
    {
        results.Text = "";

        try
        {
            // Create an instance of Microsoft Excel and make it invisible
            excelApp = new Excel.Application();
            excelApp.Visible = false;

            // open a Workbook and get the active …
Run Code Online (Sandbox Code Playgroud)

c# excel winforms

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

ADO.Net SQLCommand.ExecuteReader()减慢或挂起

环境:

应用程序(用C#编写的.Net 4)最多有10个线程,每个线程都在自己的AppDomain中运行.每个线程都使用ADO.Net DataReader从SQL-Server 2008上获取存储过程的结果.另外一个线程可以使用ADO.Net来执行写操作(Bulk Insert).一切都在本地机器上运行.

问题#1:

偶尔(大约每30次运行)线程的执行会急剧减慢.当DataReader获取存储过程结果时会发生这种情况 - SqlCommand.ExecuteReader().通常读操作在10秒内执行.当它减速时,它会在10-20分钟内执行.SQLProfiler显示正在查询数据,但速度非常慢.

缓和的调用堆栈(请注意,没有例外):

at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32 )
   at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
   at System.Data.SqlClient.TdsParserStateObject.ReadString(Int32 length)
   at System.Data.SqlClient.TdsParser.ReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, Encoding encoding, Boolean isPlp, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ReadColumnData()
   at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
   at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
   at …
Run Code Online (Sandbox Code Playgroud)

.net c# sql sql-server ado.net

7
推荐指数
1
解决办法
8856
查看次数