2023年3月14日 星期二

V80204C - XLS2XLS – 依讀取的 XLS 檔案,匯出相關XLS檔案

 目的:  V80204C – [確定匯入]- 依讀取 XLS 檔案,匯出相關XLS檔案

處理說明: 1>後端.[讀取檔案] -   Request.Files  
                                                     - foreach (string cur_FName in Request.Files)
                                                        Stream Tmp_in_Stream = Request.Files[cur_FName].InputStream;
                                                        wk.LoadFromStream(Tmp_in_Stream);
                  2>後端.[匯出檔案] 
                                    -  wk2.SaveToStream(Tmp_out_Stream, FileFormat.Version2010);
                                       HttpContext.Current.Response.BinaryWrite(Tmp_out_Stream.ToArray());

                  1>[匯出檔案]至前端 Browser, 必需使用 Cookie 顯示訊息,
                      --> 不可使用 response.Content
                      --> *.cs.匯出函式 傳回 voild , 非 HttpResponseMessage, 不可使用 successful/failure ,

                2>若同時[匯入檔案] &[匯出檔案], 不可使用 f_downloadFile(若只匯出檔案才可用之)
                          -->  因 f_downloadFile 會自行產生 Form & submit , 非使用者自定的畫面.submit(包含[檔案]欄位)



1>*.js  - V80204C.js
   {
            xtype: 'button', text: '確定匯入', id: 'OkBtn_Sub3',
            listeners: {
                click: function (me, e, eOpts) {                    
                    var Tmp_Str = "";
                    if (checkisnull(Ext.getCmp("sub3_FName").getValue())) {
                        Tmp_Str = "[檔案來源]欄位不可空白<br>"
                            + " 敬請檢核 !!";
                        mywarnalert(Tmp_Str);
                        return;
                    }              
                    Ok_process(me, e, eOpts);       
                } // end of click
            }  // end of listener
        },

//[確認匯入]鈕 , 處理
function Ok_process(me, e, eOpts) {
    console.log(" 1 inside Ok_process");
    console.log(" me: ", me);
    //取得 [檔案上傳].檔名
    var Tmp_FileObj = Ext.getCmp('sub3_FName');
    np["in_FName"] = Ext.getDom(Tmp_FileObj.inputId).value    
    console.log("Tmp_FileObj :", Tmp_FileObj);
    var Tmp_Str = "";
    var np = {};
    np["sub3_PROJID"] = Ext.getCmp("sub3_PROJID").getValue();
    np["out_FName"] = "V80204_件號報工統計.xlsx";
    np["headers"] = { 'Content-type': 'multipart/form-data' },

    me.up("form").submit({
        url: '../api/V80204CAPI/XLSIN2XLSOUT',
        method: 'POST',
        headers: { 'Content-type': 'multipart/form-data' },
        params: np,        
    });  // end of  me.up("form").submit({

    //隔兩秒才顯示完成訊息
    var timer = setInterval(function () {
        var cookie_token = Ext.util.Cookies.get("EX_DFile");
        if (cookie_token != null) {
            clearInterval(timer);
            timer = null;
            //mask.hide();            
            var rtn_msg=r_cookies('EX_DFile');
            mysuccessalert(rtn_msg);
            me.up("window").close();
            me.up("window").destroy();
        }
    }, 2000);  //等待 2000ms =1sec    
};  // end of Ok_process() {  //批次新增

     
2>*.cs   V80204C*.cs  XLSIN2XLSOUT
 // [件號報工統計] - [確定匯入] 鈕 , 匯入 件號XLS 檔案後,產出該[件號報工資料]
        [HttpPost]
        public void XLSIN2XLSOUT()
        {

            HttpContext c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //OracleConnection conn = new OracleConnection(DBService.ConnectionString(("AMMEU"));//
            OracleConnection conn = new OracleConnection(DBService.ConnectionString((DBLINK)));//
            OracleCommand cmd = new OracleCommand();
            OracleDataReader reader;
            DataSet ds = null;

            //取得匯入檔案名稱   of   filefield            
            string Tmp_in_FName = nvc["in_FName"];
            //取得匯出檔案名稱   of   filefield
            string Tmp_out_FName = nvc["out_FName"];
            string Tmp_sub3_PROJID = nvc["sub3_PROJID"];
            Workbook wk = null;
            Workbook wk2 = null;
            MemoryStream Tmp_out_Stream = new MemoryStream();

            HttpRequest Request = HttpContext.Current.Request;
            var response = this.Request.CreateResponse();
            //string file_Name = Tmp_in_FName;
            string FILEDT = DateTime.Now.ToString("yyyy/MM/dd");
            string Tmp_RtnMsg = "";
            string Tmp_RtnMsg1 = "";
            string Tmp_Sql = "", Tmp_Str = "";
            int Tmp_cnt = 0;
            //HttpCookie MyCookie = new HttpCookie("Rtn_Msg");
            HttpCookie MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            int row2 = 0;
            conn.Open();
            cmd.Connection = conn;
            try
            {
                foreach (string cur_FName in Request.Files)
                {
                    string fileType = Request.Files[cur_FName].ContentType;
                    Stream Tmp_in_Stream = Request.Files[cur_FName].InputStream;
                    Tmp_in_FName = Path.GetFileName(Request.Files[cur_FName].FileName);
                    int fileSize = Request.Files[cur_FName].ContentLength;
                    byte[] fileRcrd = new byte[fileSize];
                    //更新資料庫欄位值                                                
                    //匯入的 xls
                    wk = new Workbook();
                    wk.LoadFromStream(Tmp_in_Stream);
                    Worksheet sheet1 = wk.Worksheets[0];

                    //匯出的 xls
                    wk2 = new Workbook();
                    Worksheet sheet2 = wk2.Worksheets[0];//獲取第一個工作表
                    string[] outFieldArray = { "AMM單號", "工號", "版本", "件號", "件號名稱",
                                                           "製程", "製程資料內容", "WBS", "工單類型",  "數量", "單位",
                                                          "EOECN", "專案","機號","起始值(STARTVAL)", "情況處理碼",
                                                           "工單報工統計(小時)", "工作中心", "工作中心報工統計(小時)"
                                                                };
                    for (int i = 0; i < outFieldArray.Length; i++)
                    {
                        sheet2.Range[myfunc.GetExcelPos(i, 0)].Text = outFieldArray[i];
                    }

                    int RowsCount = sheet1.LastRow;
                    string Tmp_AMMNO, Tmp_SAPNO, Tmp_ED, Tmp_PN, Tmp_PNNAME;
                string Tmp_MKNO, Tmp_MKDESCPT, Tmp_WBS, Tmp_SROTP, Tmp_QTY, Tmp_UNIT;
              string Tmp_ECNO, Tmp_PROJID, Tmp_ACNO, Tmp_STARTVAL, Tmp_CNDPROCCODE;
                    string Tmp_ALS_HR_, Tmp_WC_, Tmp_WCHR_;

                    //STEP1 檢核  XLS 欄位名稱資料是否正確  -取得 標題 of  件號                                          
                    Tmp_PN = sheet1.Range[myfunc.GetExcelPos(0, 0)].Value;

                    //xls 欄位名稱有問題
                    if ((Tmp_PN != "件號"))
                    {
                        Tmp_RtnMsg = "匯入檔案欄位名稱必需如下:<br>";
                        //(Tmp_DTSOR != "資料來源") || (Tmp_OGONOAF != "拆檢提領編號") || (Tmp_NGONOAF != "維修提領編號") || (Tmp_RPNOAF != "拆檢交修單號") || (Tmp_MRPNOAF != "維修約交修單號") ||
                        if (Tmp_PN != "件號")
                            Tmp_RtnMsg = Tmp_RtnMsg + "第1欄欄位名稱:  [件號];";
                        //Tmp_RtnMsg = "匯入檔案欄位名稱必需如下:<br>"
                        //                         + "\件號"
                        //                         + " 敬請檢核";
                        //Tmp_Str = "{success: false,FName:" + myfunc.AA(FName) + ",Rtn_Msg:" + myfunc.AA(Tmp_RtnMsg) + "}";
                        //response.Content = new StringContent(Tmp_Str);    // 回應內容
                        //return response;
                        //以 Cookie 方式傳回訊息 , 因為要下載[匯出檔案],無傳回值 所以利用 Cookie 傳回訊息 -,f_downloadFile('EX_DFile', '../api/V80C03API/DB2XLS', np, 'POST', function () {
                        MyCookie.Value = HttpUtility.UrlEncode(Tmp_RtnMsg);
                        HttpContext.Current.Response.Cookies.Add(MyCookie);
                        HttpContext.Current.Response.End();
                    };
                    //STEP2 取得xls.[目前件號].報工資料                    
                    for (int i = 0; i < RowsCount; i++)
                    {
                        Tmp_PN = sheet1.Range[myfunc.GetExcelPos(0, i + 1)].Value;
                        if (myfunc.checkisnull(Tmp_PN))
                        { break; }
                        Tmp_Sql = "SELECT   AMMNO,SAPNO, "
                                                      + " ( SELECT  ED  "
                                                      + "   FROM  AMM_EDLST b "
                                     + "   WHERE  (AMMNO, ITM) in (   select AMMNO, max(to_number(ITM)) "
                                                                                          + " from AMM_EDLST group by AMMNO)  "
                                     + "  AND        a.AMMNO = b.AMMNO) ED,  "
                                    + "  PN,PNNAME,MKNO,MKDESCPT,WBS,SROTP,QTY,UNIT ,ECNO,PROJID,ACNO,STARTVAL,CNDPROCCODE  "
                                       + "   FROM    AMM_SRO a  "
                                       + "   WHERE  LENGTH(SAPNO)> 7  ";
                        if (!myfunc.checkisnull(Tmp_sub3_PROJID))
                            Tmp_Sql = Tmp_Sql + "    AND       PROJID = " + myfunc.AA(Tmp_sub3_PROJID);
                        Tmp_Sql = Tmp_Sql + "     AND       PN = " + myfunc.AA(Tmp_PN)
                                                         + "     ORDER   BY   ACNO,PN  ";
                        cmd.CommandText = Tmp_Sql;
                        reader = cmd.ExecuteReader();
                        while (reader.Read())
                        {
                            Tmp_AMMNO = reader["AMMNO"].ToString();
                            Tmp_SAPNO = reader["SAPNO"].ToString();
                            Tmp_ED = reader["ED"].ToString();
                            Tmp_PN = reader["PN"].ToString();
                            Tmp_PNNAME = reader["PNNAME"].ToString();
                            Tmp_MKNO = reader["MKNO"].ToString();
                            Tmp_MKDESCPT = reader["MKDESCPT"].ToString();
                            Tmp_WBS = reader["WBS"].ToString();
                            Tmp_SROTP = reader["SROTP"].ToString();
                            Tmp_QTY = reader["QTY"].ToString();
                            Tmp_UNIT = reader["UNIT"].ToString();
                            Tmp_ECNO = reader["ECNO"].ToString();
                            Tmp_PROJID = reader["PROJID"].ToString();
                            Tmp_ACNO = reader["ACNO"].ToString();
                            Tmp_STARTVAL = reader["STARTVAL"].ToString();
                            Tmp_CNDPROCCODE = reader["CNDPROCCODE"].ToString();
                            //取得[工單報工工時]
                            Tmp_Sql = " SELECT   round((sum(HOUR_WORK)+sum(HOUR_OT))/60,2)  HR  "
                                            + "  FROM  "
                                            + "    (  "
                            + " SELECT  JCN, ACT, WC, HOUR_WORK, work_ID, HOUR_OT from HOUR.ALS_HOUR_COMP @ALS_HOUR where JCN = '0000' || " + myfunc.AA(Tmp_SAPNO)
                                            + " union all  "
                                            + "  select JCN, ACT, WC, HOUR_WORK, work_ID, HOUR_OT from HOUR.ALS_HOUR_COMP_HISTORY @ALS_HOUR where JCN = '0000' || " + myfunc.AA(Tmp_SAPNO)
                                            + "   )  "
                                            + "   group by JCN ";
                            Tmp_ALS_HR_ = myfunc.SqlValue(Tmp_Sql);
              Tmp_Sql = "   SELECT  WC,round((sum(HOUR_WORK)+sum(HOUR_OT))/60,2)  WCHR  "
                                           + "   FROM  "
                                           + "  (  "
                                           + "   select JCN, ACT, WC, HOUR_WORK, work_ID, HOUR_OT from HOUR.ALS_HOUR_COMP @ALS_HOUR where JCN = '0000' || " + myfunc.AA(Tmp_SAPNO)
                                           + "   union all  "
                                           + "   select JCN, ACT, WC, HOUR_WORK, work_ID, HOUR_OT from HOUR.ALS_HOUR_COMP_HISTORY @ALS_HOUR where JCN = '0000' || " + myfunc.AA(Tmp_SAPNO)
                                           + "  )  "
                                           + "  group by JCN,WC  ";
                            Tmp_Str = myfunc.SqlValue(Tmp_Sql);
                            Tmp_WC_ = myfunc.StrExtract(Tmp_Str, 1);
                            Tmp_WCHR_ = myfunc.StrExtract(Tmp_Str, 2);
                            //匯出至  wk2.Sheet2
                            /*
                             { AMM單號, 工號, 版本, 件號, 件號名稱,
                                                                製程, 製程資料內容, WBS, 工單類型,  數量, 單位,
                                                                EOECN, 專案,機號,起始值(STARTVAL), 情況處理碼,
                                                                工單報工統計(小時), 工作中心, 工作中心報工統計(小時)
                                                               ];
                            */
                            //- 匯出  { AMM單號, 工號, 版本, 件號, 件號名稱,
                            row2 = row2 + 1;
                            sheet2.Range[myfunc.GetExcelPos(0, row2)].Text = Tmp_AMMNO;
                            sheet2.Range[myfunc.GetExcelPos(1, row2)].Text = Tmp_SAPNO;
                            sheet2.Range[myfunc.GetExcelPos(2, row2)].Text = Tmp_ED;
                            sheet2.Range[myfunc.GetExcelPos(3, row2)].Text = Tmp_PN;
                            sheet2.Range[myfunc.GetExcelPos(4, row2)].Text = Tmp_PNNAME;
                            //製程, 製程資料內容, WBS, 工單類型,  數量, 單位,
                            sheet2.Range[myfunc.GetExcelPos(5, row2)].Text = Tmp_MKNO;
                            sheet2.Range[myfunc.GetExcelPos(6, row2)].Text = Tmp_MKDESCPT;
                            sheet2.Range[myfunc.GetExcelPos(7, row2)].Text = Tmp_WBS;
                            sheet2.Range[myfunc.GetExcelPos(8, row2)].Text = Tmp_SROTP;
                            sheet2.Range[myfunc.GetExcelPos(9, row2)].Text = Tmp_QTY;
                            sheet2.Range[myfunc.GetExcelPos(10, row2)].Text = Tmp_UNIT;
                            //EOECN, 專案,機號,起始值(STARTVAL), 情況處理碼,
                            sheet2.Range[myfunc.GetExcelPos(11, row2)].Text = Tmp_ECNO;
                            sheet2.Range[myfunc.GetExcelPos(12, row2)].Text = Tmp_PROJID;
                            sheet2.Range[myfunc.GetExcelPos(13, row2)].Text = Tmp_ACNO;
                            sheet2.Range[myfunc.GetExcelPos(14, row2)].Text = Tmp_STARTVAL;
                            sheet2.Range[myfunc.GetExcelPos(15, row2)].Text = Tmp_CNDPROCCODE;
                            // 工單報工統計(小時), 工作中心, 工作中心報工統計(小時)
                            sheet2.Range[myfunc.GetExcelPos(16, row2)].Text = Tmp_ALS_HR_;
                            sheet2.Range[myfunc.GetExcelPos(17, row2)].Text = Tmp_WC_;
                            sheet2.Range[myfunc.GetExcelPos(18, row2)].Text = Tmp_WCHR_;
                        } // end of while reader.read()
                    }  // end of for (int i = 0; i < RowsCount; i++)
                    sheet2.AllocatedRange.AutoFitColumns();
                    wk2.SaveToStream(Tmp_out_Stream, FileFormat.Version2010);
                }  //end of foreach (string cur_FName in Request.Files)
            } // end fo try{             
            catch (Exception e)
            {
                //Console.WriteLine(e);
                Tmp_RtnMsg = "錯誤訊息如下:"
                                         + e.Message;
                MyCookie.Value = HttpUtility.UrlEncode(Tmp_RtnMsg);
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.Response.End();
                //throw;
            }
            finally
            {
                wk.Dispose();
                wk2.Dispose();
                conn.Close();
            }
            //return response;
            //Tmp_Cnt = 6;
            Tmp_Str = "已匯出完成!!  (" + row2.ToString() + "筆) <br>"
                            + "檔案名稱(" + Tmp_out_FName + ")";
            //MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            MyCookie.Value = HttpUtility.UrlEncode(Tmp_Str);
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(Tmp_out_FName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.BinaryWrite(Tmp_out_Stream.ToArray());
            HttpContext.Current.Response.End();
        }  //  end of  XLSIN2XLSOUT()







沒有留言:

張貼留言