相关疑难解决方法(0)

C#Excel Interop:Excel进程保留在内存中,直到父表单关闭

在我的形式中,我正在做一些简单的事情

private void btnPrintPickList_Click(object sender, EventArgs e)
{
    using (var salesRpt = new SalesOrder(CurrentItem()))
    {
        salesRpt.CreateSpreadSheet();
        salesRpt.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遵循了"excel interop的无2点规则".

protected ExcelSheet(bool documentVisible, XlPageOrientation orientation)
{
    ExcelApplication = new Application {Visible = documentVisible};
    WorkBooks = ExcelApplication.Workbooks;
    WorkBook = WorkBooks.Add(XlSheetType.xlWorksheet);
    SheetList = WorkBook.Worksheets;
    Orientation = orientation;
    WorkSheet = (Worksheet) ExcelApplication.ActiveSheet;
}

public Application ExcelApplication { get; private set; }
public Workbook WorkBook { get; private set; }
public Workbooks WorkBooks { get; private set; }
public Worksheet WorkSheet { get; …
Run Code Online (Sandbox Code Playgroud)

c# excel interop

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

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
查看次数

以编程方式打开位于C#中的计算机中的Word文档

我正在使用WinForms.我有一个有按钮的表单.

目标:点击按钮:打开word文档.将文件路径硬编码到程序中的位置.我不希望用户必须找到word文档.

问题:我收到此错误消息.当我编写代码时,我在"应用程序"下面出现了一个红色错误行.

在此输入图像描述

    private void button1_Click(object sender, EventArgs e)
    { 
        this.Application.Documents.Open(@"C:\Test\NewDocument.docx", ReadOnly:true)

    }
Run Code Online (Sandbox Code Playgroud)

.net c# file winforms

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

应该以什么顺序释放COM对象和垃圾收集?

有关释放COM对象和垃圾收集的SO有很多问题,但我没有找到具体解决这个问题的任何问题.

在释放COM对象(在本例中特别是Excel Interop)时,我应该以什么顺序释放引用并调用垃圾收集?

在某些地方(比如这里),我看到了这个:

Marshall.FinalReleaseComObject(obj);
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

在其他人(如这里)这:

GC.Collect();
GC.WaitForPendingFinalizers();
Marshall.FinalReleaseComObject(obj);
Run Code Online (Sandbox Code Playgroud)

或者不重要,我什么都不担心?

c# com garbage-collection

6
推荐指数
1
解决办法
657
查看次数

发布COM组件

是否真的有必要从Office PIA释放COM组件,当你不再需要它们时,通过调用Marshal.ReleaseComObject(..)?

我在网上发现了关于这个主题的各种相互矛盾的建议.在我看来,由于Outlook PIA总是返回对其接口的新引用作为从其方法返回值,因此没有必要明确地释放它.我对吗?

.net c# outlook add-in pia

5
推荐指数
1
解决办法
1985
查看次数

如何在C#中正确清理互操作对象

这是关于如何在c#中正确清理excel互操作对象的后续问题 .

gyst是在Excel命名空间内使用链接调用(例如ExcelObject.Foo.Bar())来防止COM对象的垃圾收集.相反,应该显式创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式释放它们.

是否仅在特定于Excel COM对象的链式调用后释放COM对象的行为?每当使用COM对象时,应用这种模式是否过度?

c# excel interop garbage-collection com-interop

5
推荐指数
1
解决办法
1833
查看次数

在C#中访问打开的Excel工作簿

我需要访问已经打开的excel文件.我想只是检查一下.Workbooks它会存在的属性,但事实并非如此.获取对打开的工作簿的引用的正确方法是什么?

var app = new Microsoft.Office.Interop.Excel.Application();

// the count is 0 =(
app.Workbooks.Count == 0;
Run Code Online (Sandbox Code Playgroud)

编辑

我可以通过...获得Excel应用程序的引用

app = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
Run Code Online (Sandbox Code Playgroud)

app.Workbooks.Count仍然是0为什么它不能获得对已打开的工作簿的引用?

c# excel ms-office office-interop excel-interop

5
推荐指数
1
解决办法
9168
查看次数

使用C#更改excel中一个单元格的字体大小

我正在开发一个将数据写入Excel文件的项目.

现在一切都已完成,但是我需要一些比其他单元格更大的单元格(标题等).

我已经阅读过有关互联网的内容,但我仍然遇到同样的问题:当我执行我的代码时(见下面我已经尝试过的),工作表中的所有内容都变得更大了.

我已经尝试过的:

worksheet.Rows[1].Cells[7].Style.Font.Size = 20; 

worksheet.get_Range("A7", "A7").Style.Font.Size = 20;
Run Code Online (Sandbox Code Playgroud)

这似乎都不起作用; 增加单元格字体大小的正确方法是什么?

c# excel

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

Excel进程仍在后台运行

我正在使用互操作库从一张excel文件中读取一些数据.我通过使用Microsoft.Office.Interop.Excel然后读取工作表中的所有数据来获得数据.

Application ExcelApp = new Excel.Application();
Workbook excelWorkbook = ExcelApp2.Workbooks.Open(excelFileNamePath);
_Worksheet excelWorksheet = excelWorkbook.Sheets[excelSheetName];
Range excelRange = excelWorksheet.UsedRange;
//...for loops for reading data
ExcelApp.Quit();
Run Code Online (Sandbox Code Playgroud)

但是在我的应用程序终止后,我尝试编辑我的excel文件,并在打开时遇到一些问题.显然,即使我打电话,excel进程仍在后台运行ExcelApp.Quit().有没有办法正确关闭应用程序使用的excel文件?我是c#的新手,所以我可能在这里遗漏了一些东西.

编辑:解决了!显然,com对象的规则不鼓励使用2个点.

Excel.Application ExcelApp2 = new Excel.Application();
Excel.Workbooks excelWorkbooks = ExcelApp2.Workbooks;
Excel.Workbook excelWorkbook = excelWorkbooks.Open(excelFileName);
Excel._Worksheet excelWorksheet = excelWorkbook.Sheets[excelSheetName];
//...
excelWorkbook.Close();       
Marshal.ReleaseComObject(excelWorkbook);
Marshal.ReleaseComObject(excelWorksheet);
Marshal.ReleaseComObject(excelRange);
ExcelApp2.Quit();
Run Code Online (Sandbox Code Playgroud)

.net c# excel

5
推荐指数
1
解决办法
9117
查看次数

使用VB.NET配置Excel com对象的正确方法?

我有以下代码(从在线教程获得).代码正在运行,但我怀疑处理Excel com对象的方式有点不合适.我们真的需要调用GC.Collect吗?或者,处理此Excel com对象的最佳方法是什么?

Public Sub t1()
    Dim oExcel As New Excel.Application
    Dim oBook As Excel.Workbook = oExcel.Workbooks.Open(TextBox2.Text)

    'select WorkSheet based on name
    Dim oWS As Excel.Worksheet = CType(oBook.Sheets("Sheet1"), Excel.Worksheet)
    Try

        oExcel.Visible = False
        'now showing the cell value
        MessageBox.Show(oWS.Range(TextBox6.Text).Text)

        oBook.Close()
        oExcel.Quit()

        releaseObject(oExcel)
        releaseObject(oBook)
        releaseObject(oWS)
    Catch ex As Exception
        MsgBox("Error: " & ex.ToString, MsgBoxStyle.Critical, "Error!")
    End Try
End Sub

Private Sub releaseObject(ByVal obj As Object)
    Try
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
        obj = Nothing
    Catch ex As Exception
        obj = Nothing
    Finally
        GC.Collect() …
Run Code Online (Sandbox Code Playgroud)

.net vb.net com excel

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