Esempio n. 1
0
        /// <summary>
        /// 创建Sheet
        /// </summary>
        /// <param name="fileId">文件标识</param>
        /// <param name="sheetName">Sheet名称</param>
        /// <param name="headers">表头行字段信息,key:表头列名称   value:列对应的Converter</param>
        //[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
        public static ISheet CreteSheet(string fileId, string sheetName, List <ExcelKitAttribute> headers)
        {
            Inspector.Validation(!_workbooks.ContainsKey(fileId), "导出文件标识不存在");
            Inspector.Validation(headers == null, "Sheet表头信息不能为空");

            try
            {
                _semaphores[SemaphoreKeyConst.CreateSheet].Wait();

                headers = headers.OrderBy(t => t.Sort).ToList();

                //1.首次出现的Sheet记录下来(后面自动拆分Sheet要引用最初Sheet的信息)
                if (!_workbooks[fileId].SheetInfo.Exists(t => t.OriginSheetName == sheetName) && !sheetName.Contains(INNER_SHEET_CHAR))
                {
                    _workbooks[fileId].SheetInfo.Add(new InnerSheetInfo()
                    {
                        SheetIndex      = 0,
                        PropAttr        = headers,
                        OriginSheetName = sheetName,
                    });
                }
                else
                {
                    sheetName = sheetName.Replace(INNER_SHEET_CHAR, "");
                }

                sheetName = SafeSheetName(sheetName);
                Inspector.NotNullOrWhiteSpace(sheetName, "Sheet名称为空或无效");

                //2.创建Workbook
                _workbooks[fileId].Workbook = _workbooks[fileId].Workbook ?? new NPOI.XSSF.Streaming.SXSSFWorkbook();

                //3.获取或创建Sheet
                var sheet = GetSheet(fileId, sheetName);
                if (sheet == null)
                {
                    var cellCount = 0;
                    sheet = _workbooks[fileId].Workbook.CreateSheet(sheetName);

                    var headerRow = sheet.CreateRow(0);
                    foreach (var head in headers)
                    {
                        //忽略的字段
                        if (head.IsIgnore)
                        {
                            continue;
                        }
                        //列宽设置
                        if (head.Width > 0)
                        {
                            sheet.SetColumnWidth(cellCount, head.Width * 256);
                        }
                        //首行冻结
                        if (head.HeadRowFrozen)
                        {
                            sheet.CreateFreezePane(headers.Count, 1);
                        }
                        //首行筛选
                        if (head.HeadRowFilter)
                        {
                            sheet.SetAutoFilter(new CellRangeAddress(0, 0, 0, headers.Count - 1));
                        }
                        //单元格样式
                        var cell = headerRow.CreateCell(cellCount++);
                        {
                            ICellStyle cellStyle = _workbooks[fileId].Workbook.CreateCellStyle();
                            cellStyle.Alignment = TextAlignMapping.MapAlign(head.Align);

                            //前景色
                            if (head.ForegroundColor != Constraint.Enums.DefineColor.None)
                            {
                                cellStyle.FillPattern         = FillPattern.SolidForeground;
                                cellStyle.FillForegroundColor = ColorMapping.GetColorIndex(head.ForegroundColor);
                            }

                            //字体颜色
                            var font = _workbooks[fileId].Workbook.CreateFont();
                            font.FontHeightInPoints = 12;
                            font.FontName           = "Calibri";
                            font.Color = ColorMapping.GetColorIndex(head.FontColor);
                            cellStyle.SetFont(font);

                            //记录单元格样式
                            if (_workbooks[fileId].SheetInfo.Exists(t => t.OriginSheetName == sheetName) && !sheetName.Contains(INNER_SHEET_CHAR))
                            {
                                _workbooks[fileId].SheetInfo.FirstOrDefault(t => t.OriginSheetName == sheetName).CellStyles.Add(head.Code, cellStyle);
                            }

                            cell.CellStyle = cellStyle;                            //为单元格设置显示样式
                        }
                        cell.SetCellValue(head.Desc);
                    }
                    _workbooks[fileId].SheetCount = _workbooks[fileId].Workbook.NumberOfSheets;
                }
                return(sheet);
            }
            finally
            {
                _semaphores[SemaphoreKeyConst.CreateSheet].Release();
            }
        }