C# winform DevExpress GridControl 大批量数据(9万行+4百列)导出Excel报错,内存溢出,怎么办

ZhangBigBoss 2020-01-08 04:38:33
我导出excel的代码如下:

执行小批量的(几十条)没问题,但是这次突然遇到大批量数据(9万行+4百列),我导出的是Xlsx格式,导数据过程中会出现内存溢出,怎么办,求大佬指教
...全文
1350 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
圣殿骑士18 2020-01-11
  • 打赏
  • 举报
回复
大概率是devexpress的问题。你的grid control竟然能加载几百万行而不崩溃,我也服了你了。我以前用gridcontrol,里边有个列有图片,几百行导出就崩溃。

所以我觉得问题在于devexpress本身性能差导致的。你用NPIO或者Apose这种第三方的Excel组件导出,应该OK。
黑不 2020-01-11
  • 打赏
  • 举报
回复
有没有那种可以导进SQL,然后再选择性导出
it_gz_xi 2020-01-10
  • 打赏
  • 举报
回复
以前的Excel记得只有256列,现在的不知道了。这么多数据就算导出了也会很卡的。建议换一种格式,或分成几个Excel
xian_wwq 2020-01-10
  • 打赏
  • 举报
回复
直接导出为csv,看是否会溢出 如果生成文件有格式需求, 可以通过csv分批处理
正怒月神 2020-01-09
  • 打赏
  • 举报
回复
引用 14 楼 subzero 的回复:
把下面的xml内存保存成一个.xml的文件,使用excel打开,文件有3列两行,有格式颜色,供你参考。
20years的,第一次看到,哈哈哈
subzero 2020-01-09
  • 打赏
  • 举报
回复
把下面的xml内存保存成一个.xml的文件,使用excel打开,文件有3列两行,有格式颜色,供你参考。 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Subzero</Author> <LastAuthor>Subzero</LastAuthor> <Created>2020-01-09T03:26:16Z</Created> <LastSaved>2020-01-09T03:28:54Z</LastSaved> <Version>16.00</Version> </DocumentProperties> <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> <AllowPNG/> </OfficeDocumentSettings> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>8208</WindowHeight> <WindowWidth>23040</WindowWidth> <WindowTopX>0</WindowTopX> <WindowTopY>0</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Center"/> <Borders/> <Font ss:FontName="等线" x:CharSet="134" ss:Size="11" ss:Color="#000000"/> <Interior/> <NumberFormat/> <Protection/> </Style> <Style ss:ID="s63"> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> </Style> <Style ss:ID="s64"> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> <NumberFormat ss:Format="General Date"/> </Style> <Style ss:ID="s68"> <Borders> <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> </Borders> <Interior ss:Color="#A6A6A6" ss:Pattern="Solid"/> </Style> </Styles> <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="2" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="13.8"> <Column ss:AutoFitWidth="0" ss:Width="79.2"/> <Column ss:AutoFitWidth="0" ss:Width="93.600000000000009"/> <Column ss:AutoFitWidth="0" ss:Width="78.599999999999994"/> <Row> <Cell ss:StyleID="s68"><Data ss:Type="String">单号</Data></Cell> <Cell ss:StyleID="s68"><Data ss:Type="String">时间</Data></Cell> <Cell ss:StyleID="s68"><Data ss:Type="String">创建人</Data></Cell> </Row> <Row> <Cell ss:StyleID="s63"><Data ss:Type="Number">1234567890</Data></Cell> <Cell ss:StyleID="s64"><Data ss:Type="DateTime">2020-01-09T12:26:01.000</Data></Cell> <Cell ss:StyleID="s63"><Data ss:Type="String">ZhangBigBoss</Data></Cell> </Row> </Table> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <PageSetup> <Header x:Margin="0.3"/> <Footer x:Margin="0.3"/> <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/> </PageSetup> <Print> <ValidPrinterInfo/> <HorizontalResolution>600</HorizontalResolution> <VerticalResolution>600</VerticalResolution> </Print> <Selected/> <Panes> <Pane> <Number>3</Number> <ActiveRow>3</ActiveRow> <ActiveCol>1</ActiveCol> </Pane> </Panes> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> </Workbook>
大然然 2020-01-09
  • 打赏
  • 举报
回复
excel是给人看的,但是9万行400列,叫人怎么看呢?先不说看,就是双击打开估计都要卡死
by_封爱 版主 2020-01-09
  • 打赏
  • 举报
回复
先不谈xml或者xls或者是xlsx. 你先把这些数据 导到txt里 你看下 是否报错? 如果这不就无法通过 那后面也不用测了 基本上也都不好使. 然后呢 在针对xls做操作..而不管创建读写xls(x) 或者是打开插入 基本都差不多.这个自带的方式不可以 就试试其他的解决方案. 比如npoi或者myxls这些常用的组件 在试一试.
ZhangBigBoss 2020-01-09
  • 打赏
  • 举报
回复
引用 10 楼 llllinlink 的回复:
[quote=引用 9 楼 llllinlink 的回复:]
5l不是说了嘛,先导出成xml,你先试试看呀。
不行的话,可以试试先生成一个模板excel,然后分批往里填数据吧
当然只是一个思路,试了才知道行不行得通


想了一下后面那个思路行不通的,最后还是要把完整的excel读在内存里。。。
所以我觉得还是5l的方法靠谱[/quote]
我原来想的就是分批,1W行1W行的搞,每导出1W行就清理一下内存,我试了一下,还是内存溢出,心态蹦了呀,xml不会弄,有大神可以贴一下代码吗
七夜龘 2020-01-09
  • 打赏
  • 举报
回复
看不懂...
llllinlink 2020-01-09
  • 打赏
  • 举报
回复
引用 9 楼 llllinlink 的回复:
5l不是说了嘛,先导出成xml,你先试试看呀。 不行的话,可以试试先生成一个模板excel,然后分批往里填数据吧 当然只是一个思路,试了才知道行不行得通
想了一下后面那个思路行不通的,最后还是要把完整的excel读在内存里。。。 所以我觉得还是5l的方法靠谱
llllinlink 2020-01-09
  • 打赏
  • 举报
回复
5l不是说了嘛,先导出成xml,你先试试看呀。 不行的话,可以试试先生成一个模板excel,然后分批往里填数据吧 当然只是一个思路,试了才知道行不行得通
ZhangBigBoss 2020-01-09
  • 打赏
  • 举报
回复
引用 7 楼 huakai2418 的回复:
内存问题咋整呢?gridcontrol又没有给你提供省内存的方式。
你试试增大内存,在64位机器上找一个32G及其以上内存的电脑试下,看看应用程序可以达到多大内存,如果占用内存没有超过10G就溢出的话,应该就是Dev实现的功能问题了

可以通过代码优化内存回收吗,现在脑袋疼,想不出改怎么搞
huakai2418 2020-01-09
  • 打赏
  • 举报
回复
内存问题咋整呢?gridcontrol又没有给你提供省内存的方式。
你试试增大内存,在64位机器上找一个32G及其以上内存的电脑试下,看看应用程序可以达到多大内存,如果占用内存没有超过10G就溢出的话,应该就是Dev实现的功能问题了
ZhangBigBoss 2020-01-09
  • 打赏
  • 举报
回复
引用 5 楼 subzero 的回复:
这么大批量的数据导出,可以考虑直接输出文本文件
1,CSV,只是没有任何控制功能
2,以xml为载体的xlsx文件,具体文件规范可以搜索,应该O13就开始支持了(可以随便找一个excel文件另存为xml格式,然后以文本编辑器打开参考格式)

O2007之后就支持Excel超百万行了,没问题的,无非就是打开速度慢一些。
我的项目导入导出最多到过150W行记录,当然没这么多列,几十列而已。

现在的excel应该是支持的,但是因为数据量太大,导着导着,内存溢出了,怎么办
如果内存不溢出,理论上应该是可以导出来,不过时间会久一点,关键就是这个内存溢出咋搞
HerryDong 2020-01-09
  • 打赏
  • 举报
回复
引用 18 楼 ZhangBigBoss 的回复:
[quote=引用 16 楼 HerryDong 的回复:] 个人觉得这个需求有问题,就好比在下拉框里加200个下拉选项让用户选择,能不能加是一回事,用起来方不方便又是另一回事
这个数据主要是交给计算机统计的,人很少看,懂吧[/quote]那只能换个思路,自己写导出的方法了。出现内存溢出的情况,很有可能是因为gridcontrol.ExportXlsx方法内部先把表格数据保存到一个临时的数据集合里,然后再写入到xlsx文件。还有就是你的内存是否足够。你可以试试遍历gridcontrol每一行数据,然后用NPOI写导入方法
ZhangBigBoss 2020-01-09
  • 打赏
  • 举报
回复
引用 16 楼 HerryDong 的回复:
个人觉得这个需求有问题,就好比在下拉框里加200个下拉选项让用户选择,能不能加是一回事,用起来方不方便又是另一回事

这个数据主要是交给计算机统计的,人很少看,懂吧
yuqiz1981 2020-01-09
  • 打赏
  • 举报
回复
可以考虑分批生成多个文件,每1万行一个文件
HerryDong 2020-01-09
  • 打赏
  • 举报
回复
个人觉得这个需求有问题,就好比在下拉框里加200个下拉选项让用户选择,能不能加是一回事,用起来方不方便又是另一回事
subzero 2020-01-08
  • 打赏
  • 举报
回复
这么大批量的数据导出,可以考虑直接输出文本文件 1,CSV,只是没有任何控制功能 2,以xml为载体的xlsx文件,具体文件规范可以搜索,应该O13就开始支持了(可以随便找一个excel文件另存为xml格式,然后以文本编辑器打开参考格式) O2007之后就支持Excel超百万行了,没问题的,无非就是打开速度慢一些。 我的项目导入导出最多到过150W行记录,当然没这么多列,几十列而已。
加载更多回复(4)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧