使用NPOI或EPPlus来导出Excel文件实例,可在Excel文件加密

使用NPOI.dll组件来导出Excel文件,并设置样式,Nuget引用即可。

packages\NPOI.2.1.3.1\lib\net20\NPOI.dll
#region Excel
        protected Stream DataTable2Excel(DataView view, Dictionary<string, string> titles = null)
        {
            List<DataColumn> cols = new List<DataColumn>();
            if (titles != null)
            {
                foreach (var item in titles)
                {
                    if (view.Table.Columns.Contains(item.Key))
                    {
                        var col = view.Table.Columns[item.Key];
                        col.Caption = item.Value;
                        cols.Add(col);
                    }
                }
            }
            else
            {
                foreach (DataColumn item in view.Table.Columns)
                {
                    item.Caption = item.ColumnName;
                    cols.Add(item);
                }
            }

            HSSFWorkbook workbook = new HSSFWorkbook();



            MemoryStream ms = new MemoryStream();
            ISheet sheet = workbook.CreateSheet(SheetName);
            IRow headerRow = sheet.CreateRow(0);
            ICellStyle cellstyle = Getcellstyle(workbook, stylexls.头);
            ICellStyle intstyle = Getcellstyle(workbook, stylexls.数字);

            for (int i = 0; i < cols.Count; i++)
            {
                var column = cols[i];
                headerRow.CreateCell(i).SetCellValue(column.Caption);
                headerRow.Cells[i].CellStyle = cellstyle;
            }
            int rowIndex = 1;
            foreach (DataRowView row in view)
            {
                IRow dataRow = sheet.CreateRow(rowIndex);
                int columnindex = 0;
                foreach (DataColumn col in cols)
                {
                    switch (col.DataType.Name)
                    {
                        case "DateTime":
                            dataRow.CreateCell(columnindex).SetCellValue((Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd"));
                            break;
                        case "String":
                            dataRow.CreateCell(columnindex).SetCellValue(row[col.ColumnName].ToString());
                            break;
                        case "Int16":
                        case "Int64":
                        case "Decimal":
                        case "Int32":
                            ICell cell = dataRow.CreateCell(columnindex);
                            cell.SetCellValue(((int)row[col.ColumnName]).ToString("N0"));
                            cell.CellStyle = intstyle;
                            break;
                        default:
                            dataRow.CreateCell(columnindex).SetCellValue(row[col.ColumnName].ToString());
                            break;
                    }
                    columnindex++;
                }
                rowIndex++;
            }
            for (int i = 0; i < cols.Count; i++)
            {
                sheet.AutoSizeColumn(i);
            }
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;

            sheet = null;
            headerRow = null;
            workbook = null;

            return ms;
        }
        #region 定义单元格常用到样式
        #region 定义单元格常用到样式的枚举
        public enum stylexls
        {
            头,
            url,
            时间,
            数字,
            钱,
            百分比,
            中文大写,
            科学计数法,
            默认,
            千分位
        }
        #endregion
        protected static ICellStyle Getcellstyle(IWorkbook wb, stylexls str)
        {
            ICellStyle cellStyle = wb.CreateCellStyle();

            //定义几种字体  
            //也可以一种字体,写一些公共属性,然后在下面需要时加特殊的  
            IFont header = wb.CreateFont();
            header.FontHeightInPoints = 10;
            header.FontName = "微软雅黑";
            header.Boldweight = (short)FontBoldWeight.Bold;


            IFont font = wb.CreateFont();
            font.FontName = "微软雅黑";
            //font.Underline = 1;下划线  


            IFont fontcolorblue = wb.CreateFont();
            fontcolorblue.Color = HSSFColor.OliveGreen.Blue.Index;
            fontcolorblue.IsItalic = true;//下划线  
            fontcolorblue.FontName = "微软雅黑";


            //边框  
            //cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.DOTTED;
            //cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.HAIR;
            //cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.HAIR;
            //cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.DOTTED;
            //边框颜色  
            cellStyle.BottomBorderColor = HSSFColor.OliveGreen.Blue.Index;
            cellStyle.TopBorderColor = HSSFColor.OliveGreen.Blue.Index;

            //背景图形
            //cellStyle.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;  
            //cellStyle.FillForegroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;  
            cellStyle.FillForegroundColor = HSSFColor.White.Index;
            // cellStyle.FillPattern = FillPatternType.NO_FILL;  
            cellStyle.FillBackgroundColor = HSSFColor.Maroon.Index;

            //水平对齐  
            cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;

            //垂直对齐  
            cellStyle.VerticalAlignment = VerticalAlignment.Center;

            //自动换行  
            cellStyle.WrapText = true;

            //缩进;  
            cellStyle.Indention = 0;

            //下面列出了常用的字段类型  
            switch (str)
            {
                case stylexls.头:
                    cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                    cellStyle.SetFont(header);
                    break;
                case stylexls.时间:
                    IDataFormat datastyle = wb.CreateDataFormat();
                    cellStyle.DataFormat = datastyle.GetFormat("yyyy/mm/dd");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.数字:
                    cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Right;
                    //cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.钱:
                    IDataFormat format = wb.CreateDataFormat();
                    cellStyle.DataFormat = format.GetFormat("¥#,##0");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.千分位:
                    IDataFormat format2 = wb.CreateDataFormat();
                    cellStyle.DataFormat = format2.GetFormat("#,##0");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.url:
                    fontcolorblue.Underline = FontUnderlineType.Single;
                    cellStyle.SetFont(fontcolorblue);
                    break;
                case stylexls.百分比:
                    cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.中文大写:
                    IDataFormat format1 = wb.CreateDataFormat();
                    cellStyle.DataFormat = format1.GetFormat("[DbNum2][$-804]0");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.科学计数法:
                    cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
                    cellStyle.SetFont(font);
                    break;
                case stylexls.默认:
                    cellStyle.SetFont(font);
                    break;
            }
            return cellStyle;


        }
        #endregion
        #endregion



使用EPPlus.dll来导出Excel, Nuget引用即可。可在Excel文件加密

packages\EPPlus.3.1.3.3\lib\net35\EPPlus.dll
#region Excel Encrypt
        /// <summary>
        /// 转换成带有密码的Excel文件。2007格式
        /// </summary>
        /// <param name="view"></param>
        /// <param name="titles"></param>
        /// <param name="passWord"></param>
        /// <returns></returns>
        protected Stream DataTable2Excel(DataView view, string passWord, Dictionary<string, string> titles = null)
        {
            List<DataColumn> cols = new List<DataColumn>();
            if (titles != null)
            {
                foreach (var item in titles)
                {
                    if (view.Table.Columns.Contains(item.Key))
                    {
                        var col = view.Table.Columns[item.Key];
                        col.Caption = item.Value;
                        cols.Add(col);
                    }
                }
            }
            else
            {
                foreach (DataColumn item in view.Table.Columns)
                {
                    item.Caption = item.ColumnName;
                    cols.Add(item);
                }
            }
            MemoryStream stream = new MemoryStream();
            using (OfficeOpenXml.ExcelPackage package = new OfficeOpenXml.ExcelPackage())
            {
                var rowIndex = 1;
                OfficeOpenXml.ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(SheetName);
                //写标题行
                for (int i = 0; i < cols.Count; i++)
                {
                    var column = cols[i];
                    var cell = worksheet.Cells[rowIndex, i + 1];
                    cell.Style.Font.Bold = true;
                    cell.Style.Font.Name = "微软雅黑";
                    cell.Style.Font.Size = 10;
                    cell.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
                    cell.Value = column.Caption;
                }
                rowIndex++;
                foreach (DataRowView row in view)
                {
                    int columnindex = 1;
                    foreach (DataColumn col in cols)
                    {
                        var cell = worksheet.Cells[rowIndex, columnindex];
                        switch (col.DataType.Name)
                        {
                            case "DateTime":
                                cell.Value = Convert.ToDateTime(row[col.ColumnName]).ToString("yyyy-MM-dd");
                                cell.Style.Numberformat.Format = "yyyy-mm-dd";
                                break;
                            case "String":
                                cell.Value = row[col.ColumnName].ToString();
                                break;
                            case "Int16":
                            case "Int64":
                            case "Decimal":
                            case "Int32":
                                cell.Value = (int)row[col.ColumnName];
                                cell.Style.Numberformat.Format = "0_);[Red](0)";
                                cell.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Right;
                                break;
                            default:
                                cell.Value = row[col.ColumnName].ToString();
                                break;
                        }
                        worksheet.Column(columnindex).AutoFit();
                        columnindex++;
                    }
                    rowIndex++;
                }
                package.SaveAs(stream, passWord);
                stream.Flush();
                stream.Position = 0;
            }
            
            return stream;
        }
        #endregion

 

posted on 2019-12-12 16:37  itjeff  阅读(1381)  评论(0编辑  收藏  举报

导航