我用task来分4次执行,然后将20几万数据写到excel中,但是最后excel保存下来只有第一次task循环体执行的7万多的数据,之前的数据未写入到excel

问题描述

publicvoidRenderToExcel(DataTabletable){MemoryStreamms=newMemoryStream();XSSFWorkbookworkbook=newXSSFWorkbook();ISheetsheet=workbook.CreateSheet();inttaliecount=table.Rows.Count;intfpcount=taliecount/4;intyscount=taliecount%4;IRowheaderRow=sheet.CreateRow(0);//handlingheader.foreach(DataColumncolumnintable.Columns){headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);}Action<object>action=(objectobj)=>{try{using(table){for(introwIndex=1;rowIndex<fpcount;rowIndex++){IRowdataRow=sheet.CreateRow(rowIndex);for(intj=0;j<table.Columns.Count;j++){dataRow.CreateCell(j).SetCellValue(table.Rows[rowIndex][j].ToString());}}workbook.Write(ms);}}catch(Exceptionex){throwex;}finally{//ms.Close();}};Action<object>action1=(objectobj)=>{try{using(table){for(introwIndex=fpcount+1;rowIndex<fpcount*2;rowIndex++){IRowdataRow=sheet.CreateRow(rowIndex);for(intj=0;j<table.Columns.Count;j++){dataRow.CreateCell(j).SetCellValue(table.Rows[rowIndex][j].ToString());}}workbook.Write(ms);}}catch(Exceptionex){throwex;}finally{//ms.Close();}};Action<object>action2=(objectobj)=>{try{using(table){for(introwIndex=fpcount*2+1;rowIndex<fpcount*3;rowIndex++){IRowdataRow=sheet.CreateRow(rowIndex);for(intj=0;j<table.Columns.Count;j++){dataRow.CreateCell(j).SetCellValue(table.Rows[rowIndex][j].ToString());}}workbook.Write(ms);}}catch(Exceptionex){throwex;}finally{//ms.Close();}};Action<object>action3=(objectobj)=>{try{using(table){for(introwIndex=fpcount*3+1;rowIndex<fpcount*4+yscount;rowIndex++){IRowdataRow=sheet.CreateRow(rowIndex);for(intj=0;j<table.Columns.Count;j++){dataRow.CreateCell(j).SetCellValue(table.Rows[rowIndex][j].ToString());}}workbook.Write(ms);}}catch(Exceptionex){throwex;}finally{//ms.Close();}};//ConstructanunstartedtaskTaskt1=Task.Factory.StartNew(action,"alpha");t1.Wait();//CosntructastartedtaskTaskt2=Task.Factory.StartNew(action1,"beta1");t2.Wait();Taskt3=Task.Factory.StartNew(action2,"beta2");t3.Wait();Taskt4=Task.Factory.StartNew(action3,"beta3");t4.Wait();Response.AddHeader("Content-Disposition",string.Format("attachment;filename={0}.xlsx",HttpUtility.UrlEncode("1111"+"_"+DateTime.Now.ToString("yyyy-MM-dd"),System.Text.Encoding.UTF8)));Response.BinaryWrite(ms.ToArray());Response.End();workbook=null;ms.Flush();ms.Position=0;ms.Close();ms.Dispose();}

解决方案

解决方案二:
rowIndex感觉问题在这每次task都是从0开始行数据被反复覆盖了
解决方案三:
第一次循环是:for(introwIndex=1;rowIndex<fpcount;rowIndex++)第二次循环是:for(introwIndex=fpcount+1;rowIndex<fpcount*2;rowIndex++)第三次循环是:for(introwIndex=fpcount*2+1;rowIndex<fpcount*3;rowIndex++)第四次循环是:for(introwIndex=fpcount*3+1;rowIndex<fpcount*4+yscount;rowIndex++)
解决方案四:
我的每次rowIndex都是重新赋值的
解决方案五:
我断点调式时候看到第一个后面的for有执行的,但是很奇怪的是ms的大小没有变化。
解决方案六:
但是excel一个sheet只能存65535行
解决方案七:
task变挨个执行了,换个位置吧,虽然和错误无关Taskt1=Task.Factory.StartNew(action,"alpha");Taskt2=Task.Factory.StartNew(action1,"beta1");Taskt3=Task.Factory.StartNew(action2,"beta2");Taskt4=Task.Factory.StartNew(action3,"beta3");t1.Wait();t2.Wait();t3.Wait();t4.Wait();

我没用过POI写过EXCEL,你看下workbook.Write(ms);的ms写入位置是否正确,如果是覆盖就错了
解决方案八:
引用5楼shingoscar的回复:

但是excel一个sheet只能存65535行

2010的Excel列可以达到65535行可以达到int最大值
解决方案九:
引用7楼byronqiji的回复:

Quote: 引用5楼shingoscar的回复:
但是excel一个sheet只能存65535行

2010的Excel列可以达到65535行可以达到int最大值

正解!
解决方案十:
用这种的t1.Wait();t2.Wait();t3.Wait();t4.Wait();顺序执行的时候,我断点之后for循环是穿插执行的,然后for循环要报错。
解决方案十一:
引用9楼u010512158的回复:

用这种的t1.Wait();t2.Wait();t3.Wait();t4.Wait();顺序执行的时候,我断点之后for循环是穿插执行的,然后for循环要报错。

我看你用task以为你是要多任务一起做,你还是关注下workbook.Write(ms);,如果看不出错,你可以先输出到文本看下

时间: 2024-11-18 09:37:58

我用task来分4次执行,然后将20几万数据写到excel中,但是最后excel保存下来只有第一次task循环体执行的7万多的数据,之前的数据未写入到excel的相关文章

mysql-qt 多线程接收下位机数据写进MySQL中。

问题描述 qt 多线程接收下位机数据写进MySQL中. qt 多线程接收下位机数据写进MySQL中.上位机是一个多线程的服务端,想接收多个客户端(下位机)发来的数据(每个下位机大致有50MB的数据).网络环境是局域网.问题1,大数据在tcpsocket上怎么发送,接收.问题2,如何多线程的写进MySQL中.问题3,传输和读写的速度需要越快越好,有大咖说这样的话可以使用索引+写硬盘.没见过呀. 希望大咖们百忙中指教哈. 解决方案 你没有说清楚多少时间内50M,有几个下位机.就你的需求,建议不要用数

java程序转换excel中科学记数法的数据为date类型

今天出于某些原因从mongodb数据库中导出了一些数据,为了更直观的发送给其他人查阅,便使用mongoVUE的导出为excel功能. 但是导出后出现了一个问题,里边有一列存储时间的,存储的是long型毫秒数,在导出后就自动变成了科学记数法. 且不说从科学记数法中辨别出实际时间,即便是原本的毫秒值也是不易于辨别的,但是这些long值不能直接在excel中转换成date类型,因此我便想到使用poi来把这些毫秒值转换成date再写入原文件中. 从mongodb中导出的excel的科学记数法如下图: j

Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

知识点: 1.使用SQL Helper创建数据库            2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识:                  上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中.相信大家对数据库都不陌生.对于                             大量重复的,有特定结构的             数据的保存,用 SQL数据库 来保存是最理想不过了.             下面将用一个关于联系人的数

excel数据 excel加法-EXCEL中关于引用的问题

问题描述 EXCEL中关于引用的问题 求大神给看下,题目要求:利用右边表给的数据用函数求出左边表的基本工资,如图 解决方案 http://zhidao.baidu.com/link?url=m8wwnQiuZllRpRcQxbQEk4nMyuFsYpyHbIpLNLjO7o9MxD3xOeDpr9P8OOKJ1MsHwdzh8G3ukmvEpj8d4RUNGf-L4dHcUix_IcxCnc4wbpC 解决方案二: Excel 的问题

Android学习笔记-保存数据到SQL数据库中(Saving Data in SQL Databases)_Android

知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了android保存文件,今天学习的是保存数据到SQL数据库中.相信大家对数据库都不陌生.对于大量重复的,有特定结构的数据的保存,用 SQL数据库 来保存是最理想不过了. 下面将用一个关于联系人的数据库Demo来具体学习. 具体知识: 1.定义Contract类 在创建SQL数据库之前,要创建Contract类.那什么是Contract类呢? 复

Android学习笔记-保存数据到SQL数据库中(Saving Data in SQL Databases)

知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了android保存文件,今天学习的是保存数据到SQL数据库中.相信大家对数据库都不陌生.对于大量重复的,有特定结构的数据的保存,用 SQL数据库 来保存是最理想不过了. 下面将用一个关于联系人的数据库Demo来具体学习. 具体知识: 1.定义Contract类 在创建SQL数据库之前,要创建Contract类.那什么是Contract类呢? 复

vb.net 开发 web程序,客户端上传excel,后台将excel中数据写入oracle

问题描述 先用FileUpload.SaveAs方法将文件保存在服务器的一个文件夹下在用OleDbDataAdapter.Fill方法将excel读入到dataset最后循环dataset将数据写入oracle在我本地运行还没有问题放到服务器上后用别的机器访问就出错了,走到fill方法时提示未定义的错误部分代码如下:If(FileUpload.HasFile)ThenTryFileUpload.SaveAs(Server.MapPath("upload")+"\cp"

java解析wenjia-操作csv文件操作里边的数据 最后写入excel中

问题描述 操作csv文件操作里边的数据 最后写入excel中 文件是这样的 第一行是列名 ,第二行是对应的数据(11对应),要求是把每一列的数据求和 最后存入excel中,有没有例子啊 解决方案 解决方案二: excel本身支持csv 所以你可以还是保持csv文件

hql语句执行后返回了list&amp;amp;lt;object&amp;amp;gt;集合,如何添加新的数据到list集合中呢

问题描述 hql语句执行后返回了list<object>集合,如何添加新的数据到list集合中呢 如题,我执行了一个hql语句, StringBuffer hql1 = new StringBuffer("select information from Information information where 1=1 "); 我将返回的list放入如下的inlist中 inlist=courseService.CourseExtractInformation(user.g