NOPI操作Excel

//自定義顏色 ,將顏色轉換成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;
        }  














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章