web-dev-qa-db-fra.com

Définir la valeur de la cellule à l'aide d'Excel Interop

Ok, j'essaie donc de définir la valeur d'une cellule avec la bibliothèque d'interopérabilité Excel. Je suis capable de le faire avec ce qui suit:

sheet.Cells[row, col] = value;

mais c'est terriblement lent pour le nombre que je mets. Alors j'essaie d'aller dans cette voie:

Range excelRange = sheet.UsedRange;
excelRange.Cells.set_Item(row, col, value);

Le code s'exécute, mais aucune donnée n'est placée dans la cellule. Des suggestions sur ce que je manque? Merci!

15
Arthurdent510

Votre première méthode devrait fonctionner correctement pour tout nombre de cellules raisonnable (et beaucoup déraisonnable), à ​​condition que vous ayez désactivé la mise à jour de l'écran (Application.ScreenUpdating = false). The Article de la base de connaissances décrivant comment définir des cellules à l’aide d’accès C # par ligne et par colonne.

21
Andy Mikula

Avez-vous essayé de définir toutes les valeurs en même temps, au lieu de parcourir votre tableau et de définir une cellule à la fois? De cette façon, vous ne devez transmettre des données sur la limite COM qu'une seule fois, et non une fois par cellule.

Excel est très flexible à cet égard. Essayez ce qui suit:

int[] intArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Range rng = excelApp.get_Range("A1", "J1");
rng.Value = intArray; 

Vous devriez le faire plus rapidement que de parcourir chacune des cellules que vous souhaitez définir.

Sinon, désactivez ScreenUpdated comme le suggère Andy et envisagez de définir le calcul en manuel jusqu'à ce que votre processus de copie soit terminé.

16
Chris Spicer

Solution simple mais ici, vous devrez installer le package Microsoft.Office.Interop.Excel en écrivant dans la console Nuget 

Package d'installation Microsoft.Office.Interop.Excel

   //test Excel file
   Microsoft.Office.Interop.Excel.Application Excel = new Microsoft.Office.Interop.Excel.Application();

        Workbook workbook = Excel.Workbooks.Open(System.Windows.Forms.Application.StartupPath + "/TrainedFaces/AttendanceLog.xlsx", ReadOnly: false, Editable: true);
        Worksheet worksheet = workbook.Worksheets.Item[1] as Worksheet;
        if (worksheet == null)
            return;

        var abc = worksheet.Cells[2, 1].Value;
        Range row1 = worksheet.Rows.Cells[1, 1];
        Range row2 = worksheet.Rows.Cells[2, 1];

        row1.Value = "Test100";
        row2.Value = "Test200";


        Excel.Application.ActiveWorkbook.Save();
        Excel.Application.Quit();
        Excel.Quit();
0
Saif