幫公司人事MM做了個工資條拆分工具


引言

      偶爾一次午飯時人事說加班加到8點多,純手工復制粘貼Excel的內容,公司大概150多人吧,每次發工資時都需要這樣手動處理,將一個Excel拆分成150多個Excel,再把里面的內容粘過去,如此循環。於是,我寫了個小程序幫人事MM解決。

 

解決方法

     主要是用到了NPOI生成Excel,根據每條記錄創建一個Excel,並讀取員工姓名作為文件名,並設置Excel為只讀。

 

界面預覽

    

      導入和拆分在狀態欄都會有相應提示

 

代碼

 /// <summary>
        /// 讀取excel
        /// </summary>
        /// <param name="filepath"></param>
        /// <returns></returns>
        public DataSet ToDataTable(string filePath,string fileName)
        {
            string connStr = "";

            string fileType = System.IO.Path.GetExtension(fileName);

            if (string.IsNullOrEmpty(fileType)) return null;

            if (fileType == ".xls")
            {
                connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
            }
            else
            {
                connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
            }
            string sql_F = "Select * FROM [{0}]";

            OleDbConnection conn = null;

            OleDbDataAdapter da = null;

            DataTable dtSheetName = null;

            DataSet ds = new DataSet();

            try
            {

                // 初始化連接,並打開

                conn = new OleDbConnection(connStr);

                conn.Open();

                // 獲取數據源的表定義元數據                        

                string SheetName = "";

                dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

                // 初始化適配器

                da = new OleDbDataAdapter();

                for (int i = 0; i < dtSheetName.Rows.Count; i++)
                {

                    SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];

                    if (SheetName.Contains("$") && !SheetName.Replace("'", "").EndsWith("$"))
                    {
                        continue;
                    }


                    da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName), conn);

                    DataSet dsItem = new DataSet();

                    da.Fill(dsItem, "MyTable");
                    ds.Tables.Add(dsItem.Tables[0].Copy());

                }

            }

            catch (Exception ex)
            {

            }
            finally
            {
                // 關閉連接
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                    da.Dispose();
                    conn.Dispose();
                }

            }

            return ds;
        }


        public void ExcelSplit(DataTable excelTable)
        {
            //創建工作表
            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet("Sheet1");
            sheet.ProtectSheet("123"); //加密Excel,從而實現只讀
            //創建表頭
            IRow headerrow = sheet.CreateRow(0);
            for (int i = 0; i < excelTable.Columns.Count; i++)
            {
                headerrow.CreateCell(i).SetCellValue(excelTable.Columns[i].ColumnName);
            }

            int index = 0; //拆分個數
            //創建內容
            IRow datarow = sheet.CreateRow(1);
            FileStream stream = null;
            if (!Directory.Exists(@"d:/MyXls"))
            {
                Directory.CreateDirectory(@"d:/MyXls");    
            }

            for (int i = 0; i < excelTable.Rows.Count; i++)
            {
                for (int j = 0; j < excelTable.Columns.Count; j++)
                {
                    ICell cell = datarow.CreateCell(j);
                    cell.SetCellValue(excelTable.Rows[i][j].ToString());
                }
                string excelname = excelTable.Rows[i]["姓名"].ToString()+"_"+DateTime.Now.ToString("yyyy-MM")+ ".xls";
                stream = new FileStream(@"d:/MyXls/" + excelname, FileMode.Create);
                workbook.Write(stream);
               
                index++;
            }
            stream.Close();
            
            this.toolStripStatusLabel1.Text = "共拆分工資條:" + index + "條";
            this.Cursor = Cursors.Default;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM