.netCore.NPOI 下载数据到excel 自定义颜色 单元格宽度自适应 工具类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.Drawing;

namespace SmartReleaseApi.Utils
{
    //下载到Excel的公共方法
    public class DownloadToExcelUtil
    {
        public static string DownloadToExcel(string[] headerNames,Dictionary<string,List<string>> values,string fileName)
        {
            HSSFWorkbook transWorkbook = new HSSFWorkbook();
            //自定义颜色
            HSSFPalette palette = transWorkbook.GetCustomPalette();
            //纬创蓝 先加入到色板中 RGB颜色值,第一个值:8~64之间,后面三个值为RGB色值
            palette.SetColorAtIndex((short)8, (byte)0, (byte)80, (byte)110);      
            Color color = Color.FromArgb(0, 80, 110);
            var myColor = palette.FindColor(color.R, color.G, color.B);

            //表头样式
            ICellStyle transStyle = transWorkbook.CreateCellStyle();
            transStyle.Alignment = HorizontalAlignment.CenterSelection;
            IFont headerfont = transWorkbook.CreateFont();
            headerfont.FontName = "微软雅黑";//字体
            headerfont.FontHeightInPoints = 12;//字体大小
            headerfont.IsBold = true;//是否加粗
            headerfont.Color = 9; //表头白色
            transStyle.SetFont(headerfont);
          
            transStyle.FillForegroundColor = myColor.Indexed;
             transStyle.FillPattern = FillPattern.SolidForeground;
            ISheet transSheet = transWorkbook.CreateSheet("sheet");
            IRow transRowHead = transSheet.CreateRow(0);
            //存储最大列宽
            Dictionary<int, int> maxWidth = new Dictionary<int, int>();
            for (int i = 0; i < headerNames.Length; i++) {
                ICell ccell = transRowHead.CreateCell(i);
                ccell.SetCellValue(headerNames[i]);
                ccell.CellStyle = transStyle;
                //表格宽度自适应
                getMaxWidth(maxWidth, ccell, i);

            }

            //表体样式
            ICellStyle bodyStyle = transWorkbook.CreateCellStyle();
            bodyStyle.Alignment = HorizontalAlignment.CenterSelection;
            IFont bodyFont = transWorkbook.CreateFont();
            bodyFont.FontName = "微软雅黑";//字体
            bodyFont.FontHeightInPoints = 10;
            bodyFont.IsBold = false;//是否加粗
            bodyStyle.SetFont(bodyFont);

            var trnsCount = 1;
            List<string> vkeys = values.Keys.ToList();
            foreach (var item in vkeys)
            {
                IRow trnsRow = transSheet.CreateRow(trnsCount);
                List<string> valueList = values[item];
                for (int k = 0; k < valueList.Count; k++) {
                    ICell createCell = trnsRow.CreateCell(k);
                    createCell.SetCellValue(valueList[k]);
                    //表格宽度自适应
                    getMaxWidth(maxWidth,createCell,k);
                    createCell.CellStyle = bodyStyle;
                }         
                trnsCount++;
            }
            if (null != values && values.Count > 0) {
                for (int i = 0; i < headerNames.Length; i++)
                {
                    transSheet.SetColumnWidth(i, maxWidth[i]);
                }
            }
            string filePath = Environment.CurrentDirectory + @"\wwwroot\UploadTemp\" + UUID.Getuuid() + ".xls";
            if (!string.IsNullOrEmpty(fileName)) {
                filePath = Environment.CurrentDirectory + @"\wwwroot\UploadTemp\" + fileName + ".xls";
            }
           
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            using (FileStream maurl = File.OpenWrite(filePath))
            {
                transWorkbook.Write(maurl);
                transWorkbook.Close();
            }
            return filePath;
        }

        private static void getMaxWidth(Dictionary<int, int> maxWidth,ICell cell,int key) {
            //表格宽度自适应
            int length = System.Text.Encoding.Default.GetBytes(cell.StringCellValue).Count() * 256 + 200;
            //这里把宽度最大限制到15000
            if (length > 15000)
            {
                length = 15000;
            }
            if (!maxWidth.ContainsKey(key))
            {
                maxWidth.Add(key, Math.Max(length, 0));
            }
            else
            {
                maxWidth[key] = Math.Max(length, maxWidth[key]);
            }
        }
    }
}

 

posted on 2021-02-18 17:26  tarrying  阅读(142)  评论(0编辑  收藏  举报