使用EPPlus讀寫excel文件並保存


之前在網上看到大部分的意見都認為“對於Excel 97-2003格式,還是用NPOI最好;而對於2007(xlsx)以上版本,可以使用EPPlus”。然后在實際操作中有發現,使用NPOI的話,讀取xlsx文件會出點問題,但是寫入的話,個人感覺EPPlus語言簡潔美觀點(此地僅個人感官,實際使用以個人為主)

關於excel讀寫,網上還找的別的:

  1. NPOI(http://npoi.codeplex.com/)
  2. MyXls(http://sourceforge.net/projects/myxls/)
  3. Koogra(http://sourceforge.net/projects/koogra/)
  4. ExcelLibrary(http://code.google.com/p/excellibrary/)
  5. ExcelPackage(http://excelpackage.codeplex.com/)
  6. EPPlus(http://epplus.codeplex.com/)
  7. LinqToExcel(http://code.google.com/p/linqtoexcel/)

此地暫時僅介紹EPPlus

EPPlus讀取excel:

using (ExcelPackage package = new ExcelPackage(new FileStream(path, FileMode.Open)))
{
    for (int i = 1; i <= package.Workbook.Worksheets.Count; ++i)
    {
        ExcelWorksheet sheet = package.Workbook.Worksheets[i];
        for (int j = sheet.Dimension.Start.Column, k = sheet.Dimension.End.Column; j <= k; j++)
        {
            for (int m = sheet.Dimension.Start.Row, n = sheet.Dimension.End.Row; m <= n; m++)
            {
                string str = GetValue(sheet, m, j);
                if (str != null)
                {
                    // do something
                }
            }
        }
    }
}

EPPlus寫入excel:

using (ExcelPackage package = new ExcelPackage())
{
    ExcelWorksheet sheet = package.Workbook.Worksheets.Add("Sheet1");
    sheet.Cells[1, 1].Value = "1";
    sheet.Cells[1, 2].Value = "2";
    sheet.Cells[1, 3].Value = "3";
    sheet.Cells[1, 4].Value = "4";
    sheet.Cells[1, 5].Value = "5";
    sheet.Cells[1, 6].Value = "6";
    using (Stream stream = new FileStream(path, FileMode.Create))
    {
        package.SaveAs(stream);
    }
}

合並單元格:

worksheet.Cells[fromRow, fromCol, toRow, toCol].Merge = true; 

 

excel樣式設置:

//表頭樣式(后面三個感覺沒起作用)
worksheet.Row(1).Height = 30;  //設置高度
worksheet.Row(1).Style.Font.Bold = true; //字體加粗
worksheet.Row(1).Style.Font.Size = 11;  //字體大小
worksheet.Row(1).Style.Font.Name = "微軟雅黑";  //字體
worksheet.Column(columnIndex).Width = 30;  //設置列寬

worksheet.DefaultRowHeight = 27;//設置單元格默認行高 worksheet.Cells.Style.ShrinkToFit = true;//單元格自動適應大小 worksheet.Cells.Style.WrapText = true;//自動換行 worksheet.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));//設置單元格所有邊框 worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;//設置單元格水平居中 worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center;//設置單元格垂直居中

下面提供完整demo

     /// <summary>
        /// 導出供應商考核表
        /// </summary>
        /// <returns></returns>
        public IActionResult ExportSupplierAssessment(RaterType type)
        {
            ResultResponse<string> result = new ResultResponse<string>();

            string webRootPath = _hostingEnvironment.WebRootPath;

            //考核表文件夾
            string folder_download = ConfigurationHelper.GetSingleNode("Download_Assessment");
            //虛擬目錄
            string appUrl = ConfigurationHelper.GetSingleNode("File_AppUrl");

            try
            {
                //生成考核表文件夾
                var folderPath_download = Path.Combine(webRootPath, folder_download);
                if (!System.IO.Directory.Exists(folderPath_download))
                {
                    System.IO.Directory.CreateDirectory(folderPath_download);
                }

                string fileName_download = $"供應商考核{EnumExtension.GetDescription(type)}打分表" + DateTime.UtcNow.AddHours(8).ToString("yyyyMMddHHmmss") + ".xls";
                FileInfo file = new FileInfo(Path.Combine(webRootPath, folder_download, fileName_download));
                using (ExcelPackage package = new ExcelPackage(file))
                {
                    // 添加worksheet
                    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("供應商考核表");
                    var columnWidth = 10;

                    //添加頭
                    worksheet.Cells[1, 1].Value = "類別";
                    worksheet.Cells[1, 2].Value = "供應商類別";
                    worksheet.Cells[1, 3].Value = "供應商名稱";
                    //worksheet.Cells[1, 3].Value = "平均得分";
                    worksheet.Cells[1, 4].Value = "序號";
                    worksheet.Cells[1, 5].Value = "項目名稱";

                    var endCells = 10;
                    //學校評分
                    if (type == RaterType.School)
                    {
                        worksheet.Cells[1, 6].Value = "書面考核所占比例";
                        worksheet.Cells[1, 7].Value = "書面考核分";
                        worksheet.Cells[1, 8].Value = "學校考核所占比例";
                        worksheet.Cells[1, 9].Value = "學校評分";
                        worksheet.Cells[1, 10].Value = "備注";
                    }
                    //監理評分
                    else if (type == RaterType.Supervisor)
                    {
                        worksheet.Cells[1, 6].Value = "監理考核所占比例";
                        worksheet.Cells[1, 7].Value = "監理評分";
                        worksheet.Cells[1, 8].Value = "備注";
                        endCells = 8;
                    }
                    else
                    {
                        worksheet.Cells[1, 6].Value = "校產站考核所占比例";
                        worksheet.Cells[1, 7].Value = "計划部評分";
                        worksheet.Cells[1, 8].Value = "施工部評分";
                        worksheet.Cells[1, 9].Value = "設備部評分";
                        worksheet.Cells[1, 10].Value = "備注";
                    }
                    //表頭樣式(后面三個貌似不起作用)
                    //worksheet.Row(1).Height = 30;  //設置高度
                    //worksheet.Row(1).Style.Font.Bold = true; //字體加粗
                    //worksheet.Row(1).Style.Font.Size = 11;  //字體大小
                    //worksheet.Row(1).Style.Font.Name = "微軟雅黑";  //字體


                    //設置列寬
                    for (int i = 1; i < 11; i++)
                    {
                        worksheet.Column(i).Width = i == 3 || i == 5 ? 30 : columnWidth;
                    }
                    worksheet.DefaultRowHeight = 27;//設置單元格默認行高
                    worksheet.Cells.Style.ShrinkToFit = true;//單元格自動適應大小
                    worksheet.Cells.Style.WrapText = true;//自動換行
                    worksheet.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));//設置單元格所有邊框
                    worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;//設置單元格水平居中
                    worksheet.Cells.Style.VerticalAlignment = ExcelVerticalAlignment.Center;//設置單元格垂直居中

                    //從第一行之后開始寫
                    var row = 1;

                    //添加值
                    var supplierScoreList = _supplierScoreAppService.GetSupplierScoreListByWait().Data;
                    if (supplierScoreList != null)
                    {
                        foreach (var score in supplierScoreList)
                        {
                            var assessmentList = _supplierAssessmentAppService.GetSupplierAssessmentListBySupplierScoreUid(score.Uid).Data;
                            if (assessmentList != null)
                            {
                                var index = 0;   //項目序號 foreach (var assessment in assessmentList)
                                {
                                    index++;
                                    row++;

                                    worksheet.Row(row).CustomHeight = true;//自動調整行高

                                    //公共部分
                                    worksheet.Cells[$"A{row}"].Value = EnumExtension.GetDescription(score.SupplierType);
                                    worksheet.Cells[$"B{row}"].Value = score.SupplierCategoryName;
                                    worksheet.Cells[$"C{row}"].Value = score.SupplierName;
                                    worksheet.Cells[$"D{row}"].Value = index;
                                    worksheet.Cells[$"E{row}"].Value = assessment.ProjectName;

                                    switch (type)
                                    {
                                        case RaterType.School:
                                            worksheet.Cells[$"F{row}"].Value = assessment.WrittenRatio;
                                            worksheet.Cells[$"G{row}"].Value = assessment.WrittenScore;
                                            worksheet.Cells[$"H{row}"].Value = assessment.SchoolRatio;
                                            worksheet.Cells[$"I{row}"].Value = assessment.SchoolScore;
                                            worksheet.Cells[$"G{row}"].Value = assessment.Remark;
                                            break;
                                        case RaterType.Supervisor:
                                            worksheet.Cells[$"F{row}"].Value = assessment.SupervisorRatio;
                                            worksheet.Cells[$"G{row}"].Value = assessment.SupervisorScore;
                                            worksheet.Cells[$"H{row}"].Value = assessment.Remark;
                                            break;
                                        case RaterType.Inside:
                                            worksheet.Cells[$"F{row}"].Value = assessment.InsideRatio;
                                            worksheet.Cells[$"G{row}"].Value = assessment.PlanScore;
                                            worksheet.Cells[$"H{row}"].Value = assessment.ConstructionScore;
                                            worksheet.Cells[$"I{row}"].Value = assessment.EquipmentScore;
                                            worksheet.Cells[$"G{row}"].Value = assessment.Remark;
                                            break;
                                        default:
                                            break;
                                    }
                                }
                                if (assessmentList.Count > 1)
                                {
                                    //合並單元格
                                    var startRow = row - assessmentList.Count() + 1;
                                    worksheet.Cells[startRow, 1, row, 1].Merge = true;  //類型
                                    worksheet.Cells[startRow, 2, row, 2].Merge = true;  //供應商類別
                                    worksheet.Cells[startRow, 3, row, 3].Merge = true;  //供應商名稱
                                }
                            }
                        }
                    }

                    package.Save();
                }
                //寫入文件
                File(fileName_download, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", true);

                //前台訪問路徑
                var filePath = $"{Request.Host}/" + appUrl + $"/{folder_download}/{fileName_download}";
                result.Data = filePath;
            }
            catch (Exception ex)
            {
                NullLogger.Instance.Info(ex.Message, ex);
            }
            return Ok(result);
        }

 


免責聲明!

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



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