.Net Execl 导出(多个Sheet)

1 篇文章 0 订阅
1 篇文章 0 订阅
        /// <summary>
        /// 导出
        /// </summary>
        public ReportExcelData GetWorkORderExcel() {
            ReportExcelData data= new ReportExcelData();
            List<ExeclDataResource> execlDataResource = new List<ExeclDataResource>();
            execlDataResource.Add(CreateInstrumentFailureExcelDocument());
            IWorkbook workbook = ExcelUtilHelper.DataToHssfWorkbook(execlDataResource);
            string base64;
            using (MemoryStream stream = new MemoryStream())
            {
                workbook.Write(stream);
                base64 = Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);
            }
            data.Base64 = base64;//base64数据前端处理
            return data;
        }
        /// <summary>
        /// 仪器故障统计
        /// </summary>
        public ExeclDataResource CreateInstrumentFailureExcelDocument()
        {
            ExeclDataResource execlDataResources = new ExeclDataResource();
            
            Dictionary<string, string> title = new Dictionary<string, string>();
            title.Add("customerid", "客户");
            string sql = @"";
            execlDataResources.SheetDataResource = ExcelUtilHelper.ConvertDataTableToList(this.Broker.ExecuteDataTable(sql)).ToList();
            //throw new Exception(JsonHelper.Serialize(execlDataResources.SheetDataResource.Take(10).ToList()));
            execlDataResources.SheetName = "SheetName";
            execlDataResources.TitleIndex = 1;
            execlDataResources.dicColumns = title;
            return execlDataResources;
        }

工具类ExcelUtilHelper


    public static class ExcelUtilHelper
    {
        /// <summary>
        /// 多个Sheet 导出
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="execlDatas"></param>
        /// <returns></returns>
        public static IWorkbook DataToHssfWorkbook(List<ExeclDataResource> execlDatas)
        {
            HSSFWorkbook _workbook = new HSSFWorkbook();
            if (execlDatas == null && execlDatas.Count == 0)
            {
                return _workbook;
            }
            // 标题及内容单元格样式
            var headCellStyle = CreateCellStyle(_workbook, true);
            var contentCellStyle = CreateCellStyle(_workbook, false);
            //每循环一次。就生成一个Sheet
            foreach (var sheetResource in execlDatas)
            {
                if (sheetResource.SheetDataResource == null || sheetResource.SheetDataResource.Count == 0)
                {
                    break;
                }
                //判断有多少数据如果超出 60000条 就新开一个sheet
                var data = SplitList<object>(sheetResource.SheetDataResource,60000);

                int p = 0;
                foreach (var item in data) {
                    ISheet sheet = _workbook.CreateSheet(sheetResource.SheetName + (p == 0?"":p));
                    var dic = new Dictionary<int, int>();
                    //确定表头在哪一行生成
                    int titleIndex = 0;
                    if (sheetResource.TitleIndex >= 0)
                    {
                        titleIndex = sheetResource.TitleIndex - 1;
                    }
                    //基于当前创建Sheet页表头
                    IRow titleRow = sheet.CreateRow(titleIndex);
                    //表头创建
                    Dictionary<string, int> columns = new Dictionary<string, int>();
                    for (int i = 0; i < sheetResource.dicColumns.Count(); i++)
                    {
                        ICell cell = titleRow.CreateCell(i);
                        cell.SetCellValue(sheetResource.dicColumns.ToList()[i].Value.ToString());
                        cell.CellStyle = headCellStyle;
                        dic.Add(i, Encoding.Default.GetBytes(cell.StringCellValue).Length * 260 + 600);
                        columns.Add(sheetResource.dicColumns.ToList()[i].Value, i);
                    }

                    int x = 0;
                    foreach (var item3 in item)
                    {
                        IRow row = sheet.CreateRow(x + titleIndex + 1);
                        // 行高,避免自动换行的内容将行高撑开
                        row.HeightInPoints = 20f;
                        var entityValues = JsonHelper.Deserialize<Dictionary<string, object>>(JsonHelper.Serialize(item3));
                        foreach (var item2 in sheetResource.dicColumns)
                        {
                           
                            if (entityValues == null)
                            {
                                throw new Exception(JsonHelper.Serialize(item3)+":::"+item2.Key +":"+ x);
                            }
                            int index = columns[item2.Value];
                            ICell cell = row.CreateCell(index);
                            cell.SetCellValue(entityValues?.GetValueOrDefault(item2.Key)?.ToString());

                            cell.CellStyle = contentCellStyle;
                            int length = Encoding.Default.GetBytes(cell.StringCellValue).Length * 256 + 600;
                            length = length > 15000 ? 15000 : length;
                            
                        }
                        x++;
                    }
                    for (int i = 0; i < sheetResource.dicColumns.Count; i++)
                    {
                        sheet.SetColumnWidth(i, dic[i]);
                    }
                    p++;

                }

                //创建一个页签
               
            }
            return _workbook;
        }

        public static IEnumerable<List<T>> SplitList<T>(List<T> list, int chunkSize)
        {
            for (int i = 0; i < list.Count; i += chunkSize)
            {
                yield return list.Skip(i).Take(chunkSize).ToList();
            }
        }


        public static IList<object> ConvertDataTableToList(DataTable table)
        {
            if (table == null)
            {
                return null;
            }

            List<DataRow> rows = new List<DataRow>();

            foreach (DataRow row in table.Rows)
            {
                rows.Add(row);
            }

            return ConvertTo(rows);
        }

        public static IList<object> ConvertTo(IList<DataRow> rows)
        {
            IList<object> list = null;

            if (rows != null)
            {
                list = new List<object>();

                foreach (DataRow row in rows)
                {
                    object item = CreateItem(row);
                    list.Add(item);
                }
            }

            return list;
        }

        public static object CreateItem(DataRow row)
        {
            Dictionary<string, object> dict = new Dictionary<string, object>();
            if (row != null)
            {

                foreach (DataColumn column in row.Table.Columns)
                {
                    dict[column.ColumnName] = row[column.ColumnName];
                }
            }

            return dict as object;
        }
        /// <summary>
        /// 单元格样式
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="isHead"></param>
        /// <returns></returns>
        private static ICellStyle CreateCellStyle(IWorkbook workbook, bool isHead)
        {
            var cellStyle = workbook.CreateCellStyle();

            var font = workbook.CreateFont();
            font.IsBold = isHead; // 粗体  
            cellStyle.SetFont(font);
            if (isHead)
            {
                cellStyle.Alignment = HorizontalAlignment.Center; // 水平居中  
                cellStyle.VerticalAlignment = VerticalAlignment.Center; // 垂直居中  
            }
            cellStyle.BorderTop = BorderStyle.Thin;
            cellStyle.BorderBottom = BorderStyle.Thin;
            cellStyle.BorderLeft = BorderStyle.Thin;
            cellStyle.BorderRight = BorderStyle.Thin;
            cellStyle.WrapText = true;//内容自动换行,避免存在换行符的内容合并成单行

            return cellStyle;
        }
    }

ExeclDataResource

public class ExeclDataResource
    {
        /// <summary>
        /// 保存到Sheet页的名称
        /// </summary>
        public string SheetName { get; set; }
        /// <summary>
        /// 标题所在行
        /// </summary>
        public int TitleIndex { get; set; }
        /// <summary>
        /// 每个Sheet的数据
        /// </summary>
        public List<object> SheetDataResource { get; set; }
        /// <summary>
        /// 每个Sheet的列
        /// </summary>
        public Dictionary<string, string> dicColumns { get; set; }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值