.net導入,導出,操作EXCEL彙總

    最近項目中做了基本所有對EXCEL的操作,做個筆記,方便以後使用。

   一:先來個導入EXCEL的

  

/// <summary>
        /// Excel轉Sql方法
        /// </summary>
        /// <param name="filePath">文件路徑</param>
        /// <param name="sheetName">單元簿名稱</param>
        /// <returns></returns>
        public static DataTable ExcelDataTable(string filePath, string sheetName)
        {
            DataTable dt = null;
            //HDR=Yes:第一行是列名        
            //IMEX=1:把數據作爲text 類型       
            string conStr = string.Format("Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';", filePath);
            string strSql = string.Format("select * from [{0}$]", sheetName);
            OleDbConnection con = new OleDbConnection(conStr);
            OleDbDataAdapter oda = new OleDbDataAdapter(strSql, conStr);
            try
            {
                dt = new DataTable();
                oda.Fill(dt);
                return dt;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                oda.Dispose();
                con.Close();
                con.Dispose();
            }
        }
}
View Code

 

  上面是封裝的Common層的工具類,方便將Excel轉換爲DataTable.

      下面上調用的代碼

  string conString = "server=192.168.1.44;database=DataTest;uid=sa;pwd=sa";
                //調用Excel轉Sql方法   

                DataTable dt = OutExcel.ExcelDataTable(imageUrl, "sheet1");
                //創建批量DataTable導入Sql   
                using (SqlBulkCopy copy = new SqlBulkCopy(conString, SqlBulkCopyOptions.UseInternalTransaction))
                {
                    //指定數據庫表名      
                    copy.DestinationTableName = "BaseTags";
                    //寫入Sql    
                    copy.WriteToServer(dt);
                }
View Code

    其中 conString爲要插入的數據庫配置,再指定表明,就可以插入數據了,插入的方式爲追加在數據表中。
     二:再來個導出Excel的

  

 public class Util<T>
    {
        /// <summary>
        /// 導出Excel
        /// </summary>
        /// <param name="response">返回類型</param>
        /// <param name="list">要導出的數據</param>
        /// <param name="columnName">列名稱</param>
        /// <param name="propertyName">屬性名稱</param>
        /// <param name="ExcelTitle">Excel標題</param>
        /// <param name="strUserMsg"></param>
        public static void DataBindTitleExcel(System.Web.HttpResponseBase response, List<T> list, List<string> columnName, List<string> propertyName, string ExcelTitle, string strUserMsg)
        {

            if (list.Count == 0 || list == null)
            {
                response.Write("<script>alert('對不起,沒有查詢到任何記錄,導出失敗!')</script>");
                response.End();
            }
            response.ContentEncoding = Encoding.GetEncoding("GB2312");
            response.ContentType = "application/ms-excel";
            response.AppendHeader("Content-Disposition", "attachment;filename=Export.xls");
            int count = list.Count;
            StringBuilder builder = new StringBuilder();
            builder.Append("<html><head>\n");
            builder.Append("<meta http-equiv=\"Content-Language\" content=\"zh-cn\">\n");
            builder.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\n");
            builder.Append("</head>\n");
            builder.Append("<table border=1>");
            if (ExcelTitle != "")
            {
                string str = "<font size=4><b>" + ExcelTitle + "</b></font>";
                if (strUserMsg != "")
                {
                    str = str + "" + strUserMsg + "";
                }
                builder.Append(string.Concat(new object[] { "<tr><td colspan=", count, ">", str, "</td></tr>" }));
            }
            builder.Append("<tr><td colspan=" + count + " valign=middle height=24>");
            builder.Append("查詢時間:" + DateTime.Now.ToString("G") + "</td></tr>");
            builder.Append("<tr>\n");
            for (int i = 0; i < columnName.Count; i++)
            {

                builder.Append("<td bgcolor=#969696><b>" + columnName[i] + "</b></td>\n");

            }
            Type objType = typeof(T);
            BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;//反射標識 
            PropertyInfo[] propInfoArr = objType.GetProperties(bf);

            foreach (T model in list)
            {

                builder.Append("<tr>");

                foreach (PropertyInfo propInfo in propInfoArr)
                {

                    foreach (string propName in propertyName)
                    {

                        if (string.Compare(propInfo.Name.ToUpper(), propName.ToUpper()) == 0)
                        {

                            PropertyInfo modelProperty = model.GetType().GetProperty(propName);
                            if (modelProperty != null)
                            {

                                object objResult = modelProperty.GetValue(model, null);
                                builder.Append("<td style='vnd.ms-excel.numberformat:@'>" + ((objResult == null) ? string.Empty : objResult) + "</td>");
                            }
                            else
                            {
                                throw new Exception("Property name may be not exists!");
                            }
                        }
                    }
                }
                builder.Append("</tr>\n");
            }
            builder.Append("</table>\n");
            response.Write(builder.ToString());
            response.End();
        }
       



    }
View Code

    我調用時候寫的

    Util<BaseTags>.DataBindTitleExcel(Response, listbt, columnName, propertyName, "Test系統數據管理", "");
    其中第一個參數MVC項目裏爲Response,ashx裏爲context.response,第二個參數爲你要導出的數據列表,一般爲泛型LIST類型。第三個參數columnName爲Excel裏的每一列的表頭,第四個參數propertyName爲對應數據庫的列,第五個參數爲導出的Excel標題,第六個參數爲操作人員。

   PS:附上一個DEMO做參考。

  

 public ActionResult ToExcel(int id)
        {
            List<BaseTags> listbt = db.Set<BaseTags>().Where<BaseTags>(x => x.CollectorId == id).ToList();
            //這裏是EXCEL裏的內容
            List<string> columnName = new List<string>();
            columnName.Add("Tagname");
            columnName.Add("ExtendId");
            columnName.Add("Description");
            columnName.Add("Comment");
            columnName.Add("EngUnits");
            columnName.Add("DataType");
            columnName.Add("CollectorId");
            columnName.Add("GroupNumber");
            columnName.Add("SourceAddress");
            columnName.Add("CollectionInterval");
            columnName.Add("HiEngUnits");
            columnName.Add("LoEngUnits");
            columnName.Add("Expression");
            columnName.Add("IsSaveHistorian");
            columnName.Add("IsArchive");
            //這是是對應數據庫的列
            List<string> propertyName = new List<string>();
            propertyName.Add("Tagname");
            propertyName.Add("ExtendId");
            propertyName.Add("Description");
            propertyName.Add("Comment");
            propertyName.Add("EngUnits");
            propertyName.Add("DataType");
            propertyName.Add("CollectorId");
            propertyName.Add("GroupNumber");
            propertyName.Add("SourceAddress");
            propertyName.Add("CollectionInterval");
            propertyName.Add("HiEngUnits");
            propertyName.Add("LoEngUnits");
            propertyName.Add("Expression");
            propertyName.Add("IsSaveHistorian");
            propertyName.Add("IsArchive");
            Util<BaseTags>.DataBindTitleExcel(Response, listbt, columnName, propertyName, "Test系統數據管理", "");
            return View();
        }
View Code


    三:對Excel的操作(NPOI)

    使用NPOI可以百度搜索NPOI直接Down最新版本,最好全部引用,缺少引用將會導入無法使用某些類

    其中

     HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,擴展名是.xls

     XSSFWorkbook:是操作Excel2007的版本,擴展名是.xlsx

 StringBuilder sb = new StringBuilder();


               
                using (Stream stream = File.OpenRead(PATH))
                {
                    XSSFWorkbook workbook = new XSSFWorkbook(stream);
                    
                    //j爲行數
                    int j = workbook.GetSheetAt(1).LastRowNum;
                                                              //固定內容
                        sb.Append(@"MEPMD01,19970819,Schneider Electric,,,""SSTJEC\Sino Singapore TianJin Eco City|TianJin_Eco_City\TianJin Eco City"",");
                        string UtcNow = changeDateTimeFormat(DateTime.UtcNow);
                        //時間爲文件上傳FTP時間(UTC時間)
                        sb.Append(UtcNow);
                        sb.Append(',');
                        //用“EO系統名稱”一行的點名替代
                        sb.Append(workbook.GetSheetAt(1).GetRow(4).GetCell(1).StringCellValue);
                        sb.Append('|');
                        //用點表裏“地址”一行相應內容替代
                        sb.Append(workbook.GetSheetAt(1).GetRow(5).GetCell(1).NumericCellValue);
                        sb.Append(',');
                        //如果數據在合理的範圍內,即爲有效數據時此處填寫OK
                        sb.Append("OK");
                        sb.Append(',');
                        //點表中“點類型”一行相應內容替代
                        sb.Append(workbook.GetSheetAt(1).GetRow(6).GetCell(1).StringCellValue);
                        sb.Append(',');
                        //用點表中“單位”一行內容替代
                        sb.Append(workbook.GetSheetAt(1).GetRow(3).GetCell(1).StringCellValue);
                        sb.Append(",1,00000005,3,");
                        //爲後面第一個採樣值的採樣時間
                        string firsttime = DateTime.FromOADate(workbook.GetSheetAt(1).GetRow(10).GetCell(0).NumericCellValue).ToString();
                        string UtcFirst = changeDateTimeFormat(Convert.ToDateTime(firsttime));
                        sb.Append(UtcFirst);
                        sb.Append(",,");
                        //第一個採樣值
                        sb.Append(workbook.GetSheetAt(1).GetRow(8).GetCell(1).NumericCellValue);
                        sb.Append(",,,");
                        //第二個採樣值
                        sb.Append(workbook.GetSheetAt(1).GetRow(9).GetCell(1).NumericCellValue);
                        sb.Append(",,,");
                        //第三個採樣值
                        sb.Append(workbook.GetSheetAt(1).GetRow(10).GetCell(1).NumericCellValue);
                        sb.Append(",");
                        CreateTxt("E:\\" + dirs[intFile].Name.Split('.')[0] + ".cemp", sb.ToString());


                                 }
View Code

   其中PATH爲文件路徑,workbook即爲工作薄,GetRow(X)控制第幾行(默認從0開始),GetCell(X)控制第幾列(默認從0開始),

   Excel中string類型數據採用StringCellValue獲取,數值類型採用NumericCellValue獲取,Datetime類型直接獲取到得是數值,並非時間,要獲得時間通過DateTime.FromOADate(workbook.GetSheetAt(1).GetRow(10).GetCell(0).NumericCellValue).ToString();方式獲取

    

 

 

 

     

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