一种快捷导出大量数据至excel文件的系统及方法与流程

未命名 10-09 阅读:94 评论:0


1.本发明属于计算机程序控制技术领域,具体涉及一种快捷导出大量数据至excel文件的系统及方法。


背景技术:

2.现有技术中,几乎所有计算机系统都需要时常查看具体数据情况,所以需要将数据导出至excel文档以方便查阅。
3.但是很多行业涉及的数据量较大,所以一次性导出的数据非常多,实时的一次性导出数据会很慢,影响用户体验;而如果将这些数据分开导出便会产生许多单独的excel文件,使用起来并不方便。此为现有技术的不足之处。
4.有鉴于此,本发明提供一种快捷导出大量数据至excel文件的系统及方法,以解决现有技术中存在的上述缺陷,是非常有必要的。


技术实现要素:

5.本发明的目的在于,针对上述现有技术存在的缺陷,提供设计一种快捷导出大量数据至excel文件的系统及方法,以解决上述技术问题。
6.为实现上述目的,本发明给出以下技术方案:一种快捷导出大量数据至excel文件的系统,包括:创建导出任务模块,该模块根据设定的单任务数据处理量计算任务数量,然后将每个任务对应的数据编号范围传入线程中,启动线程任务;多线程处理模块,该模块中线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;任务监听模块,该模块中通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;excel文件下载模块,该模块中在所有子线程任务结束后完整的excel文件便保存在本次任务的存储空间内,直接下载excel文件。
7.作为优选,所述的创建导出任务模块中,首先,查询数据总量,根据设定的单任务数据处理量计算任务数量,建立多线程处理任务,同时在内存中建立储存空间用于储存各个任务导出的excel数据以及每个任务运行的状态;然后建立线程,将每个任务对应的数据编号范围传入线程中,启动线程任务。
8.作为优选,所述的多线程处理模块中,通过以下代码实现:parameterset ps = new parameterset();dataset ds = null;
int pagetotal =(total-(page*pagenum)《pagenum)?(total-(page*pagenum)):pagenum;int length = pagetotal % querynum == 0 ? (pagetotal / querynum) : (pagetotal / querynum + 1);for (int i = 0; i《length; i++) {int s = start + (page * pagenum) + (i * querynum);int l = (pagetotal
ꢀ‑ꢀ
(i * querynum))《querynum ? (pagetotal
ꢀ‑ꢀ
(i * querynum)) : querynum;ps.setparameter("start", s);ps.setparameter("limit", l);ps.setparameter("fill_unit_id", unitid);ps.setsortfield("operate_time");ds = ordinarygasbottleservice.queryinfo(ps);record r = null;for (int index = 0, count = ds.getcount(); index《count; index++) {try {sxssfrow headrow = (sxssfrow) sheet.createrow((i * querynum) + index + 1);//(page * pagenum) +r = ds.getrecord(index);for (int j = 0, size = list.size(); j《size; j++) {sxssfcell headrowcell= (sxssfcell) headrow.createcell(j)。
9.作为优选,所述的任务监听模块中,通过以下代码实现:public void checkexcel() {string exportcode = (string) getparameter("exportcode");list《hashmap《string,object》》list = gasexportinfoutil.getinstance().getforthreadcode(exportcode);for(int i = 0;i《list.size();i++){if(!"end".equals((string)list.get(i).get("result"))){this.setreturn("result", (string)list.get(i).get("result"));return;}}this.setreturn("result", "end");}。
10.作为优选,所述的excel文件下载模块中,通过以下代码实现:public void uploadexcel() {string filename = (string) getrequest().getparameter("filename");string exportcode = (string) getrequest().getparameter("exportcode");sxssfworkbook wb = gasexportinfoutil.getinstance().getworkbook
(exportcode);gasexportinfoutil.getinstance().cleanforthreadcode(exportcode);httpservletresponse response = commandcontext.getresponse();try {response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("excel" + filename + ".xlsx", "utf-8") + ";filename*=utf-8''" + urlencoder.encode("气瓶信息" + filename + ".xlsx", "utf-8"));} catch (unsupportedencodingexception e1) {// todo auto-generated catch blockif (logger.iserrorenabled()) {logger.error("setheader错误!", e1);}throw new businessexception("setheader错误!", e1);}// 设置下载的文件名outputstream outputstream = null;try {outputstream = response.getoutputstream();wb.write(outputstream);} catch (exception e) {if (logger.iserrorenabled()) {logger.error("输出流错误!", e);}throw new businessexception("输出流错误!", e);} finally {if (null != wb) {try {wb.dispose();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("workbook处理错误!", e);}throw new businessexception("workbook处理错误!", e);}}if (null != outputstream) {try {outputstream.close();} catch (exception e) {if (logger.iserrorenabled()) {
logger.error("outputstream关闭错误!", e);}throw new businessexception("outputstream关闭错误!", e);}}}}。
11.本发明还提供一种快捷导出大量数据至excel文件的方法,包括以下步骤:步骤s1:创建导出任务的步骤,该步骤根据设定的单任务数据处理量计算任务数量,然后将每个任务对应的数据编号范围传入线程中,启动线程任务;步骤s2:多线程处理的步骤,该步骤中线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;步骤s3:任务监听的步骤,该步骤中通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;步骤s4:excel文件下载的步骤,该步骤中在所有子线程任务结束后完整的excel文件便保存在本次任务的存储空间内,直接下载excel文件。
12.作为优选,所述的步骤s1中,首先,查询数据总量,根据设定的单任务数据处理量计算任务数量,建立多线程处理任务,同时在内存中建立储存空间用于储存各个任务导出的excel数据以及每个任务运行的状态;然后建立线程,将每个任务对应的数据编号范围传入线程中,启动线程任务。
13.作为优选,所述的步骤s2中,通过以下代码实现:parameterset ps = new parameterset();dataset ds = null;int pagetotal =(total-(page*pagenum)《pagenum)?(total-(page*pagenum)):pagenum;int length = pagetotal % querynum == 0 ? (pagetotal / querynum) : (pagetotal / querynum + 1);for (int i = 0; i《length; i++) {int s = start + (page * pagenum) + (i * querynum);int l = (pagetotal
ꢀ‑ꢀ
(i * querynum))《querynum ? (pagetotal
ꢀ‑ꢀ
(i * querynum)) : querynum;ps.setparameter("start", s);ps.setparameter("limit", l);ps.setparameter("fill_unit_id", unitid);ps.setsortfield("operate_time");ds = ordinarygasbottleservice.queryinfo(ps);
record r = null;for (int index = 0, count = ds.getcount(); index《count; index++) {try {sxssfrow headrow = (sxssfrow) sheet.createrow((i * querynum) + index + 1);//(page * pagenum) +r = ds.getrecord(index);for (int j = 0, size = list.size(); j《size; j++) {sxssfcell headrowcell= (sxssfcell) headrow.createcell(j)。
14.作为优选,所述的步骤s3中,通过以下代码实现:public void checkexcel() {string exportcode = (string) getparameter("exportcode");list《hashmap《string,object》》list = gasexportinfoutil.getinstance().getforthreadcode(exportcode);for(int i = 0;i《list.size();i++){if(!"end".equals((string)list.get(i).get("result"))){this.setreturn("result", (string)list.get(i).get("result"));return;}}this.setreturn("result", "end");}作为优选,所述的步骤s4中,通过以下代码实现:public void uploadexcel() {string filename = (string) getrequest().getparameter("filename");string exportcode = (string) getrequest().getparameter("exportcode");sxssfworkbook wb = gasexportinfoutil.getinstance().getworkbook(exportcode);gasexportinfoutil.getinstance().cleanforthreadcode(exportcode);httpservletresponse response = commandcontext.getresponse();try {response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("excel" + filename + ".xlsx", "utf-8") + ";filename*=utf-8''" + urlencoder.encode("气瓶信息" + filename + ".xlsx", "utf-8"));} catch (unsupportedencodingexception e1) {// todo auto-generated catch blockif (logger.iserrorenabled()) {logger.error("setheader错误!", e1);}throw new businessexception("setheader错误!", e1);
}// 设置下载的文件名outputstream outputstream = null;try {outputstream = response.getoutputstream();wb.write(outputstream);} catch (exception e) {if (logger.iserrorenabled()) {logger.error("输出流错误!", e);}throw new businessexception("输出流错误!", e);} finally {if (null != wb) {try {wb.dispose();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("workbook处理错误!", e);}throw new businessexception("workbook处理错误!", e);}}if (null != outputstream) {try {outputstream.close();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("outputstream关闭错误!", e);}throw new businessexception("outputstream关闭错误!", e);}}}}。
15.本发明的有益效果在于,通过本技术提供的技术方案,能够提高导出大量数据的效率,同时大量数据能够一次性导出而无需分不同文件导出,并且能够随时监听运行状态。
16.此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。
17.由此可见,本发明与现有技术相比,具有突出的实质性特点和显著地进步,其实施的有益效果也是显而易见的。
附图说明
18.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
19.图1是本发明提供的一种快捷导出大量数据至excel文件的系统的原理框图。
20.图2是本发明提供的一种快捷导出大量数据至excel文件的方法的流程图。
21.其中,1-创建导出任务模块,2-多线程处理模块,3-任务监听模块,4-excel文件下载模块。
具体实施方式
22.下面结合附图并通过具体实施例对本发明进行详细阐述,以下实施例是对本发明的解释,而本发明并不局限于以下实施方式。
23.实施例1:如图1所示,本实施例提供的一种快捷导出大量数据至excel文件的系统,包括:创建导出任务模块1,该模块根据设定的单任务数据处理量计算任务数量,然后将每个任务对应的数据编号范围传入线程中,启动线程任务;所述的创建导出任务模块1中,首先,查询数据总量,根据设定的单任务数据处理量计算任务数量,建立多线程处理任务,同时在内存中建立储存空间用于储存各个任务导出的excel数据以及每个任务运行的状态;然后建立线程,将每个任务对应的数据编号范围传入线程中,启动线程任务。
24.多线程处理模块2,该模块中线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;所述的多线程处理模块2中,通过以下代码实现:parameterset ps = new parameterset();dataset ds = null;int pagetotal =(total-(page*pagenum)《pagenum)?(total-(page*pagenum)):pagenum;int length = pagetotal % querynum == 0 ? (pagetotal / querynum) : (pagetotal / querynum + 1);for (int i = 0; i《length; i++) {int s = start + (page * pagenum) + (i * querynum);int l = (pagetotal
ꢀ‑ꢀ
(i * querynum))《querynum ? (pagetotal
ꢀ‑ꢀ
(i * querynum)) : querynum;ps.setparameter("start", s);ps.setparameter("limit", l);ps.setparameter("fill_unit_id", unitid);ps.setsortfield("operate_time");ds = ordinarygasbottleservice.queryinfo(ps);
record r = null;for (int index = 0, count = ds.getcount(); index《count; index++) {try {sxssfrow headrow = (sxssfrow) sheet.createrow((i * querynum) + index + 1);//(page * pagenum) +r = ds.getrecord(index);for (int j = 0, size = list.size(); j《size; j++) {sxssfcell headrowcell= (sxssfcell) headrow.createcell(j);任务监听模块3,该模块中通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;所述的任务监听模块3中,通过以下代码实现:public void checkexcel() {string exportcode = (string) getparameter("exportcode");list《hashmap《string,object》》list = gasexportinfoutil.getinstance().getforthreadcode(exportcode);for(int i = 0;i《list.size();i++){if(!"end".equals((string)list.get(i).get("result"))){this.setreturn("result", (string)list.get(i).get("result"));return;}}this.setreturn("result", "end");}excel文件下载模块4,该模块中在所有子线程任务结束后完整的excel文件便保存在本次任务的存储空间内,直接下载excel文件。
25.所述的excel文件下载模块4中,通过以下代码实现:public void uploadexcel() {string filename = (string) getrequest().getparameter("filename");string exportcode = (string) getrequest().getparameter("exportcode");sxssfworkbook wb = gasexportinfoutil.getinstance().getworkbook(exportcode);gasexportinfoutil.getinstance().cleanforthreadcode(exportcode);httpservletresponse response = commandcontext.getresponse();try {response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("excel" + filename + ".xlsx", "utf-8") + ";filename*=utf-8''" + urlencoder.encode("气瓶信息" + filename + ".xlsx", "utf-8"));} catch (unsupportedencodingexception e1) {// todo auto-generated catch block
if (logger.iserrorenabled()) {logger.error("setheader错误!", e1);}throw new businessexception("setheader错误!", e1);}// 设置下载的文件名outputstream outputstream = null;try {outputstream = response.getoutputstream();wb.write(outputstream);} catch (exception e) {if (logger.iserrorenabled()) {logger.error("输出流错误!", e);}throw new businessexception("输出流错误!", e);} finally {if (null != wb) {try {wb.dispose();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("workbook处理错误!", e);}throw new businessexception("workbook处理错误!", e);}}if (null != outputstream) {try {outputstream.close();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("outputstream关闭错误!", e);}throw new businessexception("outputstream关闭错误!", e);}}}}实施例2:如图2所示,本实施例提供的一种快捷导出大量数据至excel文件的方法,包括以
下步骤:步骤s1:创建导出任务的步骤,该步骤根据设定的单任务数据处理量计算任务数量,然后将每个任务对应的数据编号范围传入线程中,启动线程任务;所述的步骤s1中,首先,查询数据总量,根据设定的单任务数据处理量计算任务数量,建立多线程处理任务,同时在内存中建立储存空间用于储存各个任务导出的excel数据以及每个任务运行的状态;然后建立线程,将每个任务对应的数据编号范围传入线程中,启动线程任务。
26.步骤s2:多线程处理的步骤,该步骤中线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;所述的步骤s2中,通过以下代码实现:parameterset ps = new parameterset();dataset ds = null;int pagetotal =(total-(page*pagenum)《pagenum)?(total-(page*pagenum)):pagenum;int length = pagetotal % querynum == 0 ? (pagetotal / querynum) : (pagetotal / querynum + 1);for (int i = 0; i《length; i++) {int s = start + (page * pagenum) + (i * querynum);int l = (pagetotal
ꢀ‑ꢀ
(i * querynum))《querynum ? (pagetotal
ꢀ‑ꢀ
(i * querynum)) : querynum;ps.setparameter("start", s);ps.setparameter("limit", l);ps.setparameter("fill_unit_id", unitid);ps.setsortfield("operate_time");ds = ordinarygasbottleservice.queryinfo(ps);record r = null;for (int index = 0, count = ds.getcount(); index《count; index++) {try {sxssfrow headrow = (sxssfrow) sheet.createrow((i * querynum) + index + 1);//(page * pagenum) +r = ds.getrecord(index);for (int j = 0, size = list.size(); j《size; j++) {sxssfcell headrowcell= (sxssfcell) headrow.createcell(j);步骤s3:任务监听的步骤,该步骤中通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;所述的步骤s3中,通过以下代码实现:public void checkexcel() {string exportcode = (string) getparameter("exportcode");list《hashmap《string,object》》list = gasexportinfoutil.getinstance()
.getforthreadcode(exportcode);for(int i = 0;i《list.size();i++){if(!"end".equals((string)list.get(i).get("result"))){this.setreturn("result", (string)list.get(i).get("result"));return;}}this.setreturn("result", "end");}步骤s4:excel文件下载的步骤,该步骤中在所有子线程任务结束后完整的excel文件便保存在本次任务的存储空间内,直接下载excel文件;所述的步骤s4中,通过以下代码实现:public void uploadexcel() {string filename = (string) getrequest().getparameter("filename");string exportcode = (string) getrequest().getparameter("exportcode");sxssfworkbook wb = gasexportinfoutil.getinstance().getworkbook(exportcode);gasexportinfoutil.getinstance().cleanforthreadcode(exportcode);httpservletresponse response = commandcontext.getresponse();try {response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("excel" + filename + ".xlsx", "utf-8") + ";filename*=utf-8''" + urlencoder.encode("气瓶信息" + filename + ".xlsx", "utf-8"));} catch (unsupportedencodingexception e1) {// todo auto-generated catch blockif (logger.iserrorenabled()) {logger.error("setheader错误!", e1);}throw new businessexception("setheader错误!", e1);}// 设置下载的文件名outputstream outputstream = null;try {outputstream = response.getoutputstream();wb.write(outputstream);} catch (exception e) {if (logger.iserrorenabled()) {logger.error("输出流错误!", e);}throw new businessexception("输出流错误!", e);
} finally {if (null != wb) {try {wb.dispose();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("workbook处理错误!", e);}throw new businessexception("workbook处理错误!", e);}}if (null != outputstream) {try {outputstream.close();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("outputstream关闭错误!", e);}throw new businessexception("outputstream关闭错误!", e);}}}}本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的方法而言,由于其与实施例公开的系统相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
27.专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
28.在本发明所提供的几个实施例中,应该理解到,所揭露的系统、系统和方法,可以通过其它的方式实现。例如,以上所描述的系统实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,系统或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
29.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
30.另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。
31.同理,在本发明各个实施例中的各处理单元可以集成在一个功能模块中,也可以是各个处理单元物理存在,也可以两个或两个以上处理单元集成在一个功能模块中。
32.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
33.最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
34.以上公开的仅为本发明的优选实施方式,但本发明并非局限于此,任何本领域的技术人员能思之的没有创造性的变化,以及在不脱离本发明原理前提下所作的若干改进和润饰,都应落在本发明的保护范围内。

技术特征:
1.一种快捷导出大量数据至excel文件的系统,其特征在于,包括:创建导出任务模块,该模块根据设定的单任务数据处理量计算任务数量,然后将每个任务对应的数据编号范围传入线程中,启动线程任务;多线程处理模块,该模块中线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;任务监听模块,该模块中通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;excel文件下载模块,该模块中在所有子线程任务结束后完整的excel文件便保存在本次任务的存储空间内,直接下载excel文件。2.根据权利要求1所述的一种快捷导出大量数据至excel文件的系统,其特征在于,所述的创建导出任务模块中,首先,查询数据总量,根据设定的单任务数据处理量计算任务数量,建立多线程处理任务,同时在内存中建立储存空间用于储存各个任务导出的excel数据以及每个任务运行的状态;然后建立线程,将每个任务对应的数据编号范围传入线程中,启动线程任务。3.根据权利要求2所述的一种快捷导出大量数据至excel文件的系统,其特征在于,所述的多线程处理模块中,通过以下代码实现:parameterset ps = new parameterset();dataset ds = null;int pagetotal =(total-(page*pagenum)<pagenum)?(total-(page*pagenum)):pagenum;int length = pagetotal % querynum == 0 ? (pagetotal / querynum) : (pagetotal / querynum + 1);for (int i = 0; i < length; i++) {int s = start + (page * pagenum) + (i * querynum);int l = (pagetotal
ꢀ‑ꢀ
(i * querynum)) < querynum ? (pagetotal
ꢀ‑ꢀ
(i * querynum)) : querynum;ps.setparameter("start", s);ps.setparameter("limit", l);ps.setparameter("fill_unit_id", unitid);ps.setsortfield("operate_time");ds = ordinarygasbottleservice.queryinfo(ps);record r = null;for (int index = 0, count = ds.getcount(); index < count; index++) {try {sxssfrow headrow = (sxssfrow) sheet.createrow((i * querynum) + index + 1);//(page * pagenum) +r = ds.getrecord(index);
for (int j = 0, size = list.size(); j < size; j++) {sxssfcell headrowcell= (sxssfcell) headrow.createcell(j)。4.根据权利要求3所述的一种快捷导出大量数据至excel文件的系统,其特征在于,所述的任务监听模块中,通过以下代码实现:public void checkexcel() {string exportcode = (string) getparameter("exportcode");list<hashmap<string,object>> list = gasexportinfoutil.getinstance().getforthreadcode(exportcode);for(int i = 0;i<list.size();i++){if(!"end".equals((string)list.get(i).get("result"))){this.setreturn("result", (string)list.get(i).get("result"));return;}}this.setreturn("result", "end");}。5.根据权利要求4所述的一种快捷导出大量数据至excel文件的系统,其特征在于,所述的excel文件下载模块中,通过以下代码实现:public void uploadexcel() {string filename = (string) getrequest().getparameter("filename");string exportcode = (string) getrequest().getparameter("exportcode");sxssfworkbook wb = gasexportinfoutil.getinstance().getworkbook(exportcode);gasexportinfoutil.getinstance().cleanforthreadcode(exportcode);httpservletresponse response = commandcontext.getresponse();try {response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("excel" + filename + ".xlsx", "utf-8") + ";filename*=utf-8''" + urlencoder.encode("气瓶信息" + filename + ".xlsx", "utf-8"));} catch (unsupportedencodingexception e1) {// todo auto-generated catch blockif (logger.iserrorenabled()) {logger.error("setheader错误!", e1);}throw new businessexception("setheader错误!", e1);}// 设置下载的文件名outputstream outputstream = null;try {outputstream = response.getoutputstream();
wb.write(outputstream);} catch (exception e) {if (logger.iserrorenabled()) {logger.error("输出流错误!", e);}throw new businessexception("输出流错误!", e);} finally {if (null != wb) {try {wb.dispose();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("workbook处理错误!", e);}throw new businessexception("workbook处理错误!", e);}}if (null != outputstream) {try {outputstream.close();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("outputstream关闭错误!", e);}throw new businessexception("outputstream关闭错误!", e);}}}}。6.一种快捷导出大量数据至excel文件的方法,其特征在于,包括以下步骤:步骤s1:创建导出任务的步骤,该步骤根据设定的单任务数据处理量计算任务数量,然后将每个任务对应的数据编号范围传入线程中,启动线程任务;步骤s2:多线程处理的步骤,该步骤中线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;步骤s3:任务监听的步骤,该步骤中通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;步骤s4:excel文件下载的步骤,该步骤中在所有子线程任务结束后完整的excel文件
便保存在本次任务的存储空间内,直接下载excel文件。7.根据权利要求6所述的一种快捷导出大量数据至excel文件的方法,其特征在于,所述的步骤s1中,首先,查询数据总量,根据设定的单任务数据处理量计算任务数量,建立多线程处理任务,同时在内存中建立储存空间用于储存各个任务导出的excel数据以及每个任务运行的状态;然后建立线程,将每个任务对应的数据编号范围传入线程中,启动线程任务。8.根据权利要求7所述的一种快捷导出大量数据至excel文件的方法,其特征在于,所述的步骤s2中,通过以下代码实现:parameterset ps = new parameterset();dataset ds = null;int pagetotal =(total-(page*pagenum)<pagenum)?(total-(page*pagenum)):pagenum;int length = pagetotal % querynum == 0 ? (pagetotal / querynum) : (pagetotal / querynum + 1);for (int i = 0; i < length; i++) {int s = start + (page * pagenum) + (i * querynum);int l = (pagetotal
ꢀ‑ꢀ
(i * querynum)) < querynum ? (pagetotal
ꢀ‑ꢀ
(i * querynum)) : querynum;ps.setparameter("start", s);ps.setparameter("limit", l);ps.setparameter("fill_unit_id", unitid);ps.setsortfield("operate_time");ds = ordinarygasbottleservice.queryinfo(ps);record r = null;for (int index = 0, count = ds.getcount(); index < count; index++) {try {sxssfrow headrow = (sxssfrow) sheet.createrow((i * querynum) + index + 1);//(page * pagenum) +r = ds.getrecord(index);for (int j = 0, size = list.size(); j < size; j++) {sxssfcell headrowcell= (sxssfcell) headrow.createcell(j)。9.根据权利要求8所述的一种快捷导出大量数据至excel文件的方法,其特征在于,所述的步骤s3中,通过以下代码实现:public void checkexcel() {string exportcode = (string) getparameter("exportcode");list<hashmap<string,object>> list = gasexportinfoutil.getinstance().getforthreadcode(exportcode);for(int i = 0;i<list.size();i++){
if(!"end".equals((string)list.get(i).get("result"))){this.setreturn("result", (string)list.get(i).get("result"));return;}}this.setreturn("result", "end");}。10.根据权利要求9所述的一种快捷导出大量数据至excel文件的方法,其特征在于,所述的步骤s4中,通过以下代码实现:public void uploadexcel() {string filename = (string) getrequest().getparameter("filename");string exportcode = (string) getrequest().getparameter("exportcode");sxssfworkbook wb = gasexportinfoutil.getinstance().getworkbook(exportcode);gasexportinfoutil.getinstance().cleanforthreadcode(exportcode);httpservletresponse response = commandcontext.getresponse();try {response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode("excel" + filename + ".xlsx", "utf-8") + ";filename*=utf-8''" + urlencoder.encode("气瓶信息" + filename + ".xlsx", "utf-8"));} catch (unsupportedencodingexception e1) {// todo auto-generated catch blockif (logger.iserrorenabled()) {logger.error("setheader错误!", e1);}throw new businessexception("setheader错误!", e1);}// 设置下载的文件名outputstream outputstream = null;try {outputstream = response.getoutputstream();wb.write(outputstream);} catch (exception e) {if (logger.iserrorenabled()) {logger.error("输出流错误!", e);}throw new businessexception("输出流错误!", e);} finally {if (null != wb) {try {
wb.dispose();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("workbook处理错误!", e);}throw new businessexception("workbook处理错误!", e);}}if (null != outputstream) {try {outputstream.close();} catch (exception e) {if (logger.iserrorenabled()) {logger.error("outputstream关闭错误!", e);}throw new businessexception("outputstream关闭错误!", e);}}}}。

技术总结
本发明涉及一种快捷导出大量数据至excel文件的系统及方法,系统包括:创建导出任务模块,根据设定的单任务数据处理量计算任务数量,将每个任务对应的数据编号范围传入线程中,启动线程任务;多线程处理模块,线程根据各自任务对应的数据范围查询数据,组装生成excel文档数据,将数据存到任务对应的储存空间中,并在任务的开始和结束时,存入任务的运行状态;任务监听模块,通过任务监听接口查询任务的运行状态,如果所有的子任务都结束,则返回任务结束的状态;如果有至少一个子任务还在运行,则返回未结束状态;excel文件下载模块,在所有子线程任务结束后完整的excel文件便保存在本次任务的存储空间内。便保存在本次任务的存储空间内。便保存在本次任务的存储空间内。


技术研发人员:刘翔
受保护的技术使用者:浪潮智慧科技有限公司
技术研发日:2023.06.29
技术公布日:2023/10/7
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐