web-dev-qa-db-fra.com

Comment créer une nouvelle feuille de calcul dans le fichier Excel c #?

Je dois créer un très gros fichier Excel, mais le fichier Excel dans une feuille de calcul peut contenir jusqu'à 65 000 lignes. Donc, je veux diviser toutes mes informations en plusieurs feuilles de calcul dynamiques. Ceci est mon code approximatif

 //------------------Create Excel App--------------------
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(numberOfLetters);

     foreach (string letter in letters)
     {
      xlWorkSheet.Cells[rowIndex, 1] = letter; 
      rowIndex++;
     }

xlWorkBook.SaveAs(pathXL, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();

Comment puis-je ajouter une nouvelle feuille de calcul à l'intérieur de ma boucle foreach et en utilisant une condition, donner un nom à la feuille de calcul (que l'utilisateur peut voir dans Excel en bas de la page dans la liste)?

Quelque chose comme ça

    foreach (string letter in letters)
    {
      if (letter == SOME)
      {
        AddNewWorksheet and give name SOME
      }
        xlWorkSheet.Cells[rowIndex, 1] = letter; 
        rowIndex++;
    }

Et comment enregistrer toutes les feuilles de calcul à la fin?

11
Bryuk

Pour ajouter une nouvelle feuille de calcul au classeur, utilisez ce code:

var xlSheets = xlWorkBook.Sheets as Excel.Sheets;
var xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = "newsheet";

// Uncomment a line below if you want the inserted sheet to be the last one
//xlWorkBook.Sheets.Move(After: xlWorkBook.Sheets.Count);

Pour enregistrer la méthode d'appel du classeur Save():

xlWorkBook.Save();
14
Andrey Gordeev

Il s'agit du code correct fourni dans MSDN.

Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)Globals.ThisWorkbook.Worksheets.Add(
    missing, missing, missing, missing);

Pour plus d'informations, veuillez cliquer sur le lien

4
Chamath Jeevan

En général, lorsque vous souhaitez créer une nouvelle feuille, faites simplement:

var worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add();

sachant que vous avez déjà créé le classeur comme ci-dessous:

var workbook = Excel.Workbooks.Add(Type.Missing);
2
AmiNadimi

Vous êtes limité à 65 000 enregistrements avec .xls, mais si vous êtes "autorisé" à aller au-delà de .xls/2003 et en 2007 et au-delà avec .xlsx, vous devriez avoir beaucoup plus de lignes.

Remarque, rien à voir avec votre question, mais il y a quelque temps, j'avais des problèmes d'exportation vers Excel avec RDLC et les noms de feuilles que j'ai renommés à l'aide de la bibliothèque NPOI, depuis lors, j'ai commencé à utiliser NPOI beaucoup plus, il est gratuit/open source et très puissant ( porté à nouveau de Java POI vers .net NPOI) alors que je dis que cela ne fait pas vraiment partie de votre question, je ne serais pas surpris s'il y avait des exemples sur ce sujet (non je ne ne fonctionne pas pour eux) http://npoi.codeplex.com/

Voici le code que j'avais écrit pour renommer les feuilles (qui finit par recréer les feuilles avec un autre memorystream

------------------------------------------------------------
var excelHelper = new ExcelHelper(bytes);
bytes = excelHelper.RenameTabs("Program Overview", "Go Green Plan", "Milestones", "MAT and EOC", "Annual Financials", "Risk Log", "Risk & Opportunity Log", "RAIL", "Meeting Minutes");

Response.BinaryWrite(bytes);
Response.End();
------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using NPOI.HSSF.UserModel;


namespace Company.Project.Core.Tools
{
    public class ExcelHelper
    {
        private byte[] _ExcelFile;

        public ExcelHelper(byte[] excelFile)
        {
            _ExcelFile = excelFile;
        }

        public byte[] RenameTabs(params string[] tabNames)
        {
            byte[] bytes = null;

            using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(_ExcelFile, 0, _ExcelFile.Length);
                var workBook = new HSSFWorkbook(ms, true);

                if (tabNames != null)
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        for (int i = 0; i < tabNames.Length; i++)
                        {
                            workBook.SetSheetName(i, tabNames[i]);
                        }
                        workBook.Write(memoryStream);
                        bytes = memoryStream.ToArray();
                    }
                }
            }
            _ExcelFile = bytes;
            return bytes;
        }
    }
1
Tom Stickel