Excel 내보내기 클래스의 구현 프로세스 (3): NPOI 구성 요소
17704 단어 Excel
페이지 넘기기 문제를 먼저 처리합니다. Excel 10은 최대 1048576줄, Excel 03은 최대 65536줄을 지원합니다.시트 헤더를 제외한 03 Excel만 처리하는 페이지 넘기기 알고리즘은 다음과 같습니다.
IWorkbook workbook = new HSSFWorkbook();
ISheet sheet = null;
const Int32 RowPerSheet = 65535;
for (Int32 r = 0; r < records.Count; r++)
{
if ((r % RowPerSheet) == 0)
{
Int32 sheetIndex = (Int32)((Double)r / RowPerSheet) + 1;
sheet = workbook.CreateSheet("Sheet" + sheetIndex);
for (Int32 i = 0; i < headers.Count; i++)
{
Console.Write(headers[i].PrintName);
Console.Write("\t");
}
Console.WriteLine();
}
// CreateRow(Int32 rownum) rownum 0 , ,
IRow row = sheet.CreateRow(r % RowPerSheet + 1);
for (Int32 i = 0; i < props.Length; i++)
{
// row ...
}
}
NPOI를 참조하십시오.SS.UserModel 및 NPOI.HSSF.UserModel 네임스페이스, 이제 Row가 생겼으니, 칸을 만들어서 쓰기가 쉬워집니다.
65536 줄의 작업표를 내보내는 것을 감안하여 보는 사람이 미치도록 내보내기 방법을 ExcelHelper 클래스에 봉인하고 줄 속성과 내보내기 방법을 제공하며 헤더 클래스를 내부 클래스로 설정합니다(이것은 필수적이지 않지만 이름을 바꾸면 틀림없을 수 있습니다).
public class ExcelHelper
{
public class Header
{
public String Name { get; private set; }
public String PrintName { get; private set; }
public Header(String name)
: this(name, name)
{
}
public Header(String name, String printName)
{
Name = name;
PrintName = printName;
}
}
private const Int32 MaxRowPerSheet = 65535;
private Int32 rowPerSheet = 1000;
public Int32 RowPerSheet
{
get { return rowPerSheet; }
set
{
if (value < 0 || value > MaxRowPerSheet)
{
throw new ArgumentOutOfRangeException("RowPerSheet");
}
else
{
rowPerSheet = value;
}
}
}
public IWorkbook Export<T>(IList<T> records)
{
if (records == null)
throw new ArgumentNullException("records");
String[] headers = typeof(T).GetProperties().Select(p => p.Name).ToArray();
return Export<T>(records, headers);
}
public IWorkbook Export<T>(IList<T> records, IList<String> headers)
{
if (records == null)
throw new ArgumentNullException("records");
if (headers == null || headers.Count == 0)
throw new ArgumentNullException("headers");
Header[] newHeaders = typeof(T).GetProperties().Select(p => new Header(p.Name)).ToArray();
return Export<T>(records, newHeaders);
}
public IWorkbook Export<T>(IList<T> records, IList<Header> headers)
{
if (records == null)
throw new ArgumentNullException("records");
if (headers == null || headers.Count == 0)
throw new ArgumentNullException("headers");
PropertyInfo[] props = new PropertyInfo[headers.Count];
for (int i = 0; i < headers.Count; i++)
{
props[i] = typeof(T).GetProperty(headers[i].Name); // null
}
IWorkbook workbook = new HSSFWorkbook();
ISheet sheet = null;
IRow row = null;
for (int r = 0; r < records.Count; r++)
{
if ((r % RowPerSheet) == 0)
{
Int32 sheetIndex = (Int32)((Double)r / RowPerSheet) + 1;
sheet = workbook.CreateSheet("Sheet" + sheetIndex);
row = sheet.CreateRow(0);
for (int i = 0; i < headers.Count; i++)
{
row.CreateCell(i).SetCellValue(headers[i].PrintName);
}
Console.WriteLine();
}
// CreateRow(Int32 rownum) rownum 0 , ,
row = sheet.CreateRow(r % RowPerSheet + 1);
for (int i = 0; i < props.Length; i++)
{
if (props[i] != null) // null
{
Object value = props[i].GetValue(records[r], null);
if (value != null)
{
row.CreateCell(i).SetCellValue(value.ToString());
}
}
}
}
for (Int32 i = 0; i < workbook.NumberOfSheets; i++)
{
sheet = workbook.GetSheetAt(i);
for (Int32 h = 0; h < headers.Count; h++)
{
sheet.AutoSizeColumn(h); //
}
}
return workbook;
}
}
클라이언트 호출은 다음과 같습니다.
static void Main(string[] args)
{
List<Person> persons = new List<Person>();
//persons.Add(new Person { ID = 1, Name = "Rattz", Birth = new DateTime(1980, 10, 1), Salary = 20.2D });
//persons.Add(new Person { ID = 2, Name = "Mike", Birth = new DateTime(1988, 2, 15), Salary = 20.2D });
Int32 records = 201;
for (Int32 i = 0; i < records; i++)
{
persons.Add(new Person { ID = i, Name = "name" + i, Birth = new DateTime(1980, 10, 1), Salary = 20.2D });
}
List<ExcelHelper.Header> headers = new List<ExcelHelper.Header>();
headers.Add(new ExcelHelper.Header("ID"));
headers.Add(new ExcelHelper.Header("Name", " "));
headers.Add(new ExcelHelper.Header("Birth", " "));
headers.Add(new ExcelHelper.Header("Salary", " "));
ExcelHelper excelHelper = new ExcelHelper();
excelHelper.RowPerSheet = 100;
IWorkbook workbook = excelHelper.Export<Person>(persons, headers);
String path = @"d:\1.xls";
using (FileStream stream = File.Open(path, FileMode.OpenOrCreate))
{
workbook.Write(stream);
}
}
이 기능은 완성되었지만 세부 사항은 보완되어야 한다.'생일'열의 모든 값은 1980-10-01 00:00:00이고 이것은 단원격 값 설정 문장row이다.CreateCell(i).SetcellValue(value.ToString())가 너무 간단하기 때문에 후속편이 계속되면 독자도 NPOI 구성 요소의 ICell 속성과 방법을 참고하여 스스로 완성할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Excel Grep toolExcel Grep tool ■히나가타 ■ 시트 구성 ExcelGrep.cls...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.