2012-09-28 2 views
0

J'ai besoin de lire une feuille de calcul Excel 2003 qui provient du gouvernement HHS dept. Le XLS a fusionné des cellules, des macros protégées par mot de passe et des contrôles de formulaire (par exemple, des boutons, des listes déroulantes).Lire Excel avec des cellules fusionnées, des contrôles de formulaires, des feuilles protégées par mot de passe

Voici les exigences:

Je dois lire ce pragmatiquement sur un serveur qui ne dispose pas d'Excel installé.

Je ne peux pas utiliser le pilote OLE 4 car il a des problèmes avec les cellules fusionnées, les données sont supprimées. Ou peut-être que quelque chose d'autre comme les contrôles de formulaire le rejette. Excel m'empêche d'enregistrer des feuilles de calcul protégées par mot de passe comme XML et nous n'aurons pas le mot de passe.

J'ai essayé d'utiliser Excel 2007 et 2010 pour l'enregistrer en tant que XLSX et utiliser le pilote ACE OLE Excel. Les cellules fusionnées ne semblent pas être un problème, mais les contrôles de formulaire sont (peut-être que c'était vraiment le cas en utilisant le pilote JET, aussi). J'ai essayé un exemple de projet sur CodeProject qui lit le format BIFF natif et qui a fonctionné correctement avec 2003, mais étouffé en 2007 et 2010 et nous allons probablement le mettre à niveau bientôt, donc je ne veux pas le projeter bientôt obsolète . Existe-t-il une bibliothèque Open Source conviviale et fiable pour lire le format XLS natif capable de lire cette feuille de calcul ou dois-je décider si j'ai besoin de convaincre mon manager que nous devons acheter une troisième version? produit de fête ou obtenir une exception d'entreprise pita pour installer Excel sur un serveur. Le premier est l'approche préférée s'il n'y a pas d'autres options.

Quelle est ma meilleure option ou quelle serait une bonne bibliothèque tierce fiable?

Thx

+1

si la suppression du mot de passe permet d'enregistrer au format XML et qui est assez pour vous, jetez un oeil ici: [lien] (http://mcgimpsey.com/excel/removepwords.html) –

+0

Belle suggestion. Je vais regarder dedans. – ChadD

+0

Incidemment, j'ai été en mesure de supprimer le mot de passe, mais je ne pense pas que ce sera une solution pour moi. En plus des problèmes légaux possibles, je dois utiliser l'API EXCEL pour supprimer le mot de passe et c'est ce que j'essaie d'éviter. – ChadD

Répondre

0

Je ne suis pas sûr que ce soit exactement ce dont vous avez besoin, mais si vous utilisez NPOI (non Gembox) vous pouvez lire et modifier des classeurs protégés et de les enregistrer. Par exemple, vous pouvez essayer quelque chose comme ceci pour lire la valeur de la cellule A1, modifier la valeur de D4 et enregistrer le résultat. Ce travail même si le classeur est protégé (vous ne pouvez pas modifier x.xls en utilisant Excel).

 string fullPath = @"c:\tmp\x.xls"; 
     FileStream aFile = new FileStream(fullPath, FileMode.Open, FileAccess.Read); 
     HSSFWorkbook wb = new HSSFWorkbook(aFile); 
     aFile.Close(); 
     ISheet curSheet = wb.GetSheet("Foglio1"); 
     IRow aRow = curSheet.GetRow(0); 
     if (aRow == null) 
      aRow = curSheet.CreateRow(0); 
     ICell aCell = aRow.GetCell(0); 
     if (aCell == null) 
      aCell = aRow.CreateCell(0); 
     MessageBox.Show(aCell.StringCellValue); 
     aRow = curSheet.GetRow(3); 
     if (aRow == null) 
      aRow = curSheet.CreateRow(3); 
     aCell = aRow.GetCell(3); 
     if (aCell == null) 
      aCell = aRow.CreateCell(3); 
     aCell.SetCellValue("testValue"); 
     fullPath = @"c:\tmp\x2.xls"; 
     File.Delete(fullPath); 
     aFile = new FileStream(fullPath, FileMode.Create); 
     wb.Write(aFile); 
     aFile.Close(); 

Malheureusement il n'y a pas moyen de déprotéger une feuille en utilisant NPOI (au moins pas d'une manière que je connais), mais vous pouvez définir le mot de passe à tout ce que vous voulez, même sans connaître le mot de passe d'origine. Il est aussi simple que:

curSheet.ProtectSheet(string.Empty); 
Questions connexes