public class ExcelOut
{
/// <summary>
/// 导出Excel文件
/// </summary>
/// <returns></returns>
public static ResultMsg ToExcelFile(MainClass model,string ModeFilePath,string SavePath)
{
ResultMsg msg = new ResultMsg();
IWorkbook workbook = null;
ISheet sheet = null;
FileStream fs = new FileStream(ModeFilePath, FileMode.Open, FileAccess.Read);
workbook = new XSSFWorkbook(fs);
sheet = workbook.GetSheetAt(0);//获取第一个工作表
try
{
if (sheet != null)
{
int LocalRow = 1;
IRow SetThisRow = sheet.GetRow(LocalRow);
SetThisRow.Cells[7].SetCellValue(model.ThisDate.ToShortDateString()); //在第二行写入 使用日期,定普日期
LocalRow++;//第二行写入项目名称与编号
sheet.GetRow(LocalRow).Cells[1].SetCellValue(model.XinangmuMingcheng); //在第二行写入 使用日期,定普日期
sheet.GetRow(LocalRow).Cells[7].SetCellValue(model.XiangmuBianhao); //在第二行写入 使用日期,定普日期
LocalRow++;//第3行写入项目 抽取时间
sheet.GetRow(LocalRow).Cells[1].SetCellValue(model.ThisDate.ToShortTimeString()); //在第二行写入 使用日期,定普日期
sheet.GetRow(LocalRow).Cells[7].SetCellValue(model.CouquRen); //在第3行写入 时间与抽取人
LocalRow++;//第4行写入联系人 通知人
sheet.GetRow(LocalRow).Cells[1].SetCellValue(model.JianduRen); //在第4行写入 监督人
sheet.GetRow(LocalRow).Cells[7].SetCellValue(model.TongzhiRen); //在第4行写入 通知人
LocalRow += 2;//跳过第二行专业 列表\
#region 专业名称
if (model.ListZhuanye != null)
{
if (model.ListZhuanye.Count > 3) //复制行
{
//插入行
//sheet.ShiftRows(LocalRow, EndRow, model.ListZhuanye.Count - 3, true, false);
CopyRow(sheet, LocalRow, LocalRow - 1, model.ListZhuanye.Count - 3);
}
//复制行完成后插入数据
for (int i = 0; i < model.ListZhuanye.Count; i++)
{
sheet.GetRow(LocalRow).Cells[1].SetCellValue(i + 1); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[2].SetCellValue(model.ListZhuanye[i].ZhuanyeName); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[6].SetCellValue(model.ListZhuanye[i].RenCount); //在第3行写入 时间与抽取人
LocalRow++;
}
int ChaZhi = 3 - model.ListZhuanye.Count;//判断是否填满如果没有填满就强制加进去
LocalRow += ChaZhi >0 ? ChaZhi : 0;
}
else
{
LocalRow +=3;
}
#endregion
LocalRow += 1;//回避单位 列表
#region 回避单位
if (model.ListPingBi!=null)
{
if (model.ListPingBi.Count > 6) //复制行
{
CopyRow(sheet, LocalRow, LocalRow - 1, model.ListPingBi.Count - 6);
}
//复制行完成后插入数据
for (int i = 0; i < model.ListPingBi.Count; i++)
{
sheet.GetRow(LocalRow).Cells[1].SetCellValue(i + 1); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[2].SetCellValue(model.ListPingBi[i].DanweiName); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[6].SetCellValue(model.ListPingBi[i].PingBiYuanyin); //在第3行写入 时间与抽取人
LocalRow++;
}
int ChaZhi = 6 - model.ListPingBi.Count;//判断是否填满如果没有填满就强制加进去
LocalRow += ChaZhi > 0 ? ChaZhi : 0;
}
else
{
LocalRow += 6;
}
#endregion
LocalRow += 3;//回避单位 列表
#region 抽取结果
if (model.ListZhuanjia!=null)
{
if (model.ListZhuanjia.Count > 5) //复制行
{
CopyRow(sheet, LocalRow, LocalRow - 1, model.ListZhuanjia.Count - 5);
}
//复制行完成后插入数据
for (int i = 0; i < model.ListZhuanjia.Count; i++)
{
sheet.GetRow(LocalRow).Cells[0].SetCellValue(i + 1); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[1].SetCellValue(model.ListZhuanjia[i].Xingming); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[3].SetCellValue(model.ListZhuanjia[i].ZhuanyeName); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[5].SetCellValue(model.ListZhuanjia[i].LianxiFangshi); //在第3行写入 时间与抽取人
LocalRow++;
}
int ChaZhi = 5 - model.ListZhuanjia.Count;//判断是否填满如果没有填满就强制加进去
LocalRow += ChaZhi > 0 ? ChaZhi : 0;
}
else
{
LocalRow += 5;
}
#endregion
#region 附表回避单位
LocalRow += 3;//回避单位 列表
if (model.ListPingBi != null)
{
if (model.ListPingBi.Count > 14) //复制行
{
CopyRow(sheet, LocalRow, LocalRow - 1, model.ListPingBi.Count - 14);
}
//复制行完成后插入数据
for (int i = 0; i < model.ListPingBi.Count; i++)
{
sheet.GetRow(LocalRow).Cells[1].SetCellValue(i + 1); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[2].SetCellValue(model.ListPingBi[i].DanweiName); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[6].SetCellValue(model.ListPingBi[i].PingBiYuanyin); //在第3行写入 时间与抽取人
LocalRow++;
}
int ChaZhi = 14 - model.ListPingBi.Count;//判断是否填满如果没有填满就强制加进去
LocalRow += ChaZhi > 0 ? ChaZhi : 0;
}
else
{
LocalRow += 14;
}
#endregion
LocalRow += 4;//未到专家及原因
#region 未到专家及原因
if (model.ChoubuList!=null)
{
if (model.ChoubuList.Count > 7) //复制行
{
CopyRow(sheet, LocalRow, LocalRow - 1, model.ChoubuList.Count-7);
}
//复制行完成后插入数据
for (int i = 0; i < model.ChoubuList.Count; i++)
{
sheet.GetRow(LocalRow).Cells[0].SetCellValue(i + 1); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[1].SetCellValue(model.ChoubuList[i].Xingming); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[2].SetCellValue(model.ChoubuList[i].TihuanReason); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[4].SetCellValue(model.ChoubuList[i].ZhuanyeName); //在第3行写入 时间与抽取人
sheet.GetRow(LocalRow).Cells[6].SetCellValue(model.ChoubuList[i].LianxiFangshi); //在第3行写入 时间与抽取人
LocalRow++;
}
int ChaZhi = 7- model.ChoubuList.Count;//判断是否填满如果没有填满就强制加进去
LocalRow += ChaZhi > 0 ? ChaZhi : 0;
}
#endregion
FileStream streamFile = new FileStream(SavePath, FileMode.Create);
System.IO.MemoryStream streamMemory = new System.IO.MemoryStream();
workbook.Write(streamMemory);
byte[] data = streamMemory.ToArray();
// 开始写入
streamFile.Write(data, 0, data.Length);
// 清空缓冲区、关闭流
streamFile.Flush();
streamFile.Close();
workbook = null;
streamMemory.Close();
streamMemory.Dispose();
msg.Success = true;
}
else
{
msg.Success = false;
msg.ErrMsg = "未找到表格";
}
}
catch (Exception ex)
{
msg.Success = false;
msg.ErrMsg = ex.Message;
}
return msg;
}
/// <summary>
/// 复制行格式并插入指定行数
/// </summary>
/// <param name="sheet">当前sheet</param>
/// <param name="startRowIndex">起始行位置</param>
/// <param name="sourceRowIndex">模板行位置</param>
/// <param name="insertCount">插入行数</param>
public static void CopyRow(ISheet sheet, int startRowIndex, int sourceRowIndex, int insertCount)
{
IRow sourceRow = sheet.GetRow(sourceRowIndex);
int sourceCellCount = sourceRow.Cells.Count;
//1. 批量移动行,清空插入区域
sheet.ShiftRows(startRowIndex, //开始行
sheet.LastRowNum, //结束行
insertCount, //插入行总数
true, //是否复制行高
false //是否重置行高
);
int startMergeCell = -1; //记录每行的合并单元格起始位置
for (int i = startRowIndex; i < startRowIndex + insertCount; i++)
{
IRow targetRow = null;
ICell sourceCell = null;
ICell targetCell = null;
targetRow = sheet.CreateRow(i);
targetRow.Height = sourceRow.Height;//复制行高
for (int m = sourceRow.FirstCellNum; m < sourceRow.LastCellNum; m++)
{
sourceCell = sourceRow.GetCell(m);
if (sourceCell == null)
continue;
targetCell = targetRow.CreateCell(m);
targetCell.CellStyle = sourceCell.CellStyle;//赋值单元格格式
targetCell.SetCellType(sourceCell.CellType);
if ((sourceCell.IsMergedCell && !string.IsNullOrWhiteSpace(sourceCell.StringCellValue)))
{
if (startMergeCell < m - 1)//如果第一个是合并单元格并且是竖行的合并单元格就就取消合并
{
if (startMergeCell >= 0)
{
sheet.AddMergedRegion(new CellRangeAddress(i, i, startMergeCell, m - 1));
}
}
startMergeCell = m;
}
else if ((sourceCell.IsMergedCell && string.IsNullOrWhiteSpace(sourceCell.StringCellValue)) || m == sourceRow.LastCellNum - 1)
{
if (m == sourceRow.LastCellNum - 1 && startMergeCell >= 0)
{
sheet.AddMergedRegion(new CellRangeAddress(i, i, startMergeCell, m));
}
continue;
}
else
{
if (startMergeCell < m - 1)//如果第一个是合并单元格并且是竖行的合并单元格就就取消合并
{
if (startMergeCell >= 0)
{
sheet.AddMergedRegion(new CellRangeAddress(i, i, startMergeCell, m - 1));
startMergeCell = -1;
}
}
else
{
startMergeCell = -1;
}
}
}
}
}
NPOI在EXcel模板写入数据保存文件
最新推荐文章于 2024-07-29 15:07:13 发布