コード例 #1
0
        public static ExcelModel ConvertDictionaryToExcelModel(IEnumerable <Dictionary <string, object> > data,
                                                               ExcelExporterOptions options)
        {
            var sheetTitle = options.SheetTitle;
            var excel      = new ExcelModel {
                Sheets = new List <SheetModel>()
            };
            var sheet = SheetModel.Create(sheetTitle);

            excel.Sheets.Add(sheet);
            var list  = data.ToList();
            var title = list.FirstOrDefault();

            if (title == null)
            {
                return(excel);
            }
            var columns = title.Keys.Select((c, i) => new ExcelColumn
            {
                Order = i,
                Title = c,
                Type  = typeof(string)
            }).ToList();

            sheet.Columns = AttachColumns(columns, options);
            sheet.Rows    = list;

            return(excel);
        }
コード例 #2
0
        public byte[] ObjectToExcelBytes(DataTable dt, ExcelType excelType, string sheetTitle = null)
        {
            var options = new ExcelExporterOptions
            {
                ExcelType  = excelType,
                SheetTitle = sheetTitle
            };
            var excel = TypeConvert.ConvertDataSetToExcelModel(dt, options);

            return(ObjectToExcelBytes(excel, options));
        }
コード例 #3
0
        public static ExcelModel ConvertObjectToExcelModel <TModel>(IEnumerable <TModel> data,
                                                                    ExcelExporterOptions options)
        {
            var sheetTitle = options.SheetTitle;
            var excel      = new ExcelModel {
                Sheets = new List <SheetModel>()
            };

            if (string.IsNullOrWhiteSpace(sheetTitle))
            {
                var classAttr = ExcelUtil.GetClassExportAttribute <TModel>();
                sheetTitle = classAttr.Item1 == null ? sheetTitle : classAttr.Item1.Title;
            }

            var sheet = SheetModel.Create(sheetTitle);

            excel.Sheets.Add(sheet);
            var attrDict     = ExcelUtil.GetPropertiesAttributesDict <TModel>();
            var objKeysArray = attrDict.OrderBy(c => c.Value.ExcelTitleAttribute.Order).ToArray();

            var columns = new List <ExcelColumn>();

            for (var i = 0; i < objKeysArray.Length; i++)
            {
                var titleAttr = objKeysArray[i].Value.ExcelTitleAttribute;
                var fontAttr  = objKeysArray[i].Value.ExcelColumnFontAttribute;
                var column    = new ExcelColumn
                {
                    Title = titleAttr.Title,
                    Type  = objKeysArray[i].Key.PropertyType,
                    Order = i,
                    Font  = fontAttr == null ? null : new Font(fontAttr.FontName, fontAttr.FontHeightInPoints, fontAttr.Color, fontAttr.IsBold),
                };

                columns.Add(column);
            }

            sheet.Columns = AttachColumns(columns, options);
            foreach (var item in data.Where(c => c != null))
            {
                var row = new Dictionary <string, object>();
                foreach (var column in objKeysArray)
                {
                    var prop = column.Key;
                    row[column.Value.ExcelTitleAttribute.Title] = prop.GetValue(item, null);
                }

                sheet.Rows.Add(row);
            }

            return(excel);
        }
コード例 #4
0
        private static List <ExcelColumn> AttachColumns(List <ExcelColumn> columns, ExcelExporterOptions options)
        {
            columns = columns.OrderBy(c => c.Order).ToList();
            if (options?.FormulaColumns != null)
            {
                foreach (var formulaColumn in options.FormulaColumns)
                {
                    var excelColumn = columns.FirstOrDefault(c => c.Title == formulaColumn.Title);
                    if (excelColumn == null)
                    {
                        excelColumn = new ExcelColumn
                        {
                            Title      = formulaColumn.Title,
                            Order      = 0,
                            Type       = typeof(Expression),
                            Formula    = formulaColumn.Formula,
                            ResultType = formulaColumn.FormulaResultType
                        };
                        if (string.IsNullOrWhiteSpace(formulaColumn.AfterColumnTitle))
                        {
                            columns.Add(excelColumn);
                        }
                        else
                        {
                            var i = columns.FindIndex(c => c.Title == formulaColumn.AfterColumnTitle);
                            if (i < 0)
                            {
                                throw new Excel2ObjectException($"can not find {formulaColumn.AfterColumnTitle} column.");
                            }

                            columns.Insert(i + 1, excelColumn);
                        }
                    }
                    else
                    {
                        excelColumn.Type       = typeof(Expression);
                        excelColumn.Formula    = formulaColumn.Formula;
                        excelColumn.ResultType = formulaColumn.FormulaResultType;
                    }
                }
            }

            for (var i = 0; i < columns.Count; i++)
            {
                columns[i].Order = i * 10;
            }
            return(columns);
        }
コード例 #5
0
        public byte[] ObjectToExcelBytes <TModel>(IEnumerable <TModel> data, Action <ExcelExporterOptions> optionsAction)
        {
            var options = new ExcelExporterOptions();

            optionsAction(options);
            ExcelModel excel;

            if (data is IEnumerable <Dictionary <string, object> > models)
            {
                excel = TypeConvert.ConvertDictionaryToExcelModel(models, options);
            }
            else
            {
                excel = TypeConvert.ConvertObjectToExcelModel(data, options);
            }

            return(ObjectToExcelBytes(excel, options));
        }
コード例 #6
0
        internal byte[] ObjectToExcelBytes(ExcelModel excel, ExcelExporterOptions options)
        {
            ExcelType excelType = options.ExcelType;
            var       workbook  = Workbook(excelType);

            CheckExcelModel(excel);
            foreach (var excelSheet in excel.Sheets)
            {
                var sheet = string.IsNullOrWhiteSpace(excelSheet.Title)
                    ? workbook.CreateSheet()
                    : workbook.CreateSheet(excelSheet.Title);
                sheet.ForceFormulaRecalculation = true;
                var columns = excelSheet.Columns.OrderBy(c => c.Order).ToArray();
                for (var i = 0; i < columns.Length; i++)
                {
                    sheet.SetColumnWidth(i, 16 * 256);
                    // todo 此处可统计字节数Min(50,Max(16,标题与内容最大长))
                }
                var headerRow = sheet.CreateRow(0);
                for (var i = 0; i < columns.Length; i++)
                {
                    var cell = headerRow.CreateCell(i);
                    cell.SetCellType(CellType.String);
                    cell.SetCellValue(columns[i].Title);
                }
                var columnTitles = columns.Select(c => c.Title).ToArray();
                var rowNumber    = 1;
                var data         = excelSheet.Rows;
                foreach (var item in data)
                {
                    var row = sheet.CreateRow(rowNumber++);
                    for (var i = 0; i < columns.Length; i++)
                    {
                        var column = columns[i];
                        var cell   = row.CreateCell(i);
                        var val    = item.ContainsKey(column.Title)?(item?[column.Title] ?? "").ToString() : "";
                        SetCellValue(excelType, column, cell, val, columnTitles);
                    }
                }
            }

            return(ToBytes(workbook));
        }
コード例 #7
0
        internal static ExcelModel ConvertDataSetToExcelModel(DataTable dt, ExcelExporterOptions options)
        {
            var sheetTitle = options.SheetTitle;
            var excel      = new ExcelModel {
                Sheets = new List <SheetModel>()
            };
            var sheet = SheetModel.Create(sheetTitle);

            excel.Sheets.Add(sheet);
            var dataSetColumnArray = dt.Columns.Cast <DataColumn>().ToArray();

            var columns = dataSetColumnArray.Select((item, i) =>
                                                    new ExcelColumn
            {
                Order = i,
                Title = item.ColumnName,
                Type  = item.DataType
            }).ToList();

            sheet.Columns = AttachColumns(columns, options);

            var data = dt.Rows.Cast <DataRow>().ToArray();

            foreach (var item in data.Where(c => c != null))
            {
                var row = new Dictionary <string, object>();
                foreach (var column in dataSetColumnArray)
                {
                    row[column.ColumnName] = item[column.ColumnName];
                }

                sheet.Rows.Add(row);
            }

            return(excel);
        }