C#使用NPOI進行xlsx的讀寫(專案案例)
阿新 • • 發佈:2022-04-12
/// <summary> /// 匯出exec /// </summary> /// <returns></returns> public async Task<ActionResult> ExportExamRecord() { // 資料來源 var model = new ExportExamExecModel(); // 方法 var wk = EquipWordHelper.ExportExamRecordExec(model);using (MemoryStream ms = new MemoryStream()) { wk.Write(ms); //檔名稱 string fileName = $"{model.ProjectName}-{model.Name}-{model.TitleName}-{ DateTime.Now.ToString("yyyy-MM-dd")}.xlsx"; return File(ms.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, fileName); } }
處理方法-(ExportExamRecordExec)
private static readonly string Folder = HttpContext.Current.Server.MapPath("~/File/Template/"); public static HSSFWorkbook ExportExamRecordExec(ExportExamExecModel model) { var template = Folder + "Exam.xls"; using (FileStream fs = newFileStream(template, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { HSSFWorkbook wk = new HSSFWorkbook(fs); FillContentExamRecord(model, wk); return wk; } }
public static void FillContentExamRecord(ExportExamExecModel model, HSSFWorkbook wk) { var rowold = 5; var rownum = 4; ISheet sheet = wk.GetSheetAt(0); for (int rowIndex = 0; rowIndex <= 5; rowIndex++) { // 1.判斷當前行是否空行,若空行就不在進行讀取下一行操作,結束Excel讀取操作 IRow row = sheet.GetRow(rowIndex); if (row != null) { if (rowIndex == 0) { var cell = row.GetCell(0); cell.SetCellValue(model.TitleName); } if (rowIndex == 1) { row.GetCell(1).SetCellValue(model.ProjectName);//專案名稱 row.GetCell(7).SetCellValue(model.EquipSupplierName);//供應商名稱 } else if (rowIndex == 2) { row.GetCell(1).SetCellValue(model.Name);//姓名 row.GetCell(7).SetCellValue(model.JobName);//工種 } else if (rowIndex == 3) { row.GetCell(1).SetCellValue(model.CommitTimeStr);//考試時間 row.GetCell(7).SetCellValue(model.ExamScore);//得分 } else if (rowIndex == 5) { sheet.ShiftRows(5, sheet.LastRowNum, model.ExamInfoList.Count() - 1, true, false); var rowStyle = sheet.GetRow(4);//獲取當前行樣式 var xzlist = model.ExamInfoList.Where(x => x.TopicType == 1).OrderBy(x => x.Sort).ToList(); var xzsort = 1; foreach (var item in xzlist) { rownum += 1; // 新增行 var rowInsert = sheet.CreateRow(rownum); rowInsert.HeightInPoints = 80; //設定列頭行高 // 新增列 for (int i = 0; i <= 11; i++) { var sourceCell = rowStyle.GetCell(i); var cell2 = rowInsert.CreateCell(i); cell2.CellStyle = sourceCell.CellStyle; cell2.SetCellType(sourceCell.CellType); } if (rownum != 4) { // 合併行/列 sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rownum, rownum, 2, 5)); sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rownum, rownum, 6, 8)); } rowInsert.GetCell(0).SetCellValue(xzsort);//序號 xzsort += 1; rowInsert.GetCell(1).SetCellValue(item.TopicTypeStr);//型別 rowInsert.GetCell(2).SetCellValue(item.TopicContent);//考試題目 var rqvalule = item.TopicXXContent.Replace("<br>", "\n"); rowInsert.GetCell(6).SetCellValue(rqvalule);//考試選項 rowInsert.GetCell(9).SetCellValue(item.TopicAnswer);//正確選項 rowInsert.GetCell(10).SetCellValue(item.CommitTopicAnswer);//考試人選項 rowInsert.GetCell(11).SetCellValue(item.TopiResult);//考試結果 } // 合併選擇項 sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rowold, rownum, 1, 1)); var pcrowold = rownum + 1; var pclist = model.ExamInfoList.Where(x => x.TopicType == 2).OrderBy(x => x.Sort).ToList(); var pdsort = 1; foreach (var item in pclist) { rownum += 1; var rowInsert = sheet.CreateRow(rownum); rowInsert.HeightInPoints = 80; //設定列頭行高 for (int i = 0; i <= 11; i++) { var sourceCell = rowStyle.GetCell(i); var cell2 = rowInsert.CreateCell(i); cell2.CellStyle = sourceCell.CellStyle; cell2.SetCellType(sourceCell.CellType); } if (rownum != 4) { sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rownum, rownum, 2, 5)); sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rownum, rownum, 6, 8)); } rowInsert.GetCell(0).SetCellValue(pdsort);//序號 pdsort += 1; rowInsert.GetCell(1).SetCellValue(item.TopicTypeStr);//型別 rowInsert.GetCell(2).SetCellValue(item.TopicContent);//考試題目 var rqvalule = item.TopicXXContent.Replace("<br>", "\n"); rowInsert.GetCell(6).SetCellValue(rqvalule);//考試選項 rowInsert.GetCell(9).SetCellValue(item.TopicAnswer);//正確選項 rowInsert.GetCell(10).SetCellValue(item.CommitTopicAnswer);//考試人選項 rowInsert.GetCell(11).SetCellValue(item.TopiResult);//考試結果 } // 合併判斷項 sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(pcrowold, rownum, 1, 1)); } } } }
檔案模板
匯出結果