110,534
社区成员
发帖
与我相关
我的任务
分享
//thName table列名; excelName excel存取路径; key 单号在第几列
public void ExportExcel(DataTable dt, string thName, string excelName, int key)
{
string[] thNameArr = thName.Split(',');//我传的table列名
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet(); //上面两个都不知道作用,看下面感觉sheet是列
IRow dataRow = sheet.CreateRow(0); //excel0行
//设置单元格的样式:水平对齐居中
ICellStyle style = workbook.CreateCellStyle();
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
//填充表头
for (int i = 0; i < dt.Columns.Count; i++)
{
dataRow.CreateCell(i).SetCellValue(thNameArr[i].ToString());
// dataRow 0行;CreateCell(i) i列;SetCellValue 赋值
}
//填充内容
for (int i = 0; i < dt.Rows.Count; i++)
{
dataRow = sheet.CreateRow(i + 1); 去掉表头行
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell icell = dataRow.CreateCell(j);//单元格
icell.SetCellValue(dt.Rows[i][j].ToString()); //单元格赋值
icell.CellStyle = style; //单元格样式,表头单独样式怎么写?
if (i + 1 != dt.Rows.Count && key != 999) //合并的条件
{
if (dt.Rows[i][key].ToString() == dt.Rows[i + 1][key].ToString() && dt.Rows[i][j].ToString() == dt.Rows[i + 1][j].ToString())
{
//CellRangeAddress(合并单元格)四个参数为:起始行,结束行,起始列,结束列
sheet.AddMergedRegion(new CellRangeAddress(i + 1, i + 2, j, j));
}
}
}
}
//列宽自适应,只对英文和数字有效
for (int i = 0; i <= dt.Rows.Count; i++)
{
sheet.AutoSizeColumn(i);
}
//保存
using (FileStream fs = new FileStream(excelName, FileMode.Create, FileAccess.Write))
{
workbook.Write(fs);
fs.Dispose(); //关闭文档
}
//FileMode.Create, FileAccess.Write 这两个参数是什么
}