关注我,为您分享C#技术实现
public static MemoryStream DataTableToExcel(DataTable dtSource, string strHeaderText)
{
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
HSSFCellStyle cellstyle = (HSSFCellStyle)workbook.CreateCellStyle();//设置垂直居中格式
cellstyle.WrapText = true;//自动换行
cellstyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//单元格垂直对齐方式居中
cellstyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;////单元格水平对齐方式居中
#region 右击文件 属性信息
{
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "NPOI";
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
HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();
dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
//取得列宽
int[] arrColWidth = new int[dtSource.Columns.Count];
foreach (DataColumn item in dtSource.Columns)
{
arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
}
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;
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 = (HSSFSheet)workbook.CreateSheet();
}
#region 表头及样式
{
HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//居中
HSSFFont font = (HSSFFont)workbook.CreateFont();
font.FontHeightInPoints = 20;
font.Boldweight = 700;
headStyle.SetFont(font);
//headerRow.GetCell(0).CellStyle = headStyle;
//sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
////合并单元格(标题头)
//sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, dtSource.Rows.Count + 1, 0, 0));
////合并单元格(datatable的第一栏)
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 8, 42));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 1, 8, 23));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 1, 24, 41));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 8, 10));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 11, 15));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 16, 17));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 18, 20));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 24, 26));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 27, 30));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 31, 33));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 34, 37));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2, 2, 38, 40));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 0, 0));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 1, 1));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 2, 2));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 3, 3));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 4, 4));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 5, 5));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 4, 6, 6));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 3, 7, 7));
//sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(4, 4, 7, 7));
//合并单元格(datatable的第一栏)
cellstyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; //下边框线
cellstyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; //左边框线
cellstyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; //右边框线
cellstyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
}
#endregion
#region 列头及样式
{
HSSFRow headerRow = (HSSFRow)sheet.CreateRow(1);
HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
//headStyle.Alignment = CellHorizontalAlignment.CENTER;
HSSFFont font = (HSSFFont)workbook.CreateFont();
font.FontHeightInPoints = 10;
headStyle.SetFont(font);
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//居中
//设置列宽
sheet.SetColumnWidth(0, 24 * 120);
sheet.SetColumnWidth(1, 24 * 200);
sheet.SetColumnWidth(2, 24 * 240);
sheet.SetColumnWidth(3, 24 * 480);
sheet.SetColumnWidth(5, 24 * 480);
sheet.SetColumnWidth(8, 24 * 480);
sheet.SetColumnWidth(9, 24 * 480);
sheet.SetColumnWidth(10, 24 * 480);
sheet.SetColumnWidth(11, 24 * 480);
sheet.SetColumnWidth(12, 24 * 480);
sheet.SetColumnWidth(13, 24 * 480);
sheet.SetColumnWidth(14, 24 * 480);
sheet.SetColumnWidth(15, 24 * 480);
sheet.SetColumnWidth(16, 24 * 480);
sheet.SetColumnWidth(17, 24 * 480);
sheet.SetColumnWidth(18, 24 * 480);
sheet.SetColumnWidth(19, 24 * 480);
sheet.SetColumnWidth(20, 24 * 480);
sheet.SetColumnWidth(21, 24 * 480);
sheet.SetColumnWidth(22, 24 * 480);
sheet.SetColumnWidth(23, 24 * 480);
sheet.SetColumnWidth(24, 24 * 480);
sheet.SetColumnWidth(25, 24 * 480);
sheet.SetColumnWidth(26, 24 * 480);
sheet.SetColumnWidth(27, 24 * 480);
sheet.SetColumnWidth(28, 24 * 480);
sheet.SetColumnWidth(29, 24 * 480);
sheet.SetColumnWidth(30, 24 * 480);
sheet.SetColumnWidth(31, 24 * 480);
sheet.SetColumnWidth(32, 24 * 480);
sheet.SetColumnWidth(33, 24 * 480);
sheet.SetColumnWidth(34, 24 * 480);
sheet.SetColumnWidth(35, 24 * 480);
sheet.SetColumnWidth(36, 24 * 480);
sheet.SetColumnWidth(37, 24 * 480);
sheet.SetColumnWidth(38, 24 * 480);
sheet.SetColumnWidth(39, 24 * 160);
sheet.SetColumnWidth(40, 24 * 160);
sheet.SetColumnWidth(41, 24 * 160);
sheet.SetColumnWidth(42, 24 * 160);
sheet.SetColumnWidth(43, 24 * 160);
sheet.SetColumnWidth(44, 24 * 160);
sheet.SetColumnWidth(45, 24 * 160);
sheet.SetColumnWidth(46, 24 * 500);
// headerRow.Dispose();
}
#endregion
rowIndex = 0;
}
#endregion
#region 填充内容
HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
foreach (DataColumn column in dtSource.Columns)
{
HSSFCell newCell = (HSSFCell)dataRow.CreateCell(column.Ordinal);
string drValue = row[column].ToString();
switch (column.DataType.ToString())
{
case "System.String"://字符串类型
if (drValue.Contains("backcoler=read"))
{
HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightYellow.Index;
//cellstyle.FillBackgroundColor = HSSFColor.DarkRed.Index;
////很重要背景色缺一行就不好使
style.WrapText = true;//自动换行
style.FillPattern = FillPattern.SolidForeground;
newCell.CellStyle = style;
newCell.SetCellValue(drValue.Replace("backcoler=read",""));
}
else if(drValue.Contains("OK"))
{
HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;
//cellstyle.FillBackgroundColor = HSSFColor.DarkRed.Index;
////很重要背景色缺一行就不好使
style.FillPattern = FillPattern.SolidForeground;
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; //下边框线
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; //左边框线
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; //右边框线
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
newCell.CellStyle = style;
newCell.SetCellValue(drValue);
}
else
{
newCell.CellStyle = cellstyle;
newCell.SetCellValue(drValue);
}
break;
case "System.DateTime"://日期类型
System.DateTime dateV;
System.DateTime.TryParse(drValue, out dateV);
newCell.SetCellValue(dateV);
newCell.CellStyle = dateStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.CellStyle = cellstyle;
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.CellStyle = cellstyle;
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = 0;
double.TryParse(drValue, out doubV);
newCell.CellStyle = cellstyle;
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.CellStyle = cellstyle;
newCell.SetCellValue("");
break;
default:
newCell.CellStyle = cellstyle;
newCell.SetCellValue("");
break;
}
}
#endregion
rowIndex++;
}
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
}