2013-05-23 43 views
8

Tôi cần tạo tệp Excel rất lớn, nhưng tệp excel trong một trang tính có thể chứa tối đa 65 nghìn hàng. Vì vậy, tôi muốn chia tất cả thông tin của tôi thành nhiều trang tính động. Đây là mã gần đúng của tôiCách tạo trang tính mới trong tệp 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(); 

Làm thế nào tôi có thể thêm bảng mới bên trong của vòng lặp foreach của tôi và sử dụng một số điều kiện đặt tên cho bảng tính (mà người dùng có thể nhìn thấy trong Excel ở dưới cùng của trang này trong danh sách)?

Một số như thế

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

Và làm thế nào để lưu tất cả các bảng ở cuối?

+0

Excel 2010 hỗ trợ 1 triệu hàng. Bạn đang sử dụng phiên bản nào? –

+0

Tôi cố gắng lưu trong .xls – Bryuk

+0

Nhưng ngay cả khi tôi sẽ lưu trong phiên bản 2010 câu hỏi của tôi vẫn còn có ý nghĩa, bởi vì nó sẽ được định dạng dễ đọc hơn. – Bryuk

Trả lời

9

Để thêm một bảng mới để việc sử dụng bảng tính mã này:

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

Để lưu cuộc gọi workbook Save() phương pháp:

xlWorkBook.Save(); 
+0

OK. Có vẻ tốt =) Cảm ơn. Sẽ thử – Bryuk

1

Bạn bị giới hạn 65.000 bản ghi với .xls, nhưng nếu bạn "được phép" vượt quá .xls/2003 và vào năm 2007 trở lên với .xlsx, bạn sẽ có nhiều hàng hơn.

Lưu ý phụ, không liên quan gì đến câu hỏi của bạn, nhưng một lúc trở lại tôi đã xuất ra các vấn đề với RDLC và tên trang tôi đổi tên bằng thư viện NPOI, kể từ đó tôi bắt đầu sử dụng NPOI nhiều hơn và rất mạnh mẽ (chuyển từ Java POI sang .net NPOI) một lần nữa trong khi tôi nói nó không thực sự là một phần của câu hỏi của bạn là tôi sẽ không ngạc nhiên nếu nó có ví dụ về việc này (không tôi không làm việc cho họ) http://npoi.codeplex.com/

đây là mã tôi đã viết cho tờ đổi tên (mà kết thúc tái tạo các tấm với một 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

Cảm ơn rất nhiều. Tôi sẽ xem xét nó. Nhưng câu hỏi của tôi vẫn mở =) Tôi đã viết một chức năng đầy đủ và đó là bước cuối cùng mà tôi cần. – Bryuk

+0

Tôi biết tôi đang tìm kiếm những gì bạn cần Tôi đã chỉ ra rằng tôi chưa trả lời câu hỏi của bạn, tôi đã lên kế hoạch chỉnh sửa nó ngay bây giờ ...: P –

3

Đây là mã đúng được đưa ra trong MSDN.

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

For more information please click the link

0

Trong chung khi bạn muốn tạo sheet mới chỉ làm:

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

biết rằng bạn đã tạo ra bảng tính như dưới đây:

var workbook = excel.Workbooks.Add(Type.Missing); 
Các vấn đề liên quan