C# Excel操作NPOI

EXCEL导入

  • 接口ExcelImport
  • ExcelToDataTable
  • 去除datatable中的空行RemoveEmpty

EXCEL导出 (请求方式必须为表单提交)

  • 接口ExportPlantData(Void)
  • 接口ExportPlantData
  • 新建类 重写Npoi流方法

EXCEL导入

接口ExcelImport

		/// <summary>
        ///导入Excel  先将文件保存到服务器本地 然后访问服务器文件地址,获取文件
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<Result> ExcelImport()
        {
            var request = HttpContext.Current.Request;
            var tableName=request.Params["TableName"];
            var server = HttpContext.Current.Server;
            HttpPostedFile postFile;
            if (request.Files.Count > 0)
            {
                //单文件上传,多文件for
                postFile = request.Files[0];
            }
            else
            {
                return Result.Failed("无文件");
            }
            try
            {
                var filePath = server.MapPath("~/UpLoad/");
                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }
                var fileName = Path.GetFileName(postFile.FileName);
                var fileExtention = Path.GetExtension(fileName);
                if (fileExtention != ".xls" && fileExtention != ".xlsx")
                {
                    return Result.Failed("文件格式非.xls 或 .xlsx");
                }
                var saveFileName = filePath + Guid.NewGuid() + fileExtention;
                postFile.SaveAs(saveFileName);
                _deleteFile = saveFileName;
                var excelToList = await _service.ExcelToList(tableName, saveFileName);
                if (excelToList == null || excelToList.Count<1 || excelToList[0] == null || excelToList[0].Count < 1)
                    return Result.Failed("文件为空");
                return await _service.ExcelImport(tableName, excelToList) ? Result.Successed : Result.Failed("操作失败");
            }
            catch (Exception ex)
            {
                return Result.Failed(ex.ToString());
            }
            finally
            {
                if (!string.IsNullOrEmpty(_deleteFile))
                    File.Delete(_deleteFile);
            }
        }

ExcelToDataTable

    /// </summary>
    /// <param name="filePath">Excel位置</param>
    /// <param name="tableName">Table名字</param>
    /// <param name="sheetIndex">sheet索引</param>
    /// <returns></returns>
    public static Task<DataTable> ExcelToDataTable(string filePath, string tableName, int sheetIndex)
    {	
        return Task.Run(() =>
        {
            DataTable fileToTable = new DataTable();
            if (!string.IsNullOrEmpty(tableName))
            {
                fileToTable.TableName = tableName;
            }
            using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                IWorkbook workBook = null;
                try {
                    workBook = new XSSFWorkbook(file);
                }
                catch {
                    workBook = new HSSFWorkbook(file);
                }
                ISheet sheet = workBook.GetSheetAt(sheetIndex);
                //列头
                foreach (ICell item in sheet.GetRow(sheet.FirstRowNum).Cells)
                {
                    fileToTable.Columns.Add(item.ToString(), typeof(string));
                }
                //写入内容
                System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
                rows.MoveNext();//跳过字段行
                while (rows.MoveNext())
                {
                    IRow row = (IRow)rows.Current;
                    if (string.IsNullOrEmpty(row.AsEnumerable().ToString()))
                    {
                        continue;
                    }
                    DataRow dr = fileToTable.NewRow();
                    for (int i = 0; i < row.LastCellNum; i++)
                    {
                        ICell item = row.GetCell(i);
                        if (item == null)
                        {
                            continue;
                        }
                        //foreach (ICell item in row.Cells)
                        //{
                        if (item.IsMergedCell)
                        {
                            for (int j = 0; j < sheet.NumMergedRegions; j++)
                            {
                                //获取合并单元格范围
                                var cellrange = sheet.GetMergedRegion(j);
                                // 这里是cell所在的合并单元格,添加处理代码
                                if (item.ColumnIndex >= cellrange.FirstColumn && item.ColumnIndex <= cellrange.LastColumn
                                    && item.RowIndex >= cellrange.FirstRow && item.RowIndex <= cellrange.LastRow)
                                {
                                    item.SetCellValue(sheet.GetRow(cellrange.FirstRow).GetCell(cellrange.FirstColumn).ToString());
                                    //下面的方法使item的位置 即ColumnIndex发生变化  为单元格有效值位置
                                    //此方法影响行,而不影响列 即值会代替,而RowIndex不会有变化
                                    //item= sheet.GetRow(cellrange.FirstRow).GetCell(cellrange.FirstColumn);
                                break;
                            }
                        }
                    }
                    #region 判断单元格类型 并赋值
                    switch (item.CellType)
                    {
                        case CellType.Boolean:
                            dr[item.ColumnIndex] = item.BooleanCellValue;
                            break;
                        case CellType.Error:
                            dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
                            break;
                        case CellType.Formula:
                            switch (item.CachedFormulaResultType)
                            {
                                case CellType.Boolean:
                                    dr[item.ColumnIndex] = item.BooleanCellValue;
                                    break;
                                case CellType.Error:
                                    dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
                                    break;
                                case CellType.Numeric:
                                    if (DateUtil.IsCellDateFormatted(item))
                                    {
                                        dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
                                    }
                                    else
                                    {
                                        dr[item.ColumnIndex] = item.NumericCellValue;
                                    }
                                    break;
                                case CellType.String:
                                    string str = item.StringCellValue;
                                    if (!string.IsNullOrEmpty(str))
                                    {
                                        dr[item.ColumnIndex] = str.ToString();
                                    }
                                    else
                                    {
                                        dr[item.ColumnIndex] = null;
                                    }
                                    break;
                                case CellType.Unknown:
                                case CellType.Blank:
                                default:
                                    dr[item.ColumnIndex] = string.Empty;
                                    break;
                            }
                            break;
                        case CellType.Numeric:
                            if (DateUtil.IsCellDateFormatted(item))
                            {
                                dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
                            }
                            else
                            {
                                dr[item.ColumnIndex] = double.Parse(item.NumericCellValue.ToString("f2"));
                            }
                            break;
                        case CellType.String:
                            string strValue = item.StringCellValue;
                            if (!string.IsNullOrEmpty(strValue))
                            {
                                dr[item.ColumnIndex] = strValue;
                            }
                            else
                            {
                                dr[item.ColumnIndex] = null;
                            }
                            break;
                        case CellType.Unknown:
                        case CellType.Blank:
                        default:
                            dr[item.ColumnIndex] = string.Empty;
                            break;
                    }
                    #endregion
                }
                fileToTable.Rows.Add(dr);
            }
        }
        RemoveEmpty(fileToTable);
        return fileToTable;
    });
}

去除datatable中的空行RemoveEmpty

	    /// <summary>
	    去除datatable中的空行RemoveEmpty
        /// </summary>
        /// <param name="dt"></param>
        public static void RemoveEmpty(DataTable dt)
        {
            List<DataRow> removeList = new List<DataRow>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                bool rowDataIsNull = true;
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
                    {
                        rowDataIsNull = false;
                    }
                }
                if (rowDataIsNull)
                {
                    removeList.Add(dt.Rows[i]);
                }

            }
            for (int i = 0; i < removeList.Count; i++)
            {
                dt.Rows.Remove(removeList[i]);
            }
        }

EXCEL导出 (请求方式必须为表单提交)

表单请求
post/get请求 action接口 参数 method data

<form method="post" action="ScoreStatisticsAndAnalysis.aspx">
        <input type="text" name="method" id="method" value="DownLoadDesignatedExamination">
        <input type="text" name="data" id="data" value="2086ec30-2f65-4ad0-bc45-866917e59e2c">
        <input type="submit" value="fdasfdasf ">
 </form>

接口ExportPlantData(Void)

	    using SAC.SIS.Web.Model;
	    using NPOI.HSSF.UserModel;
	    using NPOI.SS.UserModel;
	    using System.IO;
	    /// <summary>
        /// 数据导出
        /// </summary>
        /// <returns></returns>
        public void ExportPlantData(string paperId)
        {
            HSSFWorkbook workBook = new HSSFWorkbook();
            ISheet sheet = workBook.CreateSheet("NumberOne");
            sheet.SetColumnWidth(0, 10 * 256);
            sheet.SetColumnWidth(1, 28 * 256);
            sheet.SetColumnWidth(2, 28 * 256);
            sheet.SetColumnWidth(3, 10 * 256);
            sheet.SetColumnWidth(4, 20 * 256);
            sheet.SetColumnWidth(5, 10 * 256);
            sheet.CreateRow(0);
            sheet.GetRow(0).HeightInPoints = 68;

            #region 设置Excel第一行:即列名
            List<string> columnsNames = new List<string> {
                "序号",
                "试卷名",
                "区域",
                "职务",
                "姓名",
                "分数"
            };
            for (int i = 0; i < columnsNames.Count; i++)
            {
                sheet.GetRow(0).CreateCell(i);
                sheet.GetRow(0).GetCell(i).SetCellValue(columnsNames[i]);
            }
            #endregion

            var fillingData = bll.GetDesignatedExaminationScore(paperId);
            var newFileName = bll.GetPaperName(paperId) + ".xls";
            foreach (var data in fillingData.Select((x, i) => new { x, i }))
            {

                int index = data.i + 1;
                sheet.CreateRow(index);
                for (int i = 0; i < columnsNames.Count; i++)
                {
                    sheet.GetRow(index).CreateCell(i);
                }
                sheet.GetRow(index).GetCell(0).SetCellValue(data.x.Order);
                sheet.GetRow(index).GetCell(1).SetCellValue(data.x.PaperName);
                sheet.GetRow(index).GetCell(2).SetCellValue(data.x.CompanyName);
                sheet.GetRow(index).GetCell(3).SetCellValue(data.x.Job);
                sheet.GetRow(index).GetCell(4).SetCellValue(data.x.UserName);
                sheet.GetRow(index).GetCell(5).SetCellValue(data.x.Score);
            }
            NpoiMemoryStream memoryStream = new NpoiMemoryStream();
            memoryStream.AllowClose = false;
            workBook.Write(memoryStream);
            memoryStream.Flush();
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.AllowClose = true;
            HttpContext.Current.Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            HttpContext.Current.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", System.Web.HttpUtility.UrlEncode(newFileName, System.Text.Encoding.UTF8)));
            HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.End();
        }

接口ExportPlantData

	    using NPOI.XSSF.UserModel;
	    using SAC.FXPIN.InputModel.DataFilling;
	    using SAC.FXPIN.IService.DataFilling;
	    using SAC.FXPIN.Service.DataFilling;
	    using System;
	    using System.Collections.Generic;
	    using System.IO;
	    using System.Linq;
	    using System.Net;
	    using System.Net.Http;
	    using System.Web;
	    using System.Web.Http;
	    using System.Web.Http.Cors;
	    using NPOI.SS.UserModel;
	    using SAC.FXPIN.Entity.DataFilling;
	    using System.Net.Http.Headers;
	    /// <summary>
        /// 数据导出
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public HttpResponseMessage ExportPlantData(string stationName, string unitId, string unitType)
        {
            var typeName = "火电";
            string newFileName = "测点填报.xlsx";
            XSSFWorkbook workBook = new XSSFWorkbook();
            ISheet sheet = workBook.CreateSheet("NumberOne");
            sheet.SetColumnWidth(0, 10 * 256);
            sheet.SetColumnWidth(1, 28 * 256);
            sheet.SetColumnWidth(2, 28 * 256);
            sheet.SetColumnWidth(3, 10 * 256);
            sheet.SetColumnWidth(4, 30 * 256);
            sheet.SetColumnWidth(5, 18 * 256);
            sheet.SetColumnWidth(6, 10 * 256);
            sheet.SetColumnWidth(7, 10 * 256);
            sheet.SetColumnWidth(8, 10 * 256);
            sheet.SetColumnWidth(9, 10 * 256);
            sheet.CreateRow(0);
            sheet.GetRow(0).HeightInPoints = 68;

            #region 设置Excel第一行:即列名
            List<string> columnsNames = new List<string> {
                "序号",
                "集团总部所需测点名",
                "集团总部所需测点中文描述",
                "注释",
                "已建实时数据库电厂填写在电场实时数据库中的ID,为建实时数据库电厂填写DCS中的ID",
                "已建实时数据库电厂填写在电场实时数据库中的中文描述,为建实时数据库电厂填写DCS中的中文描述",
                "备注(对测点位置不明确的请注期)",
                "单位",
                "上限",
                "下限"
            };
            for (int i = 0; i < 10; i++)
            {
                sheet.GetRow(0).CreateCell(i);
                sheet.GetRow(0).GetCell(i).SetCellValue(columnsNames[i]);
            }
            #endregion

            var fillingData = _service.GetTagFilling(new TagSelectInputModel { UnitId = unitId, UnitType = unitType });
            Task.WaitAll(fillingData);//等待此线程结束
            foreach (var data in fillingData.Result.Select((x, i) => new { x, i }))
            {

                int index = data.i + 1;
                sheet.CreateRow(index);
                for (int i = 0; i < 10; i++)
                {
                    sheet.GetRow(index).CreateCell(i);
                }
                sheet.GetRow(index).GetCell(0).SetCellValue(data.x.OrderNumber);
                sheet.GetRow(index).GetCell(1).SetCellValue(data.x.TagId);
                sheet.GetRow(index).GetCell(2).SetCellValue(data.x.TagName);
                sheet.GetRow(index).GetCell(3).SetCellValue(data.x.Description);
                sheet.GetRow(index).GetCell(4).SetCellValue(data.x.StationId);
                sheet.GetRow(index).GetCell(5).SetCellValue(data.x.StationDesc);
                sheet.GetRow(index).GetCell(6).SetCellValue(data.x.TagDesc);
                sheet.GetRow(index).GetCell(7).SetCellValue(data.x.Unit);
                sheet.GetRow(index).GetCell(8).SetCellValue(data.x.TagMax.ToString());
                sheet.GetRow(index).GetCell(9).SetCellValue(data.x.TagMin.ToString());
            }
            NpoiMemoryStream memoryStream = new NpoiMemoryStream();
            memoryStream.AllowClose = false;
            workBook.Write(memoryStream);
            memoryStream.Flush();
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.AllowClose = true;
            var response = new HttpResponseMessage(HttpStatusCode.OK);
            response.Content = new StreamContent(memoryStream);
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = System.Web.HttpUtility.UrlEncode(newFileName, System.Text.Encoding.UTF8)
//火狐浏览器乱码问题
// FileName = System.Web.HttpUtility.HtmlEncode(newFileName)
            };
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            return response;
        }

新建类 重写Npoi流方法

  public class NpoiMemoryStream : MemoryStream
    {
        public NpoiMemoryStream()
        {
            AllowClose = true;
        }

        public bool AllowClose { get; set; }

        public override void Close()
        {
            if (AllowClose)
                base.Close();
        }
    }

注:转载请注明出处

猜你喜欢

转载自blog.csdn.net/Street_Walker/article/details/88239452