之前在網上看到大部分的意見都認為“對於Excel 97-2003格式,還是用NPOI最好;而對於2007(xlsx)以上版本,可以使用EPPlus”。然后在實際操作中有發現,使用NPOI的話,讀取xlsx文件會出點問題,但是寫入的話,個人感覺EPPlus語言簡潔美觀點(此地僅個人感官,實際使用以個人為主)
關於excel讀寫,網上還找的別的:
- NPOI(http://npoi.codeplex.com/)
- MyXls(http://sourceforge.net/projects/myxls/)
- Koogra(http://sourceforge.net/projects/koogra/)
- ExcelLibrary(http://code.google.com/p/excellibrary/)
- ExcelPackage(http://excelpackage.codeplex.com/)
- EPPlus(http://epplus.codeplex.com/)
- 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); }