NPOI 导出 Excel
using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Data; using System.IO; using System.Text; using System.Web; namespace Utils { public class NewExcel2Helper { #region Excel2003导出 /// <summary> /// Excel导出方法 ExportByWeb() /// </summary> /// <param name="dtSource">DataTable数据源</param> /// <param name="strHeaderText">Excel表头文本(例如:车辆列表)</param> /// <param name="strFileName">Excel文件名(例如:车辆列表.xls)</param> public static void ExportByWeb2003(System.Data.DataTable dtSource, string strHeaderText, string strFileName) { HttpContext curContext = HttpContext.Current; // 设置编码和附件格式 curContext.Response.ContentType = "application/ms-excel"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8)); //调用导出具体方法Export() curContext.Response.BinaryWrite(Export2003(dtSource, strHeaderText).GetBuffer()); curContext.Response.End(); } /// <summary> /// DataTable导出到Excel的MemoryStream Export() /// </summary> /// <param name="dtSource">DataTable数据源</param> /// <param name="strHeaderText">Excel表头文本(例如:车辆列表)</param> public static MemoryStream Export2003(System.Data.DataTable dtSource, string strHeaderText) { HSSFWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); sheet.DisplayGridlines = false;//隐藏网格线 #region 右击文件 属性信息 { DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company = "DPD"; workbook.DocumentSummaryInformation = dsi; SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); si.Author = "文件作者信息"; //填加xls文件作者信息 si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息 si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息 si.Comments = "作者信息"; //填加xls文件作者信息 si.Title = "标题信息"; //填加xls文件标题信息 si.Subject = "主题信息";//填加文件主题信息 si.CreateDateTime = System.DateTime.Now; workbook.SummaryInformation = si; } #endregion 右击文件 属性信息 ICellStyle dateStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); //取得列宽 int[] arrColWidth = new int[dtSource.Columns.Count]; foreach (DataColumn item in dtSource.Columns) { arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length + 2; } for (int i = 0; i < dtSource.Rows.Count; i++) { for (int j = 0; j < dtSource.Columns.Count; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length + 2; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } } int rowIndex = 0; foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 if (rowIndex == 65535 || rowIndex == 0) { if (rowIndex != 0) { sheet = workbook.CreateSheet(); } #region 列头及样式 { IRow headerRow = sheet.CreateRow(0); headerRow.HeightInPoints = 20;//行高 ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = HorizontalAlignment.Center; // ------------------ NPOI.SS.UserModel.IFont font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); headStyle.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground; headStyle.FillForegroundColor = 44; headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; //设置列宽 //AutoSizeColumns(sheet); //sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); //设置列宽 if (arrColWidth[column.Ordinal] > 255) { arrColWidth[column.Ordinal] = 254; } else { sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } } } #endregion 列头及样式 rowIndex = 1; } #endregion 新建表,填充表头,填充列头,样式 #region 填充内容 IRow dataRow = sheet.CreateRow(rowIndex); //dataRow.HeightInPoints = 20;//行高 foreach (DataColumn column in dtSource.Columns) { ICell newCell = dataRow.CreateCell(column.Ordinal); string drValue = row[column].ToString(); dateStyle.Alignment = HorizontalAlignment.Center; dateStyle.Alignment = HorizontalAlignment.Left; dateStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//下边框为细线边框 dateStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//左边框 dateStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//上边框 dateStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//右边框 dateStyle.WrapText = true;//设置换行这个要先设置 newCell.CellStyle = dateStyle;//格式化显示 switch (column.DataType.ToString()) { case "System.String"://字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime"://日期类型 // newCell.SetCellValue(DateTime.Parse(drValue).ToString("yyyy-MM-dd")); newCell.SetCellValue(string.IsNullOrEmpty(drValue) ? "" : DateTime.Parse(drValue).ToString("yyyy-MM-dd HH:mm:ss:ffff")); break; case "System.Boolean"://布尔型 bool boolV = false; bool.TryParse(drValue, out boolV); newCell.SetCellValue(boolV); break; case "System.Int16"://整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(drValue, out intV); newCell.SetCellValue(intV); break; case "System.Decimal"://浮点型 case "System.Double": double doubV = 0; double.TryParse(drValue, out doubV); newCell.SetCellValue(doubV); break; case "System.DBNull"://空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion 填充内容 rowIndex++; } for (int columnNum = 0; columnNum <= dtSource.Columns.Count; columnNum++) { sheet.AutoSizeColumn((short)columnNum); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position = 0; return ms; } } #endregion #region Excel2007导出 /// <summary> /// Excel导出方法 ExportByWeb() /// </summary> /// <param name="dtSource">DataTable数据源</param> /// <param name="strHeaderText">Excel表头文本(例如:车辆列表)</param> /// <param name="strFileName">Excel文件名(例如:车辆列表.xls)</param> public static void ExportByWeb2007(System.Data.DataTable dtSource, string strHeaderText, string strFileName) { HttpContext curContext = HttpContext.Current; // 设置编码和附件格式 curContext.Response.ContentType = "application/ms-excel"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8)); //调用导出具体方法Export() curContext.Response.BinaryWrite(Export2007(dtSource, strHeaderText).GetBuffer()); curContext.Response.End(); } /// <summary> /// DataTable导出到Excel的MemoryStream Export() /// </summary> /// <param name="dtSource">DataTable数据源</param> /// <param name="strHeaderText">Excel表头文本(例如:车辆列表)</param> public static MemoryStream Export2007(System.Data.DataTable dtSource, string strHeaderText) { XSSFWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); sheet.DisplayGridlines = false;//隐藏网格线 ICellStyle dateStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); //取得列宽 int[] arrColWidth = new int[dtSource.Columns.Count]; foreach (DataColumn item in dtSource.Columns) { arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length + 2; } for (int i = 0; i < dtSource.Rows.Count; i++) { for (int j = 0; j < dtSource.Columns.Count; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length + 2; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } } int rowIndex = 0; foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 if (rowIndex == 1048575 || rowIndex == 0) { if (rowIndex != 0) { sheet = workbook.CreateSheet(); } #region 列头及样式 { IRow headerRow = sheet.CreateRow(0); headerRow.HeightInPoints = 20;//行高 ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = HorizontalAlignment.Center; // ------------------ NPOI.SS.UserModel.IFont font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); headStyle.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground; headStyle.FillForegroundColor = 44; headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; //设置列宽 //AutoSizeColumns(sheet); //sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); //设置列宽 if (arrColWidth[column.Ordinal] > 255) { arrColWidth[column.Ordinal] = 254; } else { sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } } } #endregion 列头及样式 rowIndex = 1; } #endregion 新建表,填充表头,填充列头,样式 #region 填充内容 IRow dataRow = sheet.CreateRow(rowIndex); //dataRow.HeightInPoints = 20;//行高 foreach (DataColumn column in dtSource.Columns) { ICell newCell = dataRow.CreateCell(column.Ordinal); string drValue = row[column].ToString(); dateStyle.Alignment = HorizontalAlignment.Center; dateStyle.Alignment = HorizontalAlignment.Left; dateStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//下边框为细线边框 dateStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//左边框 dateStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//上边框 dateStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//右边框 dateStyle.WrapText = true;//设置换行这个要先设置 newCell.CellStyle = dateStyle;//格式化显示 switch (column.DataType.ToString()) { case "System.String"://字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime"://日期类型 // newCell.SetCellValue(DateTime.Parse(drValue).ToString("yyyy-MM-dd")); newCell.SetCellValue(string.IsNullOrEmpty(drValue) ? "" : DateTime.Parse(drValue).ToString("yyyy-MM-dd HH:mm:ss:ffff")); break; case "System.Boolean"://布尔型 bool boolV = false; bool.TryParse(drValue, out boolV); newCell.SetCellValue(boolV); break; case "System.Int16"://整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(drValue, out intV); newCell.SetCellValue(intV); break; case "System.Decimal"://浮点型 case "System.Double": double doubV = 0; double.TryParse(drValue, out doubV); newCell.SetCellValue(doubV); break; case "System.DBNull"://空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion 填充内容 rowIndex++; } for (int columnNum = 0; columnNum <= dtSource.Columns.Count; columnNum++) { sheet.AutoSizeColumn((short)columnNum); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); //ms.Position = 0; return ms; } } #endregion } }
#region XSSFWorkbook-单元格长度调整 /// <summary> /// Excel导出方法 ExportByWeb() /// </summary> /// <param name="dtSource">DataTable数据源</param> /// <param name="strHeaderText">Excel表头文本(例如:车辆列表)</param> /// <param name="strFileName">Excel文件名(例如:车辆列表.xls)</param> public static void ExportByWebXSSF(System.Data.DataTable dtSource, string strHeaderText, string strFileName) { strFileName = strFileName.Replace(".xls", "").Replace(".xlsx", ""); HttpContext curContext = HttpContext.Current; // 设置编码和附件格式 curContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xlsx"); //调用导出具体方法Export() curContext.Response.BinaryWrite(ExportXSSF(dtSource).GetBuffer()); curContext.Response.End(); } /// <summary> /// DataTable导出到Excel的MemoryStream Export() /// </summary> /// <param name="dtSource">DataTable数据源</param> public static MemoryStream ExportXSSF(System.Data.DataTable dtSource) { XSSFWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); sheet.DisplayGridlines = false;//隐藏网格线 ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = HorizontalAlignment.Center; // ------------------ NPOI.SS.UserModel.IFont font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); headStyle.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground; headStyle.FillForegroundColor = 44; headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; ICellStyle dateStyle = workbook.CreateCellStyle(); dateStyle.Alignment = HorizontalAlignment.Center; dateStyle.Alignment = HorizontalAlignment.Left; dateStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//下边框为细线边框 dateStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//左边框 dateStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//上边框 dateStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//右边框 dateStyle.WrapText = true;//设置换行这个要先设置 //IDataFormat format = workbook.CreateDataFormat(); //取得列宽 int[] arrColWidth = new int[dtSource.Columns.Count]; foreach (DataColumn item in dtSource.Columns) { arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length + 2; } int rowIndex = 0; foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 //100W分页 if (rowIndex == 1000001 || rowIndex == 0) { if (rowIndex != 0) { //单元格长度调整 foreach (DataColumn column in dtSource.Columns) { sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } sheet = workbook.CreateSheet(); } IRow headerRow = sheet.CreateRow(0); headerRow.HeightInPoints = 20;//行高 foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle;//格式化显示 } rowIndex = 1; } #endregion 新建表,填充表头,填充列头,样式 #region 填充内容 IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in dtSource.Columns) { string drValue = row[column].ToString(); //验证长度 int intTemp = Encoding.GetEncoding(936).GetBytes(drValue).Length + 2; if (intTemp > arrColWidth[column.Ordinal]) { arrColWidth[column.Ordinal] = intTemp; } ICell newCell = dataRow.CreateCell(column.Ordinal); newCell.CellStyle = dateStyle;//格式化显示 switch (column.DataType.ToString()) { case "System.String"://字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime"://日期类型 newCell.SetCellValue(string.IsNullOrEmpty(drValue) ? "" : DateTime.Parse(drValue).ToString("yyyy-MM-dd HH:mm:ss")); break; case "System.Boolean"://布尔型 bool boolV = false; bool.TryParse(drValue, out boolV); newCell.SetCellValue(boolV); break; case "System.Int16"://整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(drValue, out intV); newCell.SetCellValue(intV); break; case "System.Decimal"://浮点型 case "System.Double": double doubV = 0; double.TryParse(drValue, out doubV); newCell.SetCellValue(doubV); break; case "System.DBNull"://空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion 填充内容 rowIndex++; } //单元格长度调整 foreach (DataColumn column in dtSource.Columns) { sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); //ms.Position = 0; return ms; } } #endregion
标签:
C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?