在我的形式中,我正在做一些简单的事情
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#编写的.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) 我正在使用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) 有关释放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)
或者不重要,我什么都不担心?
是否真的有必要从Office PIA释放COM组件,当你不再需要它们时,通过调用Marshal.ReleaseComObject(..)?
我在网上发现了关于这个主题的各种相互矛盾的建议.在我看来,由于Outlook PIA总是返回对其接口的新引用作为从其方法返回值,因此没有必要明确地释放它.我对吗?
这是关于如何在c#中正确清理excel互操作对象的后续问题 .
gyst是在Excel命名空间内使用链接调用(例如ExcelObject.Foo.Bar())来防止COM对象的垃圾收集.相反,应该显式创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式释放它们.
是否仅在特定于Excel COM对象的链式调用后释放COM对象的行为?每当使用COM对象时,应用这种模式是否过度?
我需要访问已经打开的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为什么它不能获得对已打开的工作簿的引用?
我正在开发一个将数据写入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)
这似乎都不起作用; 增加单元格字体大小的正确方法是什么?
我正在使用互操作库从一张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) 我有以下代码(从在线教程获得).代码正在运行,但我怀疑处理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)