/// <summary> /// 將datatable導出為excel /// 圖片默認顯示在excel 第二行最后一列 /// </summary> /// <param name="table">數據源</param> /// <param name="excelInfo">Tuple<excel列名,datatable列名,excel列寬度></param> /// <param name="sheetName">工作簿名稱</param> /// <param name="picBytes">導出圖片字節流</param> /// <param name="mergedRegion">合並單元格信息:null不合並單元格</param> /// <returns></returns> public static MemoryStream ExportToExcel2007(DataTable table, List<Tuple<string, string, int>> excelInfo, string sheetName, byte[] picBytes, List<CellRangeAddress> mergedRegion) { MemoryStream ms = new MemoryStream(); try { using (table) { IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetName); for (int i = 0; i < excelInfo.Count; i++) { sheet.SetColumnWidth(i, excelInfo[i].Item3 * 256); } IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < excelInfo.Count; i++) { headerRow.CreateCell(i).SetCellValue(excelInfo[i].Item1); } int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); for (int i = 0; i < excelInfo.Count; i++) { dataRow.CreateCell(i).SetCellValue(row[excelInfo[i].Item2].ToString()); } rowIndex++; } //合並單元格 if (mergedRegion != null && mergedRegion.Count > 0) { foreach (CellRangeAddress cellRangeAddress in mergedRegion) { //設置一個合並單元格區域,使用上下左右定義CellRangeAddress區域 //CellRangeAddress四個參數為:起始行,結束行,起始列,結束列 sheet.AddMergedRegion(cellRangeAddress); ICellStyle style = workbook.CreateCellStyle(); //設置單元格的樣式:水平對齊居中 style.Alignment = HorizontalAlignment.Center; //將新的樣式賦給單元格 var cell = sheet.GetRow(cellRangeAddress.FirstRow).GetCell(cellRangeAddress.FirstColumn); cell.CellStyle = style; } } //插入圖片 if (picBytes != null && picBytes.Length > 0) { var row1 = 2; var col1 = excelInfo.Count + 1; /* Add Picture to Workbook, Specify picture type as PNG and Get an Index */ int pictureIdx = workbook.AddPicture(picBytes, NPOI.SS.UserModel.PictureType.PNG); //添加圖片 /* Create the drawing container */ XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch(); /* Create an anchor point */ XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 240, col1, row1, col1 + 1, row1 + 1); /* Invoke createPicture and pass the anchor point and ID */ XSSFPicture picture =(XSSFPicture)drawing.CreatePicture(anchor, pictureIdx); /* Call resize method, which resizes the image */ picture.Resize(); picBytes = null; } workbook.Write(ms); workbook.Close(); } } catch (Exception ex) { ms = null; } return ms; } /// <summary> /// 將datatable導出為excel /// 圖片默認顯示在excel 第二行最后一列 /// </summary> /// <param name="table">數據源</param> /// <param name="excelInfo">Tuple<excel列名,datatable列名,excel列寬度></param> /// <param name="sheetName">工作簿名稱</param> /// <param name="picBytes">導出圖片字節流</param> /// <param name="mergedRegion">合並單元格信息:null不合並單元格</param> /// <returns></returns> public static MemoryStream ExportToExcel97(DataTable table, List<Tuple<string, string, int>> excelInfo, string sheetName, byte[] picBytes, List<CellRangeAddress> mergedRegion) { MemoryStream ms = new MemoryStream(); try { using (table) { IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetName); for (int i = 0; i < excelInfo.Count; i++) { sheet.SetColumnWidth(i, excelInfo[i].Item3 * 256); } IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < excelInfo.Count; i++) { headerRow.CreateCell(i).SetCellValue(excelInfo[i].Item1); } int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); for (int i = 0; i < excelInfo.Count; i++) { dataRow.CreateCell(i).SetCellValue(row[excelInfo[i].Item2].ToString()); } rowIndex++; } //合並單元格 if (mergedRegion != null && mergedRegion.Count > 0) { foreach (CellRangeAddress cellRangeAddress in mergedRegion) { //設置一個合並單元格區域,使用上下左右定義CellRangeAddress區域 //CellRangeAddress四個參數為:起始行,結束行,起始列,結束列 sheet.AddMergedRegion(cellRangeAddress); ICellStyle style = workbook.CreateCellStyle(); //設置單元格的樣式:水平對齊居中 style.Alignment = HorizontalAlignment.Center; //將新的樣式賦給單元格 var cell = sheet.GetRow(cellRangeAddress.FirstRow).GetCell(cellRangeAddress.FirstColumn); cell.CellStyle = style; } } //插入圖片 if (picBytes != null && picBytes.Length > 0) { var row1 = 2; var col1 = excelInfo.Count + 1; int pictureIdx = workbook.AddPicture(picBytes, NPOI.SS.UserModel.PictureType.PNG); //添加圖片 HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 240, col1, row1, col1 + 1, row1 + 1); //圖片位置,圖片左上角為(col, row) HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx); pict.Resize(); //用圖片原始大小來顯示 picBytes = null; } workbook.Write(ms); ms.Flush(); ms.Position = 0; } } catch (Exception ex) { ms = null; } return ms; }
