2013-05-23 13 views
8

Ho bisogno di creare un file Excel molto grande, ma il file excel in un foglio di lavoro può contenere fino a 65k righe. Quindi, voglio dividere tutte le mie informazioni in diversi fogli di lavoro dinamici. Questo è il mio codice approssimativoCome creare un nuovo foglio di lavoro nel file Excel C#?

//------------------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(); 

Come posso aggiungere nuovo foglio di lavoro all'interno del mio ciclo foreach e l'utilizzo di una certa condizione dare un nome al foglio di lavoro (quale l'utente può vedere in Excel in fondo alla pagina nella lista)?

qualcuno piace che

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

e come salvare tutti i fogli alla fine?

+0

Excel 2010 supporta 1 milione di righe. In quale versione sei? –

+0

Provo a salvare in .xls – Bryuk

+0

Ma anche se risparmierò nella versione 2010 la mia domanda è ancora comprensibile, perché sarà più leggibile nel formato. – Bryuk

risposta

9

Per aggiungere un nuovo foglio di lavoro per l'utilizzo della cartella di lavoro di questo codice:

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); 

Per salvare la cartella di lavoro chiamata Save() metodo:

xlWorkBook.Save(); 
+0

OK. Sembra buono =) Grazie. Proverò – Bryuk

1

Sei limitato a 65.000 record con .xls, ma se ti è "consentito" di andare oltre .xls/2003 e nel 2007 e sopra con .xlsx dovresti avere molte più righe.

Nota a margine, niente a che fare con la tua domanda, ma un po 'di tempo ho esportato in Excel con i nomi RDLC e foglio che ho rinominato usando la libreria NPOI, da allora ho iniziato a usare NPOI molto di più è gratuito/open source e molto potente (portato da POI Java a .net NPOI) ancora una volta mentre dico che non fa realmente parte della tua domanda non sarei sorpreso se avesse degli esempi su come farlo (no non lavoro per loro) http://npoi.codeplex.com/

ecco il codice che avevo scritto per i fogli di ridenominazione (che finisce per ricreare le lenzuola con un altro 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; 
     } 
    } 
+0

Grazie mille. Darò un'occhiata su di esso. Ma la mia domanda è ancora aperta =) Ho scritto una funzionalità completa e questo è l'ultimo passaggio di cui ho bisogno. – Bryuk

+0

So che sto cercando quello che ti serve Ho pensato che non stavo ancora rispondendo alla tua domanda, avevo in programma di modificarlo ormai ...: P –

3

Questo è il codice corretto che viene dato in MSDN.

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

For more information please click the link

0

in generale quando si desidera creare nuovo foglio solo fare:

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

sapendo che è già stato creato la cartella di lavoro come di seguito:

var workbook = excel.Workbooks.Add(Type.Missing);