Aspose.Cells 首次使用,用到模版填充數據,合併單元格,換行瀏覽器
模版格式,圖格式是最簡單的格式,但實際效果不是這種,實際效果圖如圖2app
圖2 ,注意看紅色部分,一對一是正常的,可是有一對多的訂單,就得把前面的合併居中,後面對應多行顯示spa
var templatePath = Server.MapPath(@"/Template/區域訂單列表導出模板.xlsx"); //NPOIHelper.GetTemplateToExcel(templatePath,list); Workbook workbook = new Workbook(); workbook.Open(templatePath); Cells cells= workbook.Worksheets[0].Cells; if (list != null) { int row = 1;//交易單行數 //獲取交易訂單列表 foreach (var item in list) { var startmergepos = row; //// 獲取交易訂單對應的訂單數,作合併行準備 var rowsorder = item.OrderList.Count; //合併單元格cells.Merge(1, 0, 3, 1) 參數1表明當前行,參數0表明當前行當前列即第一行第一列,參數3合併的行數,參數4合併的列數 cells.Merge(startmergepos, 0, rowsorder, 1); cells[startmergepos, 0].PutValue(item.DealCode); cells[startmergepos, 0].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center }); //設置單元格合併後垂直居中顯示 cells.Merge(startmergepos, 1, rowsorder, 1); cells[startmergepos, 1].PutValue(item.TotalProductMoney.ToString("f2")); cells[startmergepos, 1].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center }); cells.Merge(startmergepos, 2, rowsorder, 1); cells[startmergepos, 2].PutValue(item.DeliveryFee.ToString("f2")); cells[startmergepos, 2].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center }); cells.Merge(startmergepos, 3, rowsorder, 1); cells[startmergepos, 3].PutValue((item.TotalMoney-item.RealityMoney).ToString("f2")); cells[startmergepos, 3].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center }); cells.Merge(startmergepos, 4, rowsorder, 1); cells[startmergepos, 4].PutValue(item.PayMentStr); cells[startmergepos, 4].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center }); cells.Merge(startmergepos, 5, rowsorder, 1); cells[startmergepos,5].PutValue(item.PayState==0?"未付款":"已付款"); cells[startmergepos, 5].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center }); for (int i = 0; i < rowsorder; i++) { cells[row + i, 6].PutValue(item.OrderList[i].OrderId); if (item.OrderList[i].ListOrder_Items!=null&&item.OrderList[i].ListOrder_Items.Count > 0) { cells[row + i, 7].PutValue(item.OrderList[i].ListOrder_Items[0].ProductName); cells[row + i, 8].PutValue(item.OrderList[i].ListOrder_Items[0].SpecHtml); cells[row + i, 8].SetStyle(new Style() { IsTextWrapped=true}); //cells.SetRowHeight(row + i, 200);//設置單元格高度 cells[row + i, 9].PutValue(item.OrderList[i].ListOrder_Items[0].Quantity); } else { cells[row + i, 7].PutValue(""); cells[row + i, 8].PutValue(""); cells[row + i, 9].PutValue(""); } cells[row + i, 10].PutValue(item.OrderList[i].TotalMoney); cells[row + i, 11].PutValue(item.OrderList[i].UserName); cells[row + i, 12].PutValue(item.OrderList[i].DepartMentName); cells[row + i, 13].PutValue(item.OrderList[i].CreateTime.ToString("yyyy-MM-dd hh:mm:ss")); cells[row + i, 14].PutValue(item.OrderList[i].StateString); if (item.OrderList[i].IsStock == 0) { cells[row + i, 15].PutValue("生產單"); } else if (item.OrderList[i].IsStock == 1) { cells[row + i, 15].PutValue("備庫單"); } else if (item.OrderList[i].IsStock == 2) { cells[row + i, 15].PutValue("出庫單"); } } //這是合併單元格後的行數,必定注意,要加上合併的行數,否則會實現不了上圖的效果 row = startmergepos + rowsorder; } } var filename = HttpUtility.UrlEncode("區域訂單列表", System.Text.Encoding.UTF8) +DateTime.Now.ToString("yyyyMMddhhmmss")+ ".xls"; //轉換成流字節,輸出瀏覽器下載 var byti = workbook.SaveToStream().GetBuffer(); ////通知瀏覽器保存文件,其實也就是輸出到瀏覽器 Response.Clear(); Response.ContentType = "application/octet-stream"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename); Response.BinaryWrite(byti); Response.Flush(); Response.Close();
通常步驟:3d
var templatePath = Server.MapPath(@"/Template/區域訂單列表導出模板.xlsx");
一、初始化模版
Workbook workbook = new Workbook();
workbook.Open(templatePath);code
二、獲取模版的單元
Cells cells= workbook.Worksheets[0].Cells;blog
三、對不一樣的行的單元格複製it
cells[0, 0].PutValue("我是第一行第一列,也便是第一行第一個單元格");io
說一下合併單元格,這個沒捷徑可走,只能提供什麼意思,具體業務具體去合併模板
//合併單元格cells.Merge(1, 0, 3, 1) 參數1表明當前行,參數0表明當前行當前列即第一行第一列,參數3合併的行數,參數4合併的列數
cells.Merge(1, 0, 3, 1);class
設置單元格的樣式
cells[startmergepos, 1].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center });
設置單元格的高度
//cells.SetRowHeight(row + i, 200);
看一下網上其餘例子:
代碼實現:
大概意思就是模版定義好model對應的名稱,
讀取模版後,把model賦值給模版數據源,相似dataview,就是字段對應上
說話一下模版定義變量方式:&=data.ProductName,放在你要填充的單元格內
這個有必要提一下,怎麼獲取模版實際用到的列數呢,好比你表頭設置了10個字段,獲取的是10個,而不是整個表格的
cells.MaxDataColumn,這個能夠作到