Excel 내보내기 클래스의 구현 프로세스 (3): NPOI 구성 요소

17704 단어 Excel
NPOI 구성 요소는 강력하고 효율적입니다. Excel 쓰기 기능만 사용하고 더 많은 내용이 필요하면 직접 검색하십시오.
  • IWorkbook: 워크북 대상, NPOI.HSSF.UserModel.HSSFWorkbook을 실례화하면 Write(Stream stream)가 그 뜻대로 됩니다.
  • ISheet: 작업표 대상, IWorkbook 실례의Createsheet() 방법으로 만들 수 있음;
  • IRow: 줄 대상은 ISheet 실례의Create() 방법으로 만들 수 있습니다.
  • ICell: IRow 인스턴스의 Createcell () 방법으로 작성할 수 있는 셀 객체

  • 페이지 넘기기 문제를 먼저 처리합니다. 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 속성과 방법을 참고하여 스스로 완성할 수 있다.

    좋은 웹페이지 즐겨찾기