1. 程式人生 > 其它 >使用NPOI匯出Excel使用日記

使用NPOI匯出Excel使用日記

技術標籤:C#excelvisual studio

這裡寫目錄標題

一,單元格格式

一,單元格格式

提前設定單元格格式;如果有表頭,列名等欄位需要用到不同的格式,可以新增多個style,一個IWorkbook最多可以有4000個cellStyle,所以相同格式可以設定成靜態變數,避免重複建立相同格式的cellStyle。本文只介紹關於HSSFWorkbook的匯出步驟,因為XSSFWorkbook好像沒有SetEnclosedBorderOfRegion方法,合併單元格的時候邊框設定有問題,不太好看。本人對NPOI瞭解太淺,有了解的夥伴兒還望告知有沒有類似的實現方法。

private void SetCellSty(IWorkbook workbook)
        {
            ICellStyle cellstyle = workbook.CreateCellStyle();
            //下邊框
            cellstyle.BorderBottom = BorderStyle.Thin;
            //上邊框
            cellstyle.BorderTop = BorderStyle.Thin;
            //左邊框
            cellstyle.BorderLeft =
BorderStyle.Thin; //右邊框 cellstyle.BorderRight = BorderStyle.Thin; cellstyle.Alignment = HorizontalAlignment.Center; cellstyle.VerticalAlignment = VerticalAlignment.Center; //設定字型 IFont font = workbook.CreateFont(); font.FontName =
"微軟雅黑";//字型 font.Color = 8;//顏色 //font.FontHeight = 15;//字型高度 font.FontHeightInPoints = 20;//字型高度 font.IsBold = true;//是否加粗 font.IsItalic = false;//是否斜體 font.IsStrikeout = false;//是否加刪除線 cellstyle.SetFont(font); //設定前景色 //cellstyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index; //cellstyle.FillPattern = FillPattern.SolidForeground; cellStyle_Title = cellstyle;; }

cell背景是使用前景色FillForegroundColor屬性;不要使用FillBackgroundColor,背景色會把單元格內的字型遮住;

二,建立IWorlBook

 private string SaveFilePath()
        {

            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.Title = "請選擇檔案存放路徑";
            saveFile.Filter = "Excel文件(*.xls)|*.xls";
            if (saveFile.ShowDialog() != DialogResult.OK)
            {
                return null;
            }
            return saveFile.FileName;
        }
  private void tButton1_Click(object sender, EventArgs e)
        {
            string path = SaveFilePath();
            if (".XLS".Equals(Path.GetExtension(path).ToUpper()))
            {
                IWorkbook workbook = new HSSFWorkbook();
                SetCellSty(workbook);
                workbook = CreateWorkBook(workbook);
                workbook = DataTableToWorkBook(workbook, true);
                ExportToExcel(workbook, path);
            }
            //else if (".XLSX".Equals(Path.GetExtension(path).ToUpper()))
            //{
            //    IWorkbook workbook = new XSSFWorkbook();
            //    InitializesCellStyle(workbook);
            //    workbook = CreateWorkBook(workbook);
            //    workbook = DataTableToWorkBook(workbook, false);
            //    ExportToExcel(workbook, path);
            //}
           
        }
     private IWorkbook CreateWorkBook(IWorkbook workbook)
        {
            ISheet sheet = workbook.CreateSheet("裝置保養表");

            sheet.DefaultColumnWidth = 3;
            sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 30));//裝置保養表
            sheet.AddMergedRegion(new CellRangeAddress(0, 1, 31, 32));//裝置          
            sheet.AddMergedRegion(new CellRangeAddress(0, 0, 33, 35));//裝置編號
            sheet.AddMergedRegion(new CellRangeAddress(1, 1, 33, 35));//裝置型別           
            sheet.AddMergedRegion(new CellRangeAddress(0, 0, 36, 47));//裝置編號text
            sheet.AddMergedRegion(new CellRangeAddress(1, 1, 36, 47));//裝置型別text            
            sheet.AddMergedRegion(new CellRangeAddress(3, 4, 42, 43));//記錄方法
            sheet.AddMergedRegion(new CellRangeAddress(3, 3, 44, 46));//Spec in
            sheet.AddMergedRegion(new CellRangeAddress(4, 4, 44, 46));//Spec out
                      

            ICell cell = sheet.CreateRow(0).CreateCell(0);
            cell.SetCellValue("裝置保養表 PM Sheet");
            cell.CellStyle = cellStyle_Title;

            ICell cell_eqType = sheet.CreateRow(1).CreateCell(33);
            cell_eqType.SetCellValue("裝置型別");
            cell_eqType.CellStyle = cellStyle_Body;
       

            ICell cell_Record = sheet.CreateRow(3).CreateCell(42);
            cell_Record.SetCellValue("記錄方法");
            cell_Record.CellStyle = cellStyle_Body;

            ICell cell_out = sheet.CreateRow(4).CreateCell(44);
            cell_out.SetCellValue("Spec Out");
            cell_out.CellStyle = cellStyle_Body;

            ICell cell_EQ = sheet.GetRow(0).CreateCell(31);
            cell_EQ.SetCellValue("裝置");
            cell_EQ.CellStyle = cellStyle_Body;

            ICell cell_EQName = sheet.GetRow(0).CreateCell(36);
            cell_EQName.SetCellValue(eqName);
            cell_EQName.CellStyle = cellStyle_Body;

            ICell cell_EQType = sheet.GetRow(1).CreateCell(36);
            cell_EQType.SetCellValue(eqType);
            cell_EQType.CellStyle = cellStyle_Body;

            ICell cell_eqName = sheet.GetRow(0).CreateCell(33);
            cell_eqName.SetCellValue("裝置編號");
            cell_eqName.CellStyle = cellStyle_Body;

            ICell cell_in = sheet.GetRow(3).CreateCell(44);
            cell_in.SetCellValue("Spec In");
            cell_in.CellStyle = cellStyle_Body;

            ICell cell_O = sheet.GetRow(3).CreateCell(47);
            cell_O.SetCellValue("O");
            cell_O.CellStyle = cellStyle_Body;

            ICell cell_X = sheet.GetRow(4).CreateCell(47);
            cell_X.SetCellValue("X");
            cell_X.CellStyle = cellStyle_Body;
            return workbook;
        }

titile大概就是這個樣子,合併的單元格現在沒有邊框的原因是少了一些設定,程式碼在下面。
在這裡插入圖片描述

三,新增行資料

 /// <param name="dataSource">資料來源表</param>
 /// <param name="workbook">工作簿</param>
  /// <param name="rowId">開始行號 </param>
 private int SetCell(System.Data.DataTable dataSource, IWorkbook workbook, int rowId)
 {	
 	
            IRow row = sheet.CreateRow(rowId);
            {


                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 1, 6));
                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 7, 10));
                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 11, 13));
                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 14, 16));

                row.CreateCell(0).SetCellValue(tableDaily.Columns[0].ColumnName.ToString());
                row.CreateCell(1).SetCellValue(tableDaily.Columns[1].ColumnName.ToString());
                row.CreateCell(7).SetCellValue(tableDaily.Columns[2].ColumnName.ToString());
                row.CreateCell(11).SetCellValue(tableDaily.Columns[3].ColumnName.ToString());
                row.CreateCell(14).SetCellValue(tableDaily.Columns[4].ColumnName.ToString());


            }
  			for (int j = 5; j < columnsCount; j++)
            {
                row.CreateCell(16 + j - 4).SetCellValue(tableDaily.Columns[j].ColumnName.ToString());
            }
           
            foreach (ICell cell in row.Cells)
            {
                cell.CellStyle = cellStyle_Header;
            }
            //row.RowStyle = cellStyle_Header;
            rowId ++ ;//向下一行

            for (int i = 0; i < rowCount; i++)
            {
                DataRow dataRow = tableDaily.Rows[i];
                IRow irow = sheet.CreateRow(rowId);

                //irow.RowStyle = cellStyle_Body;

                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 1, 6));
                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 7, 10));
                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 11, 13));
                sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 14, 16));


                //CellRangeAddress region1 = new CellRangeAddress(rowId, rowId, 1, 6);
                //CellRangeAddress region2 = new CellRangeAddress(rowId, rowId, 7, 10);
                //CellRangeAddress region3 = new CellRangeAddress(rowId, rowId, 11, 13);
                //CellRangeAddress region4 = new CellRangeAddress(rowId, rowId, 14, 16);


                //sheet.AddMergedRegion(region1);
                //sheet.AddMergedRegion(region2);
                //sheet.AddMergedRegion(region3);
                //sheet.AddMergedRegion(region4);

                irow.CreateCell(0).SetCellValue(dataRow[0].ToString());
                irow.CreateCell(1).SetCellValue(dataRow[1].ToString());
                irow.CreateCell(7).SetCellValue(dataRow[2].ToString());
                irow.CreateCell(11).SetCellValue(dataRow[3].ToString());
                irow.CreateCell(14).SetCellValue(dataRow[4].ToString());

               //下面這一坨就是設定合併單元格的邊框,因為每個都要設定一遍太麻煩,所以迴圈設定的程式碼在最後面
               
                //((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region1, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
                //((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region2, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
                //((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region3, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
                //((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region4, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);

                for (int j = 5; j < columnsCount; j++)
                {
                    irow.CreateCell(16 + j - 4).SetCellValue(dataRow[j].ToString());
                }
                foreach (ICell cell in irow.Cells)
                {
                    if ("X".Equals(cell.StringCellValue))
                    {
                        cell.CellStyle = cellStyle_XColor;
                    }
                    else
                    {
                        cell.CellStyle = cellStyle_Body;
                    }
                   

                }
                //irow.RowStyle = cellStyle_Body;
                rowId ++; 
            }

            return rowId ++;
        }

 }

生成的樣子應該是這樣的。紅色背景是設定的如果為X就把背景變為紅色
在這裡插入圖片描述

四,匯出

private void ExportToExcel(IWorkbook workbook, string filePath)
        {            
            try
            {
            //為每個合併單元格設定邊框
                List<CellRangeAddress> cellRanges = workbook.GetSheetAt(0).MergedRegions;
               
                foreach (CellRangeAddress region in cellRanges)
                {
                    ((HSSFSheet)workbook.GetSheetAt(0)).SetEnclosedBorderOfRegion(region, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
                }
                FileStream fs = null;
                try
                {
                    using (fs = new FileStream(filePath, FileMode.Append, FileAccess.Write))
                    {
                        workbook.Write(fs);
                    }
                    TAP.UI.TAPMsgBox.Instance.ShowMessage(this.Text, EnumMsgType.INFORMATION, "Export successfully.");
                }
                finally
                {
                    fs.Close();
                    workbook.Close();
                }
                           
            }
            catch
            {
                TAP.UI.TAPMsgBox.Instance.ShowMessage(this.Text, EnumMsgType.INFORMATION, "Execl is using.");
            }
        }