【问题标题】:How to create a new worksheet in Excel file c#?如何在 Excel 文件 c# 中创建新工作表?
【发布时间】:2013-05-23 04:24:44
【问题描述】:

我需要创建一个非常大的 Excel 文件,但一个工作表中的 Excel 文件最多可以包含 65k 行。所以,我想把我所有的信息分成几个动态的工作表。 这是我的大概代码

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

如何在我的 foreach 循环中添加新工作表并使用某些条件为工作表命名(用户可以在列表页面底部的 Excel 中看到该名称)?

有些是这样的

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

最后如何保存所有工作表?

【问题讨论】:

  • Excel 2010 支持 100 万行。你是哪个版本的?
  • 我尝试保存为 .xls
  • 但是即使我将保存在 2010 版本中,我的问题仍然是有道理的,因为它会是更易读的格式。
  • .xls - 2007 版本之前的格式,所以我的回答暗示我使用的版本低于 2010

标签: c# excel xls worksheet-function


【解决方案1】:

要向工作簿添加新工作表,请使用以下代码:

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

保存工作簿调用Save()方法:

xlWorkBook.Save();

【讨论】:

    【解决方案2】:

    这是 MSDN 中给出的正确代码。

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

    For more information please click the link

    【讨论】:

      【解决方案3】:

      一般来说,当您想创建新工作表时,只需这样做:

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

      知道您已经创建了如下所示的工作簿:

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

      【讨论】:

        【解决方案4】:

        .xls 限制为 65,000 条记录,但如果您被“允许”超越 .xls / 2003 并使用 .xlsx 进入 2007 年及更高版本,您应该有更多的行。

        旁注,与您的问题无关,但不久前,我使用 NPOI 库重命名了 RDLC 和工作表名称的导出到 excel 问题,从那时起我开始更多地使用 NPOI,它是免费/开源和非常强大(从 Java POI 移植到 .net NPOI),虽然我说这不是你问题的一部分,但如果它有这样做的例子,我不会感到惊讶(不,我不为他们工作) http://npoi.codeplex.com/

        这是我为重命名工作表而编写的代码(最终用另一个内存流重新创建工作表

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

        【讨论】:

        • 非常感谢。我会看看它。但我的问题仍然悬而未决=)我写了一个完整的功能,这是我需要的最后一步。
        • 我知道我正在寻找你需要的东西我想我还没有回答你的问题,我计划现在编辑它......:P
        猜你喜欢
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 2023-02-24
        • 1970-01-01
        相关资源
        最近更新 更多