Aspose.Cells 首次使用,用到模版填充資料,合併單元格,換行-https://www.cnblogs.com/gylspx/p/5961070.html
Aspose.Cells 首次使用,用到模版填充資料,合併單元格,換行
Aspose.Cells 首次使用,用到模版填充資料,合併單元格,換行
模版格式,圖格式是最簡單的格式,但實際效果不是這種,實際效果圖如圖2
圖2 ,注意看紅色部分,一對一是正常的,但是有一對多的訂單,就得把前面的合併居中,後面對應多行顯示
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();
一般步驟:
var templatePath = Server.MapPath(@"/Template/區域訂單列表匯出模板.xlsx");
1、初始化模版
Workbook workbook = new Workbook();
workbook.Open(templatePath);
2、獲取模版的單元
Cells cells= workbook.Worksheets[0].Cells;
3、對不同的行的單元格複製
cells[0, 0].PutValue("我是第一行第一列,也即是第一行第一個單元格");
說一下合併單元格,這個沒捷徑可走,只能提供什麼意思,具體業務具體去合併
//合併單元格cells.Merge(1, 0, 3, 1) 引數1代表當前行,引數0代表當前行當前列即第一行第一列,引數3合併的行數,引數4合併的列數
cells.Merge(1, 0, 3, 1);
設定單元格的樣式
cells[startmergepos, 1].SetStyle(new Style() { HorizontalAlignment = TextAlignmentType.Center });
設定單元格的高度
//cells.SetRowHeight(row + i, 200);
看一下網上其他例子:
程式碼實現:
大概意思就是模版定義好model對應的名稱,
讀取模版後,把model賦值給模版資料來源,類似dataview,就是欄位對應上
說話一下模版定義變數方式:&=data.ProductName,放在你要填充的單元格內
這個有必要提一下,怎麼獲取模版實際用到的列數呢,比如你表頭設定了10個欄位,獲取的是10個,而不是整個表格的
cells.MaxDataColumn,這個可以做到