现在的位置: 首页 > 综合 > 正文

NOPI操作Excel

2018年05月04日 ⁄ 综合 ⁄ 共 9681字 ⁄ 字号 评论关闭
//自定义颜色 ,将颜色转换成NOPI的颜色
private static short GetXLColour(HSSFWorkbook workbook, System.Drawing.Color SystemColour)
        {
            short s = 0;
            HSSFPalette XlPalette = workbook.GetCustomPalette();
            HSSFColor XlColour = XlPalette.FindColor(SystemColour.R, SystemColour.G, SystemColour.B);
            if (XlColour == null)
            {
                if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 255)
                {
                    if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 64)
                    {
                        //NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE = 64;
                        //NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE = 65;
                        XlColour = XlPalette.AddColor(SystemColour.R, SystemColour.G, SystemColour.B);
                    }
                    else
                    {
                        //XlColour = XlPalette.FindSimilarColor(SystemColour.R, SystemColour.G, SystemColour.B);
                    }

                    s = XlColour.Indexed;
                }

            }
            else
                s = XlColour.Indexed;

            return s;
        }  

 /// <summary>
        /// 向Excel中插入图片,可设置图片大小,2.0的版本
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="workbook"></param>
        /// <param name="fileurl"></param>
        /// <param name="row"></param>
        /// <param name="col"></param>

        private static void AddPieChart(ISheet sheet, HSSFWorkbook workbook, HSSFPatriarch patriarch, string fileurl, int row, int col, int size)
        {
            try
            {
                byte[] bytes = Picture.ReadPictureBytes(size, fileurl);
                //POI只支持DIB,EMF,JPEG,PICT,PNG,WMF格式
                int pictureIdx = workbook.AddPicture(bytes, PictureType.JPEG);
                //dx2最大值1023,dy2最大值255,刚好填充一个Cell
                //HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)
                HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1020, 255, col, row + 1, col, row + 1);
                IPicture pict = patriarch.CreatePicture(anchor, pictureIdx);
                if (size != 0)
                    pict.Resize();////图片显示原始大小
            }
            catch (Exception ex)
            {
                LogInfo.Log(ex);
                throw ex;
            }
        }

------------------------------------------------------------------NOPI操作Excel-----------------------------------------------------------------------------

NPOI教程

相关DLL

using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;

        #region 读取Excel
        public static DataTable ImportExcel(string filePath)
        {
            try
            {
                //根据路径通过已存在的excel来创建HSSFWorkbook,即整个excel文档
                FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                HSSFWorkbook workbook = new HSSFWorkbook(file);
                //获取excel的第一个sheet
                HSSFSheet sheet = workbook.GetSheetAt(0);
                DataTable table = new DataTable();
                //获取sheet的首行
                HSSFRow headerRow = sheet.GetRow(0);
                if (headerRow == null)
                    headerRow = sheet.GetRow(1);
                //一行最后一个方格的编号 即总的列数
                int cellCount = headerRow.LastCellNum;
                for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                {
                    HSSFCell cell = headerRow.GetCell(i);
                    if (cell != null)
                    {
                        DataColumn column = new DataColumn(cell.StringCellValue);
                        table.Columns.Add(column);
                    }
                }
                //最后一列的标号  即总的行数
                //      int rowCount = sheet.LastRowNum;
                cellCount = table.Columns.Count;
               for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    HSSFRow row = sheet.GetRow(i);
                    if (row == null)
                        continue;
                    DataRow dataRow = table.NewRow();
                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        HSSFCell cell = row.GetCell(j);
                        if (cell == null)
                            continue;
                        //读取Excel格式,根据格式读取数据类型
                        switch (cell.CellType)
                        {
                            case HSSFCellType.BLANK: //空数据类型处理
                                dataRow[j] = "";
                                break;
                            case HSSFCellType.STRING: //字符串类型
                                dataRow[j] = cell.StringCellValue;
                                break;
                            case HSSFCellType.NUMERIC: //数字类型                                   
                                if (HSSFDateUtil.IsCellDateFormatted(cell))//是否是日期类型
                                {
                                    dataRow[j] = cell.DateCellValue;
                                }
                                else
                                {
                                        //Excel中内容为科学计数法解决方案
                                    DecimalFormat df = new DecimalFormat("0");
                                    System.Globalization.CultureInfo cf = new System.Globalization.CultureInfo("ZH-CN", true);                       
                                    dataRow[j] = df.Format(cell.NumericCellValue, cf);
                                }
                                break;
                            case HSSFCellType.FORMULA:
                                HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);
                                dataRow[j] = e.Evaluate(cell).StringValue;
                                break;
                            default:
                                dataRow[j] = "";
                                break;
                        }                    
                    }
                    table.Rows.Add(dataRow);
                }
                workbook = null;
                sheet = null;
                return table;
            }
            catch (Exception ex)
            {
                LogInfo.Log(ex);
                throw ex;
                return null;
            }
        }
        #endregion

----------------------------------------------------------------------------------用模板导出Excel--------------------------------------------------------------------------------

/// <summary>
        /// 用模板导出Excel
        /// </summary>
        /// <param name="table"></param>
        /// <param name="strFileName">导出路径</param>
        /// <param name="templetPath">模板路径</param>
        /// <param name="startRow">从第几行开始写数据,从1开始</param>
        public static void ExportExcelByTemple(System.Data.DataTable dtSource, string strFileName, string templetPath, int 

rowHeight, int startRow, int size)
        {
            try
            {
                HSSFWorkbook workbook = getWorkBook(templetPath);
                HSSFSheet sheet = getSheet(workbook);
                writeData(workbook, sheet, dtSource, strFileName, rowHeight, startRow, size);
                saveData(workbook, strFileName);
            }
            catch (Exception ex)
            {
                LogInfo.Log(ex);
                throw ex;
            }
        }											
       /// <summary>
        /// 解析Excel模板,返回WorkBook
        /// </summary>
        /// <param name="templetPath"></param>
        /// <returns></returns>
        private static HSSFWorkbook getWorkBook(string templetPath)
        {
            FileStream file = new FileStream(templetPath, FileMode.Open, FileAccess.Read);
            HSSFWorkbook workbook = new HSSFWorkbook(file);
            return workbook;
        }


        /// <summary>
        /// 返回Sheet
        /// </summary>
        /// <param name="workbook"></param>
        /// <returns></returns>
        private static HSSFSheet getSheet(HSSFWorkbook workbook)
        {
            return workbook.GetSheetAt(0);
        }


        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="strFileName"></param>
        private static void saveData(HSSFWorkbook workbook, string strFileName)
        {
            //保存     
            using (MemoryStream ms = new MemoryStream())
            {
                using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);
                }
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="sheet"></param>
        /// <param name="dtSource"></param>
        /// <param name="strFileName"></param>
        /// <param name="rowHeight"></param>
        /// <param name="startRow"></param>
        /// <param name="size"></param>
        private static void writeData(HSSFWorkbook workbook, HSSFSheet sheet, System.Data.DataTable dtSource, string 

strFileName, int rowHeight, int startRow, int size)
        {
            // //填充表头     
            HSSFRow dataRow = new HSSFRow();
            //不管你插入多少图片,都只要生成一个HSSFPatriarch 的对象,一定要放在循环外,只能声明一次,不然不

能循环插入图片
            HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
            //填充内容     
            for (int i = 0; i < dtSource.Rows.Count; i++)
            {
                dataRow = sheet.CreateRow(i + startRow - 1);
                dataRow.Height = (short)(rowHeight * 20);
                for (int j = 0; j < dtSource.Columns.Count; j++)
                {
                    if (dtSource.Columns[j].Caption.ToLower() == "picturePath")
                    {
                        string picurl = dtSource.Rows[i][j].ToString();
                        if (File.Exists(picurl))
                        {
                            AddPieChart(sheet, workbook, patriarch, picurl, i + startRow - 2, j, size);
                        }
                    }
                    else
                    {                        
                        string drValue = dtSource.Rows[i][j].ToString();
                        if (JXType.IsDecimal(drValue) && drValue.Length < 10)
                        {
                            double doubV = 0;
                            double.TryParse(drValue, out doubV);
                            dataRow.CreateCell(j).SetCellValue(doubV);
                        }
                        else
                        {
                            dataRow.CreateCell(j).SetCellValue(drValue);
                        }
                    }
                }
            }
        }

-----------------------------------------------------------------------------------不用模板导出Excel--------------------------------------------------------------------------------

        /// <summary>
        /// 不用模板导出Excel
        /// </summary>
        /// <param name="table"></param>
        /// <param name="strFileName"></param>
        public static void ExportExcel(System.Data.DataTable dtSource, string strFileName)
        {
            try
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                HSSFSheet sheet = workbook.CreateSheet();
                sheet.DefaultColumnWidth = 20;
                sheet.DefaultRowHeight = 20 * 20;
                // //填充表头     
                HSSFRow dataRow = sheet.CreateRow(0);
                dataRow.Height = 20 * 20;
                HSSFCellStyle headStyle = workbook.CreateCellStyle();
                SetCellStyle(headStyle, true);
                headStyle.Alignment = CellHorizontalAlignment.CENTER;
                HSSFFont font = workbook.CreateFont();
                font.FontHeightInPoints = 12;
                font.Boldweight = 50;
            //    font.Color = NPOI.HSSF.Util.HSSFColor.GREEN.index;
                headStyle.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.BLUE.index;
                headStyle.SetFont(font);
                int c = 0;
                foreach (DataColumn column in dtSource.Columns)
                {
                    sheet.AutoSizeColumn(c);//列宽自适应,不支持中文
                    dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                    dataRow.GetCell(column.Ordinal).CellStyle = headStyle;
                    c++;
                }
                //填充内容     
                for (int i = 0; i < dtSource.Rows.Count; i++)
                {
                    dataRow = sheet.CreateRow(i + 1);
                    dataRow.Height = 20 * 20;
                    for (int j = 0; j < dtSource.Columns.Count; j++)
                    {
                        dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString());
                    }
                }
                //保存     
                using (MemoryStream ms = new MemoryStream())
                {
                    using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
                    {
                        workbook.Write(fs);
                    }
                }
                workbook.Dispose();
            }
            catch (Exception ex)
            {
                LogInfo.Log(ex);
                throw ex;
            }
        }

                 /// <summary>
        /// 合并单元格
        /// </summary>
        /// <param name="sheet">要合并单元格所在的sheet</param>
        /// <param name="rowstart">开始行的索引</param>
        /// <param name="rowend">结束行的索引</param>
        /// <param name="colstart">开始列的索引</param>
        /// <param name="colend">结束列的索引</param>
        ///  <param name="isBorder">是否加边框</param>
        private static void SetCellRangeAddress(ISheet sheet, int rowstart, int rowend, int colstart, int colend, bool isBorder){CellRangeAddress region = new CellRangeAddress(rowstart, rowend, colstart, colend);
            sheet.AddMergedRegion(region);
            ((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region, BorderStyle.DOTTED, NPOI.HSSF.Util.HSSFColor.RED.index);}

//将自定颜色装换成NPOI的颜色
private static short GetXLColour(HSSFWorkbook workbook, System.Drawing.Color SystemColour)
        {
            short s = 0;
            HSSFPalette XlPalette = workbook.GetCustomPalette();
            HSSFColor XlColour = XlPalette.FindColor(SystemColour.R, SystemColour.G, SystemColour.B);
            if (XlColour == null)
            {
                if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 255)
                {
                    if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 64)
                    {
                        //NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE = 64;
                        //NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE = 65;
                        XlColour = XlPalette.AddColor(SystemColour.R, SystemColour.G, SystemColour.B);
                    }
                    else
                    {
                        //XlColour = XlPalette.FindSimilarColor(SystemColour.R, SystemColour.G, SystemColour.B);
                    }

                    s = XlColour.Indexed;
                }

            }
            else
                s = XlColour.Indexed;

            return s;
        }  

抱歉!评论已关闭.