c# .net excel service rpc

c# - System.Runtime.InteropServices.COMException(0x800706BA): el servidor RPC no está disponible.(Excepción de HRESULT: 0x800706BA)



.net excel (2)

Esta excepción

System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

se recibe en mi Servicio de Windows cuando lo ejecuto en cualquier máquina, pero cuando lo pruebo en una aplicación de prueba no se lanza ninguna excepción. En mi código, lo que hago es convertir dos archivos .DAT en archivos .xls. Cuando inicio el servicio a través de services.msc y ejecuto el servicio funciona bien durante un tiempo, pero después de actualizar ciertas filas arroja la excepción y luego no sucede nada después de eso. Tengo dos funciones separadas que hacen el trabajo por separado. El código de muestra es:

public void SaveData_component(string filename) { try { string filepath = System.Configuration.ConfigurationSettings.AppSettings["filepath"].ToString() + filename; filepath_first = filepath; object missing = Missing.Value; //string getExtension = Path.GetExtension(filepath); string getFilename = Path.GetFileNameWithoutExtension(filepath) + "New"; string filepathNew = System.Configuration.ConfigurationSettings.AppSettings["filepath"].ToString() + getFilename + ".xls"; try { xlAppNew1 = new Application(); xlAppNew1.DisplayAlerts = true; workbooks1 = xlAppNew1.Workbooks; workbook1 = workbooks1.Open(@filepath, 0, true, 1, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "/t", false, false, 0, true, 1, 0); // xlWorkSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook1.Worksheets.get_Item(1); xlAppNew1.ActiveWorkbook.SaveAs(@filepathNew, -4143, "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); string getExtension = ".xls";//Path.GetExtension(filepathnew); //string getFilename = Path.GetFileNameWithoutExtension(filepathnew); string connString = ""; if (getExtension.ToLower() == ".xls") connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepathNew + ";Extended Properties=/"Excel 8.0;HDR=YES;IMEX=1;/""; else connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepathNew + ";Extended Properties=Excel 12.0 Xml;HDR=Yes;IMEX=1;"; OleDbConnection con = new OleDbConnection(connString); con.Open(); System.Data.DataTable dtSheet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string tname = dtSheet.Rows[0]["TABLE_NAME"].ToString(); OleDbDataAdapter ad = new OleDbDataAdapter(@"Select * FROM [" + tname + "];", con); DataSet dset = new DataSet(); ad.Fill(dset, "ProductOrderBOM"); System.Data.DataTable dt = new System.Data.DataTable(); System.Data.DataTable dttocopy = new System.Data.DataTable(); dt = dset.Tables["ProductOrderBOM"]; if (dt != null || dt.Rows.Count > 0) { dttocopy.Columns.Add("Column1", typeof(string)); dttocopy.Columns.Add("Column2", typeof(string)); dttocopy.Columns.Add("Column3", typeof(string)); dttocopy.Columns.Add("Column4", typeof(string)); dttocopy.Columns.Add("Column5", typeof(string)); dttocopy.Columns.Add("Column6", typeof(string)); dttocopy.Columns.Add("Column7", typeof(string)); dttocopy.Columns.Add("Column8", typeof(string)); dttocopy.Columns.Add("Column9", typeof(string)); for (int iRow = 0; iRow < dt.Rows.Count; iRow++) { dttocopy.Rows.Add(dt.Rows[iRow][0].ToString().Substring(3, 9), dt.Rows[iRow][0].ToString().Substring(12, 4), dt.Rows[iRow][0].ToString().Substring(16, 18), dt.Rows[iRow][0].ToString().Substring(34, 8), dt.Rows[iRow][0].ToString().Substring(42, 4), dt.Rows[iRow][0].ToString().Substring(46, 18), dt.Rows[iRow][0].ToString().Substring(64, 40), dt.Rows[iRow][0].ToString().Substring(104, 3), dt.Rows[iRow][0].ToString().Substring(107, 5)); } foreach (DataRow item in dttocopy.Rows) { if (item.ItemArray[0].ToString() != "" && item.ItemArray[5].ToString() != "" && item.ItemArray[8].ToString() != "") { string prdorderno = item.ItemArray[0].ToString().Trim(); string materialcode = item.ItemArray[5].ToString().Trim(); double qty = Convert.ToDouble(item.ItemArray[8].ToString().Trim()); d1 = callprocedure(prdorderno, materialcode, Math.Round(qty, 2)); if (d1 != null) { if (d1.Tables[0].Rows[0]["Column1"] != null) { WriteStuff(d1.Tables[0].Rows[0]["Column1"].ToString()); } } } } } d1.Clear(); d1.Dispose(); dset.Clear(); dset.Dispose(); dtSheet.Clear(); dtSheet.Dispose(); dt.Clear(); dt.Dispose(); dttocopy.Clear(); dttocopy.Dispose(); ad.Dispose(); con.Close(); con.Dispose(); } catch (Exception Ex) { WriteStuff(Convert.ToString(Ex) + "save_datacomponent function before finally"); } finally { GC.Collect(); GC.WaitForPendingFinalizers(); if (workbooks1 != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks1); if (workbook1 != null) { workbook1.Close(Type.Missing, Type.Missing, Type.Missing); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook1); } if (xlAppNew1 != null) { xlAppNew1.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlAppNew1); } }

Esta es la función donde se realiza el trabajo. Cualquier ayuda sería muy apreciable. El método Writestuff () captura la siguiente excepción:

System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA) at Microsoft.Office.Interop.Excel.WorkbookClass.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)at MyNewService.MyNewService.SaveData_component(String filename)savedata_component functionSystem.IO.FileNotFoundException: Could not find file ''C:/SUMIT/COMPONENT_TAI_PT1_RMKH_3799_20130603_030504New_03-06-2013-18-07-09-537_04-06-2013-16-42-20-194.DAT''.

También si me deshago de los métodos claros en mi código y el

System.Runtime.InteropServices.Marshal.FinalReleaseComObject();

Otra excepción viene en mi camino:

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.at Microsoft.Office.Interop.Excel.WorkbookClass.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)at MyNewService.MyNewService.SaveData_component(String filename)

Realmente no estoy seguro de qué diablos está pasando.



http://support.microsoft.com/kb/257757

Mientras que el artículo indica que el soporte de Office 2003 ha finalizado, los contenidos siguen siendo válidos hoy: Microsoft no admite la automatización del lado del servidor de Office. Incluso en la automatización del lado del cliente Office interopera es bastante peculiar.

Lo mejor es con una biblioteca como Aspose o NPOI.