c# npoi分批往excel追加数据

直接贴代码:

using DongYang.Core.Model.Domain;
using DongYang.Core.Utils;
using NLog;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Threading;

namespace DongYang.Core.Service
{
    public class DYTrackANODetail700013TodayNewService
    {
        private readonly Logger _logger = LogManager.GetCurrentClassLogger();//日志组件

        /// <summary>
        /// 导出excel
        /// </summary>
        /// <param name="anomateexcels"></param>
        /// <param name="currentTime"></param>
        public void ExportToExcel(List<Anomateexcel> anomateexcels, DateTime currentTime)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            FileStream file = null;
            string strBeginTime = string.Empty;//查询开始时间
            string strEndTime = string.Empty;//查询结束时间

            try
            {
                //模板文件
                string templateFileName = AppDomain.CurrentDomain.BaseDirectory + "\\template.xlsx";
                //导出文件
                string reportFileName = FileHelper.GetExportFilePath(currentTime) + $"\\{currentTime.ToString("yyyyMMdd_HHmmss")}.xlsx";
                //获取查询日期
                this.GetTime(currentTime, out strBeginTime, out strEndTime);
                //查询数据总数
                int count = this.GetDataTableCount(strBeginTime, strEndTime);
                if (count == 0) return;
                //先拷贝空文件
                File.Copy(templateFileName, reportFileName);
                //分页查询数据,在循环里面,打开拷贝的文件并追加数据,最后关闭文件句柄
                var pages = Math.Ceiling(Convert.ToDouble(count) / ConfigHelper.PageSize);
                for (int pageIndex = 1; pageIndex <= pages; pageIndex++)
                {
                    var startRow = (pageIndex - 1) * ConfigHelper.PageSize + 1;
                    var endRow = pageIndex * ConfigHelper.PageSize;
                    var dt = this.GetDataTable(strBeginTime, strEndTime, startRow, endRow);

                    file = new FileStream(reportFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    XSSFWorkbook xssfworkbook = new XSSFWorkbook(file);//将文件读到内存,在内存中操作excel
                    file.Close();
                    XSSFSheet xssfsheet = xssfworkbook.GetSheet(ConfigHelper.WorkSheetName) as XSSFSheet;

                    var beginRow = 3 + startRow - 1;
                    for (var i = 0; i < dt.Rows.Count; i++)
                    {
                        var excelRow = xssfsheet.CreateRow(beginRow++);
                        foreach (var anomateexcel in anomateexcels)
                        {
                            var excelCell = excelRow.CreateCell(anomateexcel.Excellist.ToInt());
                            excelCell.SetCellType(NPOI.SS.UserModel.CellType.String);
                            var value = dt.Rows[i][anomateexcel.Anofield].ToString();
                            excelCell.SetCellValue(value);
                        }
                    }

                    xssfsheet.ForceFormulaRecalculation = true;
                    //将内存数据写到文件
                    using (FileStream fs = File.OpenWrite(reportFileName))
                    {
                        xssfworkbook.Write(fs);
                        xssfworkbook.Close();
                    }

                    Thread.Sleep(100);
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"导出数据出错,message:{ex.Message},stackTrace:{ex.StackTrace}");
            }
            finally
            {
                if (file != null) file.Close();
            }

            sw.Stop();
            _logger.Info($"日期:{currentTime},耗时{sw.Elapsed.TotalSeconds}秒");
        }

        #region 获取开始时间和结束时间

        /// <summary>
        /// 获取开始时间和结束时间
        /// </summary>
        /// <param name="currentTime"></param>
        /// <param name="strBeginTime"></param>
        /// <param name="strEndTime"></param>
        private void GetTime(DateTime currentTime, out string strBeginTime, out string strEndTime)
        {
            DateTime beginTime;
            DateTime endTime;
            if (currentTime < currentTime.Date.AddHours(7.5))
            {
                beginTime = currentTime.Date.AddDays(-1).AddHours(7.5);//前天7:30
                endTime = currentTime.Date.AddHours(7.5);//当天的7:30
            }
            else
            {
                beginTime = currentTime.Date.AddHours(7.5);
                endTime = currentTime.Date.AddDays(1).AddHours(7.5);
            }

            strBeginTime = beginTime.ToString("yyyy-MM-dd HH:mm");
            strEndTime = endTime.ToString("yyyy-MM-dd HH:mm");
        }

        #endregion

        #region 查询数据

        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="strBeginTime"></param>
        /// <param name="strEndTime"></param>
        /// <param name="startRow"></param>
        /// <param name="endRow"></param>
        /// <returns></returns>
        private DataTable GetDataTable(string strBeginTime, string strEndTime, int startRow, int endRow)
        {
            var sql = $@"
select * from
(
    select row_number() over(order by A asc,AB asc,AC asc) as rownumber, *
    from {ConfigHelper.ExcelExportTableName}
    where E between ‘{strBeginTime}‘ and ‘{strEndTime}‘
) as t
where rownumber between {startRow} and {endRow}
";
            DataTable dt = DapperSqlHelper.QueryDataTable(sql);
            return dt;
        }

        #endregion

        #region 查询总数

        /// <summary>
        /// 查询总数
        /// </summary>
        /// <param name="strBeginTime"></param>
        /// <param name="strEndTime"></param>
        /// <returns></returns>
        private int GetDataTableCount(string strBeginTime, string strEndTime)
        {
            var sql = $"select count(1) from {ConfigHelper.ExcelExportTableName} where E between ‘{strBeginTime}‘ and ‘{strEndTime}‘";
            DataTable dt = DapperSqlHelper.QueryDataTable(sql);
            var count = Convert.ToInt32(dt.Rows[0][0]);
            return count;
        }

        #endregion
    }
}

一开始是一次性读取符合条件的数据,因为数据量大,大概七八千,而且每条记录400个字段。所以后面优化成了分页读取,每次取100条数据,然后再往excel插入数据。

原文地址:https://www.cnblogs.com/subendong/p/12109568.html

时间: 2024-11-14 12:03:11

c# npoi分批往excel追加数据的相关文章

excel追加数据

原本是想通过读取已存在的文件的行然后直接添加保存,发现结果会被覆盖. 后来查找方法发现需要复制原表. 函数参数: list:要添加的数据 filename:目标文件 sheet_index:默认表的第一个sheet def addExcel(list,filename,sheet_index=0): old_sheet=xlrd.open_workbook(filename) #读取原来的excel sheet_temp =old_sheet.sheet_by_index(sheet_index

NPOI 创建Excel,数据读取与写入

<1> using System; using System.Collections.Generic; using System.Linq; using System.Web; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.SS.Formula.Functions; using System.IO; using System.Text; namespace 导入导出Excel { /// <summary&g

java jxl 向Excel中追加数据而不覆盖原来数据的例子

向先原来就有数据的Excel写数据是不会覆盖原有的数据,只是在追加数据. public class Excel { public Excel() { } public void CreateWorkbook(File file, double[] a) { try { if (!file.exists()) { //判断文件是否已存在,如果没有存在则创建新文件 jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File("r

使用NPOI读取Excel的数据,插入到DataTable中

笔者最近遇到一个项目,需要做一个SSIS Package,修改Excel的列名,并在ssms中创建job自动执行,项目需求比较简单,由于笔者做过的Package比较少,所以经历了一番曲折. 我首先想到的是使用NPOI,在Script task中使用NPOI.dll,但是在使用NPOI时,Script task不能将NPOI自动导入到.net framework,需要执行一个gacutil的脚本,有点麻烦,放弃. 其次,我想到 Microsoft.Office.Interop.Excel.dll

《.NET学习笔记》——使用NPOI读取Excel导入数据和导出Excel的功能

前提:由于有差不多两年时间没有进行B/S项目开发了,换了新工作,项目中要求有Excel导入数据库的功能,故保存下来供以后查看. 一.使用jQuery的uploadify插件完成选择文件并上传的功能: (1)先引入相关文件: <script src="../Scripts/uploadify/swfobject.js" type="text/javascript"></script> <link href="../Scripts

POI向Excel中写入数据及追加数据

import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*; import java.util.ArrayList; import java.

Pandas写excel总结:写入多个sheet、1个sheet写入多行、向已有sheet追加数据

1.最简单最基础的写:1excel1sheet df.to_excel("test.xlxs") 2.在一个excel文件里面写入多个sheet writer=pd.ExcelWriter('filename.xlsx') ... df1.to_excel(writer,sheet_name='第一表',index=0) df2.to_excel(writer,sheet_name='第二表',index=0) #index=0:无索引 writer.save() writer.clo

NPOI Excel导出数据信息

1.这里引用的是   NPOI1.2.5.0版本. 2.导入命名空间 using NPOI.HSSF.UserModel;using NPOI.HPSF;using NPOI.SS.UserModel;using NPOI.SS.Util; 3.新建一个导出类,直接将代码复制过去即可使用. #region 通过NPOI组件导出EXCEL        private static HSSFWorkbook hssfworkbook; public class CommentModel      

NPOI操作EXCEL(三)——反射机制进行excel表格数据的解析

我们先来回忆回忆上篇文章讲到的通过xml配置文件实现excel批量模板解析的整体思路: 1.对每个excel模板制定xml配置规则集,实现xml配置文件的解析服务 2.为每个excel模板制定DTO,继承于一个BaseDTO 3.实现两个工厂方法,一是获取某excel模板xml配置文件路径:一是获取某excel模板DTO对象 4.EXCEL工具类对外暴露两个接口,一是数据验证接口,返回整个excel所有错误单元格信息:一是数据解析接口,读取单元格数据到DTO.通过构造方法传入配置文件 5.整体流