1. 程式人生 > >c#中使用npoi將datagridview中的全部資料匯出到excel中去

c#中使用npoi將datagridview中的全部資料匯出到excel中去

 #region
         /// <summary>
        /// NPOI DataGridView 匯出 EXCEL
        /// </summary>
        /// <param name="fileName"> 預設儲存檔名</param>
        /// <param name="dgv">DataGridView</param>
        /// <param name="fontname">字型名稱</param>
        /// <param name="fontsize">字型大小</param>
        public void ExportExcel(string fileName, DataGridView dgv, DataTable exportData, string fontname, short fontsize, string title)
        {
            //檢測是否有資料
            if (exportData.Rows.Count == 0) return;
            //建立主要物件
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet("Weight");
            //設定字型,大小,對齊方式
            HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
            HSSFFont font = (HSSFFont)workbook.CreateFont();
            font.FontName = fontname;
            font.FontHeightInPoints = fontsize;
            style.SetFont(font);
            style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER; //居中對齊


            HSSFRow dataRow =null;
            //新增表頭說明
            dataRow = (HSSFRow)sheet.CreateRow(0);
            dataRow.CreateCell(0).SetCellValue(title);
            sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtAllData.Columns.Count-1));
            
            //設定標題居中
            dataRow.GetCell(0).CellStyle = style;


            //新增表頭
            dataRow = (HSSFRow)sheet.CreateRow(1);
            
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                dataRow.CreateCell(i).SetCellValue(dgv.Columns[i].HeaderText);
                dataRow.GetCell(i).CellStyle = style;
            }
            //註釋的這行是設定篩選的
            //sheet.SetAutoFilter(new CellRangeAddress(0, dgv.Columns.Count, 0, dgv.Columns.Count));
            //新增列及內容
            for (int i = 0; i < exportData.Rows.Count; i++)
            {
                dataRow = (HSSFRow)sheet.CreateRow(i + 2);
                for (int j = 0; j < exportData.Columns.Count; j++)
                {
                    string ValueType = exportData.Rows[i][j].GetType().ToString();
                    string Value = exportData.Rows[i][j].ToString();
                    switch (ValueType)
                    {
                        case "System.String"://字串型別
                            dataRow.CreateCell(j).SetCellValue(Value);
                            break;
                        case "System.DateTime"://日期型別
                            System.DateTime dateV;
                            System.DateTime.TryParse(Value, out dateV);
                            dataRow.CreateCell(j).SetCellValue(dateV);
                            break;
                        case "System.Boolean"://布林型
                            bool boolV = false;
                            bool.TryParse(Value, out boolV);
                            dataRow.CreateCell(j).SetCellValue(boolV);
                            break;
                        case "System.Int16"://整型
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            int intV = 0;
                            int.TryParse(Value, out intV);
                            dataRow.CreateCell(j).SetCellValue(intV);
                            break;
                        case "System.Decimal"://浮點型
                        case "System.Double":
                            double doubV = 0;
                            double.TryParse(Value, out doubV);
                            dataRow.CreateCell(j).SetCellValue(doubV);
                            break;
                        case "System.DBNull"://空值處理
                            dataRow.CreateCell(j).SetCellValue("");
                            break;
                        default:
                            dataRow.CreateCell(j).SetCellValue("");
                            break;
                    }
                    dataRow.GetCell(j).CellStyle = style;
                    //設定寬度
                    sheet.SetColumnWidth(j, (Value.Length + 15) * 256);
                }
            }
            //儲存檔案
            string saveFileName = "";
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.DefaultExt = "xls";
            saveDialog.Filter = "Excel檔案|*.xls";
            saveDialog.FileName = fileName;
            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                saveFileName = saveDialog.FileName;
                if (!CheckFiles(saveFileName))
                {
                    MessageBox.Show("檔案被站用,請關閉檔案 " + saveFileName);
                    workbook = null;
                    return;
                }
                FileStream file = new FileStream(saveFileName, FileMode.Create);
                workbook.Write(file);
                file.Close();
                workbook = null;
                MessageBox.Show(saveFileName + " 儲存成功", "提示", MessageBoxButtons.OK);
            }
            else
            {
                workbook = null;
            }
        }
        #endregion


        #region 檢測檔案被佔用 
        [DllImport("kernel32.dll")]
        public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
        [DllImport("kernel32.dll")]
        public static extern bool CloseHandle(IntPtr hObject);
        public const int OF_READWRITE = 2;
        public const int OF_SHARE_DENY_NONE = 0x40;
        public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
        /// <summary>
        /// 檢測檔案被佔用 
        /// </summary>
        /// <param name="FileNames">要檢測的檔案路徑</param>
        /// <returns></returns>
        public bool CheckFiles(string FileNames)
        {
            if (!File.Exists(FileNames))
            {
                //檔案不存在
                return true;
            }
            IntPtr vHandle = _lopen(FileNames, OF_READWRITE | OF_SHARE_DENY_NONE);
            if (vHandle == HFILE_ERROR)
            {
                //檔案被佔用
                return false;
            }
            //檔案沒被佔用
            CloseHandle(vHandle);
            return true;
        }
        #endregion