首先引用NPOI包
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
注意: NPOI创建的Excel的坐标是从0开始
/// <summary>
/// datatable导出Excel
/// </summary>
/// <param name="dt">table</param>
/// <param name="date">时间</param>
public static void getdata(DataTable dt, string date)
{
IWorkbook excel = new HSSFWorkbook();//创建.xls文件
ISheet sheet = excel.CreateSheet("sheet1"); //创建sheet
//row给它创建坐标为0的行数 对应excel中第一行
IRow row = sheet.CreateRow(0);//创建行对象,填充表头
//第一行的第一列为作业类型
row.CreateCell(0).SetCellValue("作业类型");
//第一行的第二列为作业地点
row.CreateCell(1).SetCellValue("作业地点");
//以此类推.....
row.CreateCell(2).SetCellValue("作业开始时间");
row.CreateCell(3).SetCellValue("作业结束时间");
row.CreateCell(4).SetCellValue("是否承包商作业");
row.CreateCell(5).SetCellValue("施工单位/人员");
row.CreateCell(6).SetCellValue("项目负责人");
row.CreateCell(7).SetCellValue("联系方式");
row.CreateCell(8).SetCellValue("作业内容");
//填充内容,j从1开始,屏蔽掉第一列,循环读取
//现在是正常获取的数据 未屏蔽列
//获取table的总行数
for (int i = 0; i < dt.Rows.Count; i++)
{
//标题头 已经创建好 开始创建数据 sheet1表 创建坐标为1的行数 对应excel的第二行
//循环行数 直到table的行数
row = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
//创建好的行数 赋值为对应的列
//第二行的第一列为 对应的table的值
row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
//会调整列的宽度以适应这些内容
sheet.AutoSizeColumn(j);
}
}
//写入文件
string DesktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
FileStream xlsfile = new FileStream(DesktopPath + @"\作业票信息" + date + ".xls", FileMode.Create);
//将excel写入到对应的地址
excel.Write(xlsfile);
xlsfile.Close();
}
最后效果
第一行是创建的表头 第二行是循环datatable拿到的数据
![]()