Как создать новый лист в файле Excel C#?
Мне нужно создать очень большой файл Excel, но файл Excel на одном листе может содержать до 65 тыс. Строк. Итак, я хочу разделить всю мою информацию на несколько динамических листов. Это мой примерный код
//------------------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++;
}
А как сохранить все рабочие листы в конце?
4 ответа
Чтобы добавить новый лист в книгу, используйте этот код:
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();
В общем, когда вы хотите создать новый лист, просто сделайте:
var worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add();
зная, что вы уже создали книгу, как показано ниже:
var workbook = excel.Workbooks.Add(Type.Missing);
Это правильный код, указанный в MSDN.
Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)Globals.ThisWorkbook.Worksheets.Add(
missing, missing, missing, missing);
Для получения дополнительной информации, пожалуйста, нажмите на ссылку
Вы ограничены 65 000 записей с.xls, но если вам "разрешено" выйти за пределы.xls / 2003 и в 2007 и выше с.xlsx, у вас должно быть намного больше строк.
Дополнительное замечание, ничего общего с вашим вопросом, но некоторое время назад у меня был экспорт в Excel для проблем с RDLC и именами листов, которые я переименовал с помощью библиотеки NPOI, с тех пор я начал использовать 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;
}
}