NPOI在EXcel模板写入数据保存文件

 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;
                        }

                    }
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值