2013-05-23 13 views
8

Potrzebuję stworzyć bardzo duży plik Excela, ale plik Excela w jednym arkuszu może zawierać do 65 tys. Wierszy. Tak więc chcę podzielić wszystkie moje informacje na kilka arkuszy dynamicznych. To mój przybliżona kodJak utworzyć nowy arkusz roboczy w pliku 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(); 

Jak mogę dodać nowy arkusz wewnątrz mojego pętli foreach i za pomocą jakiegoś stanie dać nazwę na arkuszu (które użytkownik może zobaczyć w programie Excel na dole strony w liście)?

Niektórzy lubią tego

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

i jak zapisać wszystkie arkusze na końcu?

+0

Excel 2010 podporach 1 milion wierszy. Którą wersję masz? –

+0

Próbuję zapisać w .xls – Bryuk

+0

Ale nawet jeśli zaoszczędzę w wersji 2010 moje pytanie jest nadal sensowne, ponieważ będzie bardziej czytelny. – Bryuk

Odpowiedz

9

Aby dodać nowy arkusz do skoroszytu wykorzystaniem tego kodu:

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

Aby zapisać skoroszyt Save() wywołanie metody:

xlWorkBook.Save(); 
+0

OK. Wygląda dobrze =) Dzięki. Spróbuję – Bryuk

1

Ograniczenie do 65 000 rekordów z rozszerzeniem .xls, ale jeśli "pozwolono" na przekroczenie poziomu .xls/2003 i do wersji 2007 i wyższej z rozszerzeniem .xlsx, powinno być o wiele więcej wierszy.

Notatka poboczna, nie ma nic wspólnego z twoim pytaniem, ale jakiś czas temu miałem eksport, żeby wypromować problemy z RDLC i nazwami arkuszy, których nazwa została zmieniona przy użyciu biblioteki NPOI, od tego czasu zacząłem używać NPOI o wiele więcej jest to darmowy/open source i bardzo potężny (przeniesiony z Java POI do .net NPOI) ponownie, podczas gdy ja mówię, że to nie jest część tego, o co pytasz, nie byłbym zaskoczony, gdyby miał przykłady na to (nie, nie pracuję dla nich) http://npoi.codeplex.com/

Oto kod I napisał do zmiany nazwy arkuszy (który kończy się ponownego tworzenia arkuszy z innym 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

Wielkie dzięki. Przyjrzę się temu. Ale moje pytanie jest nadal otwarte =) Napisałem pełną funkcjonalność i jest to ostatni krok, który potrzebuję. – Bryuk

+0

Wiem, że szukam tego, czego potrzebujesz. Uznałem, że jeszcze nie odpowiedziałem na twoje pytanie, planowałem je teraz edytować ...: P –

3

jest to poprawny kod, który jest podany w MSDN.

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

For more information please click the link

0

W ogóle, jeśli chcesz utworzyć nowy arkusz po prostu zrobić:

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

wiedząc, że już stworzył skoroszyt jak poniżej:

var workbook = excel.Workbooks.Add(Type.Missing); 
Powiązane problemy