l'écriture de données à partir de C# pour Excel interrompu par l'ouverture de la Fenêtre Excel
Alors que mon programme C# écrit des données en continu vers une feuille de calcul Excel, si l'utilisateur clique sur le menu supérieur droit et ouvre le
Excel Options de la fenêtre, ce qui provoque un Système.Moment de l'exécution.InteropServices.COMException avec HRESULT: 0x800AC472 qui interrompt les données
sur la feuille de calcul.
Idéalement, l'utilisateur doit être autorisé à le faire sans provoquer une exception.
La seule solution que j'ai trouvé ce code d'erreur a été de boucle et d'attendre jusqu'à ce que l'exception s'en alla:
Exception de HRESULT: 0x800AC472
qui entraîne le blocage de l'application, les données ne sont pas écrites Excel et l'utilisateur est laissé dans l'ignorance du problème.
J'ai pensé à désactiver le menu principal d'Excel lors de l'écriture, mais ne peut pas trouver une référence sur la façon de le faire.
Mon application prend en charge Excel 2000 à 2013.
Ici est de savoir comment reproduire le problème:
À l'aide de Visual Studio Express 2013 pour Windows Desktop .NET 4.5.1 sur Windows 7 64-bit avec Excel 2007.
Créer une nouvelle Application Console Visual C# du projet.
Ajouter une référence à "Microsoft ExceL 12.0 Object Library" (pour Excel) et de "Système.De Windows.Les formes" (pour messagebox).
Voici le code complet:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading.Tasks;
using System.Threading; //for sleep
using System.IO;
using System.Runtime.InteropServices;
using System.Reflection;
using Microsoft.Win32;
using Excel = Microsoft.Office.Interop.Excel;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int i = 3; //there is a split pane at row two
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
try
{
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlApp.Visible = false;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlApp.Visible = true;
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
//next 2 lines for split pane in Excel:
xlWorkSheet.Application.ActiveWindow.SplitRow = 2;
xlWorkSheet.Application.ActiveWindow.FreezePanes = true;
xlWorkSheet.Cells[1, 1] = "Now open the";
xlWorkSheet.Cells[2, 1] = "Excel Options window";
}
catch (System.Runtime.InteropServices.COMException)
{
System.Windows.Forms.MessageBox.Show("Microsoft Excel does not seem to be installed on this computer any longer (although there are still registry entries for it). Please save to a .tem file. (1)");
return;
}
catch (Exception)
{
System.Windows.Forms.MessageBox.Show("Microsoft Excel does not seem to be installed on this computer any longer (although there are still registry entries for it). Please save to a .tem file. (2)");
return;
}
while(i < 65000)
{
i++;
try
{
xlWorkSheet.Cells[i, 1] = i.ToString();
Thread.Sleep(1000);
}
catch (System.Runtime.InteropServices.COMException)
{
System.Windows.Forms.MessageBox.Show("All right, what do I do here?");
}
catch (Exception)
{
System.Windows.Forms.MessageBox.Show("Something else happened.");
}
}
Console.ReadLine(); //Pause
}
}
}
Lanch l'app, Excel s'affiche et les données sont écrites. Ouvrir Excel fenêtre de dialogue des options de menu et qu'apparaît le message d'erreur:
Une exception de type 'System.Moment de l'exécution.InteropServices.COMException' s'est produite dans mscorlib.dll et n'a pas été traité avant géré/native limite
Informations supplémentaires: Exception de HRESULT: 0x800AC472
Cliquez sur Continuer et mon messagege case "Tous les droits, que dois-je faire ici?" s'affiche.
Veuillez informer?
Meilleures salutations,
Bertrand
All right, what do I do here?
- si vous ne pouvez pas éviter l'exception d'être lancé alors vous avez besoin d'une façon de le gérer. The only solution I found to this error code was to loop and wait until the exception went away
ou I thought about disabling the main menu of Excel while writing to it, but cannot find a reference on how to do this.
- pouvez-vous ne pas aller en Plein Écran dans Excel ou désactiver le ruban?Sonne comme de la merde. Si vous êtes prêt à désactiver le menu, une alternative serait de créer un 99% transparent éternuer garde qui suit la fenêtre excel, mais cela laisse tout de même la question de l'accès au clavier. Je dirais que la meilleure solution est de mettre une info-bulle type d'avis de laisser l'utilisateur de savoir que vous êtes dans votre exception de la boucle.
comment me: vous obtenez la même erreur dans les versions antérieures d'Excel avec pas de ruban par l'ouverture de la fenêtre à Propos, il n'est donc pas un ruban question.
Mark Robbins: la désactivation du menu est possible, mais pas souhaitable solution. Je voudrais résoudre l'exception, vraiment.
Le problème avec excel est chaque carnet de travail est mono-thread, donc il ne peut pas travailler de manière asynchrone. Comme d'autres l'ont mentionné, vous êtes le meilleur désactiver le verrouillage de l'utilisateur à partir de la feuille de calcul pendant que vous travaillez. ou chiot un message qui dit s'il vous plaît ne pas le faire à l'instant, je suis en train de travailler
OriginalL'auteur Bertrand_Szoghy | 2014-05-22
Vous devez vous connecter pour publier un commentaire.
Nous sommes finalement allés tout le chemin vers le Support de Microsoft avec ce problème. Leur dernière réponse a été:
Puisque nous ne pouvons pas lire dans les pensées de l'utilisateur qui peut décider d'ouvrir une fenêtre ou de prendre des notes sans s'en rendre compte le soft a cessé d'enregistrement (si vous masque le message d'erreur), nous avons décidé de travailler autour de l'aide:
pour verrouiller la fenêtre Excel de l'INTERFACE utilisateur. Nous fournissons une évidente bouton "déverrouiller" mais, lorsque l'utilisateur clique dessus, il est sévèrement mis en garde dans une messagebox avec un "voulez-vous continuer?"
OriginalL'auteur Bertrand
OriginalL'auteur guest
Ce que j'ai fait avec succès est de faire un temp copie de la cible excel fichier avant de l'ouvrir dans le code.
De cette façon, je peux manipuler, il est indépendant de la source du document ouvert ou pas.
OriginalL'auteur Charles Okwuagwu
Faire Excel Interactif est une solution parfaite. Le seul problème est que si l'utilisateur est en train de faire quelque chose sur Excel en même temps, comme la sélection de la gamme ou de la modification d'une cellule. Et, par exemple, votre code est de retour à partir d'un thread différent, et en essayant d'écrire sur Excel les résultats des calculs. Donc, pour éviter le problème de mes suggestions est:
OriginalL'auteur v31
Une alternative possible à l'automatisation d'Excel, et de la lutte avec son " perculiarities, est d'écrire le fichier à l'aide de la OpenXmlWriter écrivain (DocumentFormat.OpenXml.OpenXmlWriter).
C'est un peu compliqué, mais ne poignée de feuilles avec > 1 million de lignes sans casser une sueur.
OpenXml docs sur MSDN
OriginalL'auteur j3r3m7