Supprimer les lignes d'Excel

Voici les approches que j'ai essayées:

A) J'ai essayé de supprimer des lignes d'une feuille excel en utilisant Microsoft.Office.Interop.Excel . Je fais cela dans une tâche de script dans un package SSIS.

J'ai ajouté la bibliothèque au GAC, car il s'agissait d'une erreur: Could not load Library .

Maintenant, cela soulève cette erreur en disant: la Resortingeving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 .

Googling cela me dit que j'ai besoin de MS Office installé pour qu'il fonctionne, ce qui ne veut pas que le server sur lequel je déploie cette solution ne soit certainement pas installé sur MS Office. Je ne suis pas expert, mais j'aimerais savoir pourquoi de telles opérations ne sont pas possibles, en ajoutant simplement une reference à une DLL? Pourquoi est-il obligatoire d'installer MS Office.

B) J'ai également essayé le fournisseur de jet d'Oledb, mais celui-ci ne permet pas la suppression de lignes. Les seules opérations qu'il supporte sont insert, mettre à jour et sélectionner.

Les choses que j'ai rencontrées sur le Web:

A) La réponse d'une SO Questions suggère d'utiliser Npoi , mais je ne peux pas countr entièrement sur cela, car aujourd'hui, la bibliothèque gratuite peut être payée.

B) J'ai également rencontré la bibliothèque EPP Plus . Je l'ai utilisé et je comprends qu'il est basé sur une licence publique GNU, mais je crains de l'utiliser parce qu'il peut devenir un outil payé à l'avenir.

C) J'ai également rencontré des personnes utilisant le SDK Open XML par Microsoft. Avant de me salir les mains, j'aimerais que quelqu'un à l'avance me dise si je devrais utiliser cela. Non pas que je sois paresseux pour essayer moi-même, mais qu'est-ce qui serait utile pour moi avant de commencer, est-ce que ce SDK a besoin de programmes externes installés sur la machine. Parce qu'il me faut installer un msi pour nous le faire.

Existe-t-il un travail autour de cela en utilisant les composants Microsoft COM? Je ne pose pas de question subjective ici. Je veux connaître les obstacles techniques, le cas échéant lorsque j'utilise les trois outils de search ci-dessus.

Merci d'avance

Le point est qu'interop que vous devez avoir installé le bureau. Donc, à tort, vous ne pouvez pas utiliser Interop. Si vous avez besoin de prendre en charge les files xlsx, vous pouvez le faire en xml.

Consultez ceci et ce lien pour plus de détails sur le déballage des files xlsx, l'édition et le remballage. La seule chose dont vous avez besoin, c'est quelque chose à décompresser et votre propre code de gestion xml.

Si l'exigence est également de prendre en charge les files xls, vous avez un problème. J'ai essayé ceci dans le passé sans aucune installation supplémentaire mais n'a pas réussi, alors j'ai décidé de ne supporter que xlsx. J'avais besoin de certains files .msi ou d'un bureau installé sur le server.

Vous dites que vous utilisez une tâche de script dans SSIS; alors pourquoi ne pas importer le file Excel que vous souhaitez supprimer les valeurs (de preference dans une database ou la garder en cache dans une database), puis générer un nouveau file xls avec seulement datatables que vous souhaitez conserver.

OU n'utilisez pas la tâche de script et utilisez, à l'intérieur d'un stream de données, une source excel configurée combinée à un composant de script (qui est essentiellement la même chose qu'une tâche de script que vous ne pouvez l'utiliser que dans un stream de données ) et faites tout votre travail là-bas. Si vous avez une connection dynamic au file excel, vous pouvez toujours utiliser des variables (parameters si vous êtes sur DataTools) pour configurer une telle connection.

Bonne chance!

Si vous souhaitez utiliser Microsoft.Office.Interop.Excel alors, oui, vous avez besoin d'Excel sur le server. Par conséquent, tant que vous voulez seulement traiter les classurs basés sur xlsx / 2007+, je suggérerais que OpenXML soit le path à parcourir. C'est un peu une courbe d'apprentissage et vous comprenez combien de travail Excel fait pour vous en arrière-plan mais n'est pas trop grave une fois que vous vous y serez habitué.

Un échantillon très rapide a été renversé dans LINQPad :

 void Main() { ssortingng fileName = @"c:\temp\delete-row-openxml.xlsx"; using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fileName, true)) { // Get the necessary bits of the doc WorkbookPart workbookPart = doc.WorkbookPart; SharedSsortingngTablePart sstpart = workbookPart.GetPartsOfType<SharedSsortingngTablePart>().First(); SharedSsortingngTable sst = sstpart.SharedSsortingngTable; // Get the first worksheet WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); Worksheet sheet = worksheetPart.Worksheet; var rows = sheet.Descendants<Row>(); foreach (Row row in rows.Where(r => ShouldDeleteRow(r, sst))) { row.Remove(); } } } private bool ShouldDeleteRow(Row row, SharedSsortingngTable sst) { // Whatever logic to apply to decide whether to remove a row or not ssortingng txt = GetCellText(row.Elements<Cell>().FirstOrDefault(), sst); return (txt == "Row 3"); } // Basic way to get the text of a cell - need to use the SharedSsortingngTable private ssortingng GetCellText(Cell cell, SharedSsortingngTable sst) { if (cell == null) return ""; if ((cell.DataType != null) && (cell.DataType == CellValues.SharedSsortingng)) { int ssid = int.Parse(cell.CellValue.Text); ssortingng str = sst.ChildElements[ssid].InnerText; return str; } else if (cell.CellValue != null) { return cell.CellValue.Text; } return ""; } 

Notez que cela effacera la ligne de ne pas mélanger toutes les autres lignes. Pour ce faire, vous devriez fournir une certaine logique pour ajuster les index des rangées des lignes restantes.

Pour répondre un peu plus à la question OP – le ms OpenXML est tout ce qui est nécessaire en dehors de la norme .Net framework. L'exemple nécessite une reference à WindowsBase.dll pour l'API d'emballage et à l'aide d'instructions pour DocumentFormat.OpenXml.Packaging et DocumentFormat.OpenXml.Spreadsheet. Le package OpenXML API peut être référencé dans VS via Nuget aussi, vous n'avez même pas besoin d'installer le msi si vous ne le souhaitez pas. Mais il est logique de le faire IMHO.

Un autre élément que vous findez TRÈS utile est le msi des outils OpenXML. Cela vous permet d'ouvrir un document Word ou Excel et de voir la layout XML à l'intérieur – le plus utile.