1 [HttpGet] 2 public virtual ActionResult ExportExcel(string guid) 3 { 4 //1.取出緩存 5 DataTable dtTemp = (DataTable)Cache.GetCache(guid); 6 //2. 取得實際數據 7 DataTable dtDetail = new DataTable("detailDt"); 8 ManageLib manageLib = new ManageLib(); 9 manageLib.CreateListTable(dtTemp, true, false, out dtDetail); 10 11 //创建Excel文件的对象 12 NPOI.HSSF.UserModel.HSSFWorkbook workBook = new NPOI.HSSF.UserModel.HSSFWorkbook(); 13 //添加一個sheet 14 NPOI.SS.UserModel.ISheet sheet1 = workBook.CreateSheet("sheet1"); 15 16 17 //添加頭標題 18 NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0); 19 ICell cell = row1.CreateCell(0); 20 cell.SetCellValue("標題"); 21 //1.1 設置標題屬性 22 { 23 ICellStyle style = workBook.CreateCellStyle(); 24 //设置单元格的样式:水平对齐居中 25 style.Alignment = HorizontalAlignment.Center; 26 //設置單元格的樣式: 上下居中 27 style.VerticalAlignment = VerticalAlignment.Center; 28 //新建一个字体样式对象 29 IFont font = workBook.CreateFont(); 30 //设置字体加粗样式 31 font.Boldweight = short.MaxValue; 32 //設置字體字號 33 font.FontHeightInPoints = 18; 34 //使用SetFont方法将字体样式添加到单元格样式中 35 style.SetFont(font); 36 //将新的样式赋给单元格 37 cell.CellStyle = style; 38 //设置单元格的高度实际是设置其所在行高,所以要在单元格所在行上设置行高,行高设置数值好像是像素点的1 / 20,所以 * 20以便达到设置效果; 39 //设置单元格的宽度实际上是设置其所在列宽,所以要在单元格所在列上设置(列的设置在工作表上),宽度数值好像是字符的1 / 256,所以 * 256以便达到设置效果。 40 41 //设置单元格的高度 42 row1.Height = 30 * 20; 43 //设置单元格的宽度 44 //sheet1.SetColumnWidth(0, 30 * 256); 45 //合併單元格 為列寬數 46 sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtDetail.Columns.Count - 1)); 47 } 48 //1.2設置表頭 單元格屬性 49 ICellStyle style1 = workBook.CreateCellStyle(); 50 //设置单元格的样式:水平对齐居中 51 style1.Alignment = HorizontalAlignment.Center; 52 //設置單元格的樣式: 上下居中 53 style1.VerticalAlignment = VerticalAlignment.Center; 54 //新建一个字体样式对象 55 IFont font1 = workBook.CreateFont(); 56 //设置字体加粗样式 57 //font1.Boldweight = short.MaxValue; 58 //設置字體字號 59 font1.FontHeightInPoints = 11; 60 //使用SetFont方法将字体样式添加到单元格样式中 61 style1.SetFont(font1); 62 63 //1.2設置表頭 單元格屬性 64 ICellStyle style2 = workBook.CreateCellStyle(); 65 //设置单元格的样式:水平对齐居中 66 style2.Alignment = HorizontalAlignment.Center; 67 //設置單元格的樣式: 上下居中 68 style2.VerticalAlignment = VerticalAlignment.Center; 69 //新建一个字体样式对象 70 IFont font2 = workBook.CreateFont(); 71 //设置字体加粗样式 72 font2.Boldweight = short.MaxValue; 73 //設置字體字號 74 font2.FontHeightInPoints = 11; 75 //使用SetFont方法将字体样式添加到单元格样式中 76 style2.SetFont(font2); 77 78 //設置表頭 79 NPOI.SS.UserModel.IRow row2 = sheet1.CreateRow(1); 80 for (int i = 0; i < dtDetail.Columns.Count; i++) 81 { 82 row2.CreateCell(i).SetCellValue(dtDetail.Columns[i].ToString());//列頭 83 row2.Cells[i].CellStyle = style1; 84 } 85 86 //設置表體 87 for (int i = 0; i < dtDetail.Rows.Count; i++) 88 { 89 NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 2); 90 for (int j = 0; j < dtDetail.Columns.Count; j++) 91 { 92 rowtemp.CreateCell(j).SetCellValue(dtDetail.Rows[i][j].ToString());//列 93 } 94 } 95 96 //追加表體 97 //取得并加入至表尾 98 string overCollarNo = dtTemp.Rows[0]["ENCODING"].ToString(); 99 DataTable dtSignDetails = manageLib.GetSignDetails(overCollarNo, ""); 100 if (dtSignDetails != null && dtSignDetails.Rows.Count > 0) 101 { 102 NPOI.SS.UserModel.IRow rowend = sheet1.CreateRow(dtDetail.Rows.Count + 3);//間隔一列 103 rowend.CreateCell(0).SetCellValue("");//第一列為空 104 for (int i = 0; i < dtSignDetails.Rows.Count; i++) 105 { 106 rowend.CreateCell(2 * i).SetCellValue(dtSignDetails.Rows[i]["REMARK01"].ToString()); 107 rowend.CreateCell(2 * i + 1).SetCellValue(dtSignDetails.Rows[i]["REMARK02"].ToString());// 108 rowend.Cells[2 * i].CellStyle = style2; 109 rowend.Cells[2 * i + 1].CellStyle = style2; 110 } 111 } 112 //获取当前列的宽度,然后对比本列的长度,取最大值 113 //自適應寬度 114 for (int columnNum = 0; columnNum < dtDetail.Columns.Count; columnNum++) 115 { 116 int columnWidth = sheet1.GetColumnWidth(columnNum) / 256; 117 for (int rowNum = 1; rowNum < sheet1.LastRowNum + 1; rowNum++) 118 { 119 IRow currentRow; 120 //当前行未被使用过 121 if (sheet1.GetRow(rowNum) == null) 122 { 123 currentRow = sheet1.CreateRow(rowNum); 124 } 125 else 126 { 127 currentRow = sheet1.GetRow(rowNum); 128 } 129 130 if (currentRow.GetCell(columnNum) != null) 131 { 132 ICell currentCell = currentRow.GetCell(columnNum); 133 int length = Encoding.Default.GetBytes(currentCell.ToString()).Length; 134 if (columnWidth < length + 1) 135 { 136 columnWidth = length + 2; 137 } 138 } 139 } 140 sheet1.SetColumnWidth(columnNum, columnWidth * 256); 141 } 142 143 144 MemoryStream memoryStream = new MemoryStream(); 145 workBook.Write(memoryStream); 146 memoryStream.Seek(0, SeekOrigin.Begin); 147 return File(memoryStream, "application/vnd.ms-excel", $@"明細_{DateTime.Today.ToString("yyyyMMdd")}.xls"); 148 }