NopiHelper Excel導出 導入

先上一個Helper類:

public class NopiHelper
    {
        public string DataTableToExcel(DataTable tempDataTable, string path, bool is2007 = true)
        {
            try
            {
                //創建工作薄
                var wk = GetWorkbook(is2007);
                SetHssfWorkbook(wk, tempDataTable);
                var outPath = string.Format(@"{0}.{1}", path, is2007 ? @"xlsx" : @"xls");
                using (var file = new FileStream(outPath, FileMode.Create))
                {
                    wk.Write(file);
                }
                return outPath;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public MemoryStream DataTableToExcel(DataTable tempDataTable)
        {
            try
            {
                //創建工作薄
                var wk = new HSSFWorkbook();
                SetHssfWorkbook(wk, tempDataTable);
                var file = new MemoryStream();
                wk.Write(file);
                return file;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public MemoryStream DataTableToExcel(DataSet ds)
        {
            try
            {
                var wk = new HSSFWorkbook();
                //創建工作薄
                for (int i = 0; i < ds.Tables.Count; i++)
                {
                    SetHssfWorkbook(wk, ds.Tables[i]);
                }
                var file = new MemoryStream();
                wk.Write(file);
                return file;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public MemoryStream DataTableToExcel_Xlsx(DataSet ds)
        {
            try
            {
                var wk = new XSSFWorkbook();
                //創建工作薄
                for (int i = 0; i < ds.Tables.Count; i++)
                {
                    SetHssfWorkbook(wk, ds.Tables[i]);
                }
                var file = new MemoryStream();
                wk.Write(file);
                return file;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable GetFromExcel(string filePath, bool isFirstRowColumn = true)
        {
            try
            {
                ISheet sheet = null;
                DataTable data = new DataTable();
                int startRow = 0;

                var workbook = GetWorkbook(filePath);

                sheet = workbook.GetSheetAt(0);

                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    int cellCount = firstRow.LastCellNum; //一行最後一個cell的編號 即總的列數

                    if (isFirstRowColumn)
                    {
                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                        {
                            ICell cell = firstRow.GetCell(i);
                            if (cell != null)
                            {
                                string cellValue = cell.StringCellValue;
                                if (cellValue != null)
                                {
                                    DataColumn column = new DataColumn(cellValue);
                                    data.Columns.Add(column);
                                }
                            }
                        }
                        startRow = sheet.FirstRowNum + 1;
                    }
                    else
                    {
                        startRow = sheet.FirstRowNum;
                    }

                    //最後一列的標號
                    int rowCount = sheet.LastRowNum;
                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue; //沒有數據的行默認是null       

                        DataRow dataRow = data.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            if (row.GetCell(j) != null) //同理,沒有數據的單元格都默認是null
                                dataRow[j] = row.GetCell(j).ToString();
                        }
                        data.Rows.Add(dataRow);
                    }
                }

                return data;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable GetFromExcel(Stream stream, bool isFirstRowColumn = true)
        {
            try
            {
                ISheet sheet = null;
                DataTable data = new DataTable();
                int startRow = 0;

                var workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(stream); // 2007 格式

                sheet = workbook.GetSheetAt(0);

                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    int cellCount = firstRow.LastCellNum; //一行最後一個cell的編號 即總的列數

                    if (isFirstRowColumn)
                    {
                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                        {
                            ICell cell = firstRow.GetCell(i);
                            if (cell != null)
                            {
                                string cellValue = cell.StringCellValue;
                                if (cellValue != null)
                                {
                                    DataColumn column = new DataColumn(cellValue);
                                    data.Columns.Add(column);
                                }
                            }
                        }
                        startRow = sheet.FirstRowNum + 1;
                    }
                    else
                    {
                        startRow = sheet.FirstRowNum;
                    }

                    //最後一列的標號
                    int rowCount = sheet.LastRowNum;
                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue; //沒有數據的行默認是null       

                        DataRow dataRow = data.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            if (row.GetCell(j) != null) //同理,沒有數據的單元格都默認是null
                                dataRow[j] = row.GetCell(j).ToString();
                        }
                        data.Rows.Add(dataRow);
                    }
                }

                return data;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        #region Private

        private IWorkbook GetWorkbook(string path)
        {
            try
            {
                IWorkbook userModel;
                using (var file = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    try
                    {
                        userModel = new NPOI.XSSF.UserModel.XSSFWorkbook(file); // 2007 格式
                    }
                    catch (Exception)
                    {
                        userModel = new NPOI.HSSF.UserModel.HSSFWorkbook(file); // 2003 格式
                    }
                    finally
                    {
                        file.Close();
                    }
                }
                return userModel;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        private IWorkbook GetWorkbook(bool is2007 = true)
        {
            try
            {
                IWorkbook userModel;
                if (is2007)
                    userModel = new NPOI.XSSF.UserModel.XSSFWorkbook(); // 2007 格式
                else
                    userModel = new NPOI.HSSF.UserModel.HSSFWorkbook(); // 2003 格式

                return userModel;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        private void SetHssfWorkbook(IWorkbook hssfWorkbook, DataTable tempDataTable)
        {
            try
            {
                //創建一個名稱爲mySheet的表
                var tb = hssfWorkbook.CreateSheet(tempDataTable.TableName);
                //標題行
                var rowhead = tb.CreateRow(0);

                for (var i = 0; i < tempDataTable.Columns.Count; i++) //寫入字段
                {
                    var cell = rowhead.CreateCell(i); //在第二行中創建單元格
                    cell.SetCellValue(tempDataTable.Columns[i].Caption); //循環往第二行的單元格中添加數據
                }

                for (var y = 0; y < tempDataTable.Rows.Count; y++)
                {
                    var rowcontent = tb.CreateRow(y + 1);
                    for (int i = 0; i < tempDataTable.Columns.Count; i++)
                    {
                        var cell = rowcontent.CreateCell(i); //在第二行中創建單元格
                        cell.SetCellValue(tempDataTable.Rows[y][tempDataTable.Columns[i].ToString()].ToString());
                        //循環往第二行的單元格中添加數據
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

    }


一、Excel導出功能:

頁面按鈕:

 window.open("/User/UserExportExcel/?SearchPhone=" + SearchPhone);
控制器代碼:

/// <summary>
        /// 導出用戶列表
        /// </summary>
        /// <param name="collection"></param>
        /// <returns></returns>
        public ActionResult UserExportExcel(FormCollection collection)
        {
            try
            {
                var searchEntity = GetSelect();
                var listData = new UserBll().GetList(searchEntity).OrderByDescending(c => c.Id).ToList();

                DataSet ds = new DataSet();
                var dt = new DataTable();
                dt.Columns.Add("序號");
                dt.Columns.Add("編號");
                dt.Columns.Add("用戶名");

                var i = 1;

                if (listData.Count > 20000)
                {
                    DataRow dr = dt.NewRow();
                    dr["序號"] = i++;
                    dr["編號"] = "數據過多請縮小時間範圍,分批導出";
                    dr["用戶名"] = "數據過多請縮小時間範圍,分批導出";
                    dt.Rows.Add(dr);
                }
                else
                {
                    listData.ForEach(entity =>
                    {
                        DataRow dr = dt.NewRow();
                        dr["序號"] = i++;
                        dr["編號"] = entity.No;
                        dr["用戶名"] = entity.Name;
                        dt.Rows.Add(dr);
                    });

                }
                dt.TableName = "用戶列表_" + ConfigInfo.CurrrentDateTime.ToString("yyyyMMdd") + "_" + (1).ToString().PadLeft(4, '0') + ".xlsx";
                ds.Tables.Add(dt);
                string title = "用戶列表(" + ConfigInfo.CurrrentDateTime.ToString("yyyyMMdd") + ")" + ".xlsx";
                var stream = new NopiHelper().DataTableToExcel_Xlsx(ds);
                return File(stream.ToArray(), "application/ms-excel", title);
            }
            catch (Exception ex)
            {
                throw;
            }
        }


二、Excel導入功能:

1 、頁面代碼:

<input type="file" id="ExcelFile" accept=".csv,.xlsx" />
            <input type="button" value="上傳" id="btn_UploadExcel" />

            <table id="table_body" cellpadding="5" cellspacing="0" width="100%" align="center" class="grid" border="0">
                <thead>
                    <tr>
                        <th>序號</th>
                        <th>真實姓名</th>
                        <th>手機號</th>
                        <th>備註信息</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
            <input type="hidden" name="json" id="json" value="" />
<input type="button" value="發送XX" id="btn_SendAddInterestActivity" />
2、上傳按鈕JS:

//上傳數據
            $("#btn_UploadExcel").click(function () {
                var obj = document.getElementById("ExcelFile");
                var formdata = new FormData();
                var fileObj = obj.files;
                for (var i = 0; i < fileObj.length; i++)
                    formdata.append("file" + i, fileObj[i]);
                $.ajax({
                    type: 'POST',
                    url: '/AddInterestActivity/UploadExcel',
                    data: formdata,
                    contentType: false,
                    processData: false
                }).then(function (data) {
                    if (!isEmpty(data)) {
                        var html = "";
                        $.each(data, function (index, value) {
                            html += "<tr>";
                            html += "<td>" + value["序號"] + "</td>";
                            html += "<td>" + value["真實姓名"] + "</td>";
                            html += "<td>" + value["手機號"] + "</td>";
                            html += "<td>" + value["備註"] + "</td>";
                            html += "</tr>";
                        });
                        $("#table_body tbody").html(html);
                    }
                    else {
                        alert("數據類型錯誤");
                    }
                }, function () {
                    //failCal
                });
            });

收集數據保存:

 //發送
            $("#btn_SendAddInterestActivity").click(function () {

                

                    $.messager.confirm("確認", "確定執行此操作", function (r) {
                        var tbody = $("#table_body tbody");
                        var trList = tbody.children("tr")
                        var json = [];
                        for (var i = 0; i < trList.length; i++) {
                            var tdArr = trList.eq(i).find("td");
                            var RealName = tdArr.eq(1).html();//手機號
                            var UserPhone = tdArr.eq(2).html();//手機號
                            var Remark = tdArr.eq(3).html();//備註
                            if (UserPhone.indexOf("不合格") > 0 || RealName.indexOf("不合格") > 0) {
                                alert("不合格");
                                $("#submitloading").hide();
                                return false;
                            }
                            json.push({ "UserPhone": UserPhone, "RealName": RealName, "Remark": Remark });
                        }
                        $("#json").val(JSON.stringify(json));

                        //alert("發送紅包");
                        var data = { json: $("#json").val(), activityId: $("#Id").val() };
                        $.ajax({
                            type: 'POST',
                            url: '/AddInterestActivity/SendAddInterestActivity',
                            data: data,
                            success: function (msg) {
                                if (msg.ResultType == 0) {
                                    alert(msg.Message);
                                    tbody.html("");
                                }
                                else {
                                    alert("發送失敗");
                                }
                            }
                        });
                    });
            });




3、上傳控制器:

public ActionResult UploadExcel()
        {
            HttpFileCollectionBase fileToUpload = Request.Files;
            foreach (string file in fileToUpload)
            {
                var curFile = Request.Files[file];
                if (curFile.ContentLength < 1) continue;
                string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + System.IO.Path.GetExtension(curFile.FileName);
                if (fileName.Substring((fileName.IndexOf(".") + 1)) == "xls" || fileName.Substring((fileName.IndexOf(".") + 1)) == "xlsx" || fileName.Substring((fileName.IndexOf(".") + 1)) == "csv")
                {

                    DataTable dt = new NopiHelper().GetFromExcel(curFile.InputStream);
                    if (!dt.Columns.Contains("手機號"))
                    {
                        return null;
                    }
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        //驗證“手機號”
                        var toName = dt.Rows[i]["手機號"].ToString();
                        var operationResult_ToUser = new UserBll().GetByPhone(toName);
                        if (operationResult_ToUser.ResultType != OperationResultType.Success)
                        {
                            dt.Rows[i]["手機號"] += " <span style='color:red'>(不合格)</span>";
                        }

                        ////驗證“交易金額”
                        //var money = dt.Rows[i]["交易金額"].ToString();
                        //if (string.IsNullOrEmpty(money) || money == "0")
                        //{
                        //    dt.Rows[i]["交易金額"] += " <span style='color:red'>(不合格)</span>";
                        //}
                    }

                    string json = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
                    return Content(json, "text/json");
                }
            }
            return null;
        }

[HttpPost]
        public ActionResult SendAddInterestActivity(string json, int activityId)
        {
            try
            {
                //var importEndTime = Convert.ToDateTime(ImportEndTime);
                if (json == "[]" || activityId == 0)
                {
                    return Json(new OperationResult(OperationResultType.Success, @"上傳文件錯誤,或活動不存在"));
                }
                
//執行保存代碼
                return Json(new OperationResult(OperationResultType.Success, @"保存成功"));
            }
            catch (Exception ex)
            {
                throw;
            }
        }



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