using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Data; using System.Text; using NPOI; using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using NPOI.SS.UserModel; using NPOI.POIFS; using NPOI.Util; namespace DSWeb.EntityDA { public class ExcelDA { #region 导出标准excel /// /// 导出标准excel /// /// 数据集 /// 表头 /// public static MemoryStream RenderToExcel(DataTable table, string strTitle) { MemoryStream ms = new MemoryStream(); using (table) { IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); IRow headerRow = sheet.CreateRow(0); //ICell icell1top0 = headerRow.CreateCell(0); //icell1top0.CellStyle = Getcellstyle(workbook, stylexls.头); // //定义几种字体,也可以一种字体,写一些公共属性,然后在下面需要时加特殊的 IFont font12 = workbook.CreateFont(); font12.FontHeightInPoints = 12; font12.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 //font12.Color = NPOI.HSSF.Util.HSSFColor.WHITE.index;//白色前景色 IFont font10 = workbook.CreateFont(); font10.FontHeightInPoints = 10; font10.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 //font10.Color = NPOI.HSSF.Util.HSSFColor.WHITE.index;//白色前景色 //font.Underline = 1;下划线 // for (int j = 0; j < table.Columns.Count; j++) { headerRow.Height = 25 * 20; //- 创建当前 row 指定列索引的 cell ICellStyle cell = headerRow.CreateCell(j).CellStyle;//- 标题行 //- 设置这个样式的字体,如果没有设置,将与所有单元格拥有共同字体! cell.SetFont(font12); //- 很费解 FillForegroundColor 这个属性,我设置了是背景色,可从字义上来说,这个似乎叫“前景色”? //- 更令人无语的是,还有 FillBackgroundColor 属性。真不知道做什么的。 //背景图形 cell.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; cell.FillForegroundColor = HSSFColor.OLIVE_GREEN.WHITE.index; //- 这个是填充的模式,可以是网格、花式等。如果需要填充单色,请使用:SOLID_FOREGROUND // cellStyle.FillPattern = FillPatternType.NO_FILL; cell.FillPattern = FillPatternType.SOLID_FOREGROUND; //- 居中 cell.VerticalAlignment = VerticalAlignment.CENTER; cell.Alignment = HorizontalAlignment.CENTER; //- 细边缘 cell.BorderBottom = BorderStyle.THIN; cell.BorderLeft = BorderStyle.THIN; cell.BorderRight = BorderStyle.THIN; cell.BorderTop = BorderStyle.THIN; cell.BottomBorderColor = HSSFColor.BLACK.index; cell.LeftBorderColor = HSSFColor.BLACK.index; cell.RightBorderColor = HSSFColor.BLACK.index; cell.TopBorderColor = HSSFColor.BLACK.index; } // if (strTitle.Trim() == "") { for (int i = 0; i < table.Columns.Count; i++) { headerRow.CreateCell(i).SetCellValue(table.Columns[i].Caption.ToString().Trim()); } } else { string[] txtval = strTitle.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < txtval.Length; i++) { headerRow.CreateCell(i).SetCellValue(txtval[i].ToString().Trim()); } } //// //foreach (DataColumn column in table.Columns) //{ // //导入内容 // headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption); //} // for (int i = 1; i < table.Rows.Count; i++) { for (int k = 0; k < table.Columns.Count; k++) { IRow headerRow1 = sheet.CreateRow(i); //ICell icell1top1 = headerRow1.CreateCell(k); //icell1top1.CellStyle = Getcellstyle(workbook, stylexls.默认); //- 创建当前 row 指定列索引的 cell sheet.SetColumnWidth(k, 30 * 256); //sheet.AutoSizeColumn(k);  //会按照值的长短 自动调节列的大小,但是数据量大,会陷入死循环 ICellStyle cell = headerRow1.CreateCell(k).CellStyle;// // //- 设置这个样式的字体,如果没有设置,将与所有单元格拥有共同字体! cell.SetFont(font10); ////- 很费解 FillForegroundColor 这个属性,我设置了是背景色,可从字义上来说,这个似乎叫“前景色”? ////- 更令人无语的是,还有 FillBackgroundColor 属性。真不知道做什么的。 ////背景图形 ////cell.CellStyle.FillBackgroundColor = HSSFColor.WHITE.index; ////cell.CellStyle.FillForegroundColor = HSSFColor.ORANGE.index; ////- 这个是填充的模式,可以是网格、花式等。如果需要填充单色,请使用:SOLID_FOREGROUND cell.FillPattern = FillPatternType.NO_FILL; ////cell.CellStyle.FillPattern = FillPatternType.SOLID_FOREGROUND; //- 居中 cell.VerticalAlignment = VerticalAlignment.CENTER; cell.Alignment = HorizontalAlignment.LEFT; //- 细边缘 cell.BorderBottom = BorderStyle.THIN; cell.BorderLeft = BorderStyle.THIN; cell.BorderRight = BorderStyle.THIN; cell.BorderTop = BorderStyle.THIN; cell.BottomBorderColor = HSSFColor.BLACK.index; cell.LeftBorderColor = HSSFColor.BLACK.index; cell.RightBorderColor = HSSFColor.BLACK.index; cell.TopBorderColor = HSSFColor.BLACK.index; } } // int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns) { //导出内容 dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; } return ms; } public static MemoryStream RenderToExcel(DataTable table, string strTitle ,int startsheet) { MemoryStream ms = new MemoryStream(); using (table) { IWorkbook workbook = new HSSFWorkbook(); for ( var _i = 0; _i < startsheet;_i++ ) { ISheet sheet_0 = workbook.CreateSheet(); } ISheet sheet = workbook.CreateSheet(); IRow headerRow = sheet.CreateRow(0); //ICell icell1top0 = headerRow.CreateCell(0); //icell1top0.CellStyle = Getcellstyle(workbook, stylexls.头); // //定义几种字体,也可以一种字体,写一些公共属性,然后在下面需要时加特殊的 IFont font12 = workbook.CreateFont(); font12.FontHeightInPoints = 12; font12.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 //font12.Color = NPOI.HSSF.Util.HSSFColor.WHITE.index;//白色前景色 IFont font10 = workbook.CreateFont(); font10.FontHeightInPoints = 10; font10.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 //font10.Color = NPOI.HSSF.Util.HSSFColor.WHITE.index;//白色前景色 //font.Underline = 1;下划线 // for (int j = 0; j < table.Columns.Count; j++) { headerRow.Height = 25 * 20; //- 创建当前 row 指定列索引的 cell ICellStyle cell = headerRow.CreateCell(j).CellStyle;//- 标题行 //- 设置这个样式的字体,如果没有设置,将与所有单元格拥有共同字体! cell.SetFont(font12); //- 很费解 FillForegroundColor 这个属性,我设置了是背景色,可从字义上来说,这个似乎叫“前景色”? //- 更令人无语的是,还有 FillBackgroundColor 属性。真不知道做什么的。 //背景图形 cell.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; cell.FillForegroundColor = HSSFColor.OLIVE_GREEN.WHITE.index; //- 这个是填充的模式,可以是网格、花式等。如果需要填充单色,请使用:SOLID_FOREGROUND // cellStyle.FillPattern = FillPatternType.NO_FILL; cell.FillPattern = FillPatternType.SOLID_FOREGROUND; //- 居中 cell.VerticalAlignment = VerticalAlignment.CENTER; cell.Alignment = HorizontalAlignment.CENTER; //- 细边缘 cell.BorderBottom = BorderStyle.THIN; cell.BorderLeft = BorderStyle.THIN; cell.BorderRight = BorderStyle.THIN; cell.BorderTop = BorderStyle.THIN; cell.BottomBorderColor = HSSFColor.BLACK.index; cell.LeftBorderColor = HSSFColor.BLACK.index; cell.RightBorderColor = HSSFColor.BLACK.index; cell.TopBorderColor = HSSFColor.BLACK.index; } // string[] txtval = strTitle.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < txtval.Length; i++) { headerRow.CreateCell(i).SetCellValue(txtval[i].ToString().Trim()); } //// //foreach (DataColumn column in table.Columns) //{ // //导入内容 // headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption); //} // for (int i = 1; i < table.Rows.Count; i++) { for (int k = 0; k < table.Columns.Count; k++) { IRow headerRow1 = sheet.CreateRow(i); //ICell icell1top1 = headerRow1.CreateCell(k); //icell1top1.CellStyle = Getcellstyle(workbook, stylexls.默认); //- 创建当前 row 指定列索引的 cell sheet.SetColumnWidth(k, 30 * 256); //sheet.AutoSizeColumn(k);  //会按照值的长短 自动调节列的大小,但是数据量大,会陷入死循环 ICellStyle cell = headerRow1.CreateCell(k).CellStyle;// // //- 设置这个样式的字体,如果没有设置,将与所有单元格拥有共同字体! cell.SetFont(font10); ////- 很费解 FillForegroundColor 这个属性,我设置了是背景色,可从字义上来说,这个似乎叫“前景色”? ////- 更令人无语的是,还有 FillBackgroundColor 属性。真不知道做什么的。 ////背景图形 ////cell.CellStyle.FillBackgroundColor = HSSFColor.WHITE.index; ////cell.CellStyle.FillForegroundColor = HSSFColor.ORANGE.index; ////- 这个是填充的模式,可以是网格、花式等。如果需要填充单色,请使用:SOLID_FOREGROUND cell.FillPattern = FillPatternType.NO_FILL; ////cell.CellStyle.FillPattern = FillPatternType.SOLID_FOREGROUND; //- 居中 cell.VerticalAlignment = VerticalAlignment.CENTER; cell.Alignment = HorizontalAlignment.LEFT; //- 细边缘 cell.BorderBottom = BorderStyle.THIN; cell.BorderLeft = BorderStyle.THIN; cell.BorderRight = BorderStyle.THIN; cell.BorderTop = BorderStyle.THIN; cell.BottomBorderColor = HSSFColor.BLACK.index; cell.LeftBorderColor = HSSFColor.BLACK.index; cell.RightBorderColor = HSSFColor.BLACK.index; cell.TopBorderColor = HSSFColor.BLACK.index; } } // int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns) { //导出内容 dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; } return ms; } public static void RenderToBrowser(MemoryStream ms, HttpContext context, string fileName) { if (context.Request.Browser.Browser == "IE") fileName = HttpUtility.UrlEncode(fileName); context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName); context.Response.BinaryWrite(ms.ToArray()); } #region 定义单元格常用到样式的枚举 public enum stylexls { 头, url, 时间, 数字, 钱, 百分比, 中文大写, 科学计数法, 默认 } #endregion #region 定义单元格常用到样式 static ICellStyle Getcellstyle(IWorkbook wb, stylexls str) { ICellStyle cellStyle = wb.CreateCellStyle(); //定义几种字体 //也可以一种字体,写一些公共属性,然后在下面需要时加特殊的 IFont font12 = wb.CreateFont(); font12.FontHeightInPoints = 12; font12.FontName = "微软雅黑"; font12.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 IFont font = wb.CreateFont(); font.FontHeightInPoints = 10; font.FontName = "微软雅黑"; //font.Underline = 1;下划线 IFont fontcolorblue = wb.CreateFont(); fontcolorblue.Color = HSSFColor.OLIVE_GREEN.BLUE.index; fontcolorblue.IsItalic = true;//下划线 fontcolorblue.FontName = "微软雅黑"; //边框 cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.HAIR; cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.HAIR; cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.HAIR; cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.HAIR; //边框颜色 cellStyle.BottomBorderColor = HSSFColor.OLIVE_GREEN.BLACK.index; cellStyle.TopBorderColor = HSSFColor.OLIVE_GREEN.BLACK.index; //背景图形,我没有用到过。感觉很丑 //cellStyle.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; //cellStyle.FillForegroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; cellStyle.FillForegroundColor = HSSFColor.WHITE.index; // cellStyle.FillPattern = FillPatternType.NO_FILL; cellStyle.FillBackgroundColor = HSSFColor.BLUE.index; //水平对齐 cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.LEFT; //垂直对齐 cellStyle.VerticalAlignment = VerticalAlignment.CENTER; //自动换行 cellStyle.WrapText = true; //缩进;当设置为1时,前面留的空白太大了。希旺官网改进。或者是我设置的不对 cellStyle.Indention = 0; //上面基本都是设共公的设置 //下面列出了常用的字段类型 switch (str) { case stylexls.头: // cellStyle.FillPattern = FillPatternType.LEAST_DOTS; cellStyle.SetFont(font12); break; case stylexls.时间: IDataFormat datastyle = wb.CreateDataFormat(); cellStyle.DataFormat = datastyle.GetFormat("yyyy/mm/dd"); cellStyle.SetFont(font); break; case stylexls.数字: cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00"); cellStyle.SetFont(font); break; case stylexls.钱: IDataFormat format = wb.CreateDataFormat(); cellStyle.DataFormat = format.GetFormat("¥#,##0"); cellStyle.SetFont(font); break; case stylexls.url: fontcolorblue.Underline = 1; cellStyle.SetFont(fontcolorblue); break; case stylexls.百分比: cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%"); cellStyle.SetFont(font); break; case stylexls.中文大写: IDataFormat format1 = wb.CreateDataFormat(); cellStyle.DataFormat = format1.GetFormat("[DbNum2][$-804]0"); cellStyle.SetFont(font); break; case stylexls.科学计数法: cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00"); cellStyle.SetFont(font); break; case stylexls.默认: cellStyle.SetFont(font); break; } return cellStyle; } #endregion #endregion #region NPOI导出Excel表功能实现(多个工作簿) public static MemoryStream RenderToExcel(MemoryStream ms, IWorkbook workbook, DataTable table, string strTitle, string sheetname, int n) { //MemoryStream ms = new MemoryStream(); using (table) { //IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetname); IRow headerRow = sheet.CreateRow(0); //定义几种字体,也可以一种字体,写一些公共属性,然后在下面需要时加特殊的 IFont font12 = workbook.CreateFont(); font12.FontHeightInPoints = 12; font12.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 IFont font10 = workbook.CreateFont(); font10.FontHeightInPoints = 10; font10.Boldweight = (short)FontBoldWeight.BOLD;//- 加粗 // for (int j = 0; j < table.Columns.Count; j++) { headerRow.Height = 25 * 20; //- 创建当前 row 指定列索引的 cell ICellStyle cell = headerRow.CreateCell(j).CellStyle;//- 标题行 cell.SetFont(font12); //背景图形 cell.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; cell.FillForegroundColor = HSSFColor.OLIVE_GREEN.WHITE.index; cell.FillPattern = FillPatternType.SOLID_FOREGROUND; //- 居中 cell.VerticalAlignment = VerticalAlignment.CENTER; cell.Alignment = HorizontalAlignment.CENTER; //- 细边缘 cell.BorderBottom = BorderStyle.THIN; cell.BorderLeft = BorderStyle.THIN; cell.BorderRight = BorderStyle.THIN; cell.BorderTop = BorderStyle.THIN; cell.BottomBorderColor = HSSFColor.BLACK.index; cell.LeftBorderColor = HSSFColor.BLACK.index; cell.RightBorderColor = HSSFColor.BLACK.index; cell.TopBorderColor = HSSFColor.BLACK.index; } // string[] txtval = strTitle.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < txtval.Length; i++) { headerRow.CreateCell(i).SetCellValue(txtval[i].ToString().Trim()); } for (int i = 1; i < table.Rows.Count; i++) { for (int k = 0; k < table.Columns.Count; k++) { IRow headerRow1 = sheet.CreateRow(i); //- 创建当前 row 指定列索引的 cell sheet.SetColumnWidth(k, 30 * 256); ICellStyle cell = headerRow1.CreateCell(k).CellStyle;// cell.SetFont(font10); cell.FillPattern = FillPatternType.NO_FILL; //- 居中 cell.VerticalAlignment = VerticalAlignment.CENTER; cell.Alignment = HorizontalAlignment.LEFT; //- 细边缘 cell.BorderBottom = BorderStyle.THIN; cell.BorderLeft = BorderStyle.THIN; cell.BorderRight = BorderStyle.THIN; cell.BorderTop = BorderStyle.THIN; cell.BottomBorderColor = HSSFColor.BLACK.index; cell.LeftBorderColor = HSSFColor.BLACK.index; cell.RightBorderColor = HSSFColor.BLACK.index; cell.TopBorderColor = HSSFColor.BLACK.index; } } // int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns) { //导出内容 dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } //foreach (DataRow dr in dtSource.Rows) //{ // rowCount++; // //超出10000条数据 创建新的工作簿 // if (rowCount == 10000) // { // rowCount = 1; // sheetCount++; // newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); // //循环导出列 // foreach (System.Collections.DictionaryEntry de in ListColumnsName) // { // HSSFRow newRow = excelSheet.CreateRow(0); // HSSFCell newCell = newRow.CreateCell(cellIndex); // newCell.SetCellValue(de.Value.ToString()); // cellIndex++; // } // //end // } // HSSFRow newRow = newsheet.CreateRow(rowCount); // InsertCell(dtSource, dr, newRow, newsheet, excelWorkbook); //} workbook.Write(ms); ms.Flush(); ms.Position = n; } return ms; } #endregion } }