问题描述
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);,如果看不出错,你可以先输出到文本看下